From ecefc53a20d8a501d477f68cc1e87f41403cb261 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 28 Dec 2025 06:16:21 +0800 Subject: [PATCH 01/79] =?UTF-8?q?refactor:=20=E9=83=A8=E5=88=86=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/kernel/repomgr/__init__.py | 1 + src/heurams/kernel/repomgr/lict.py | 95 +++++++++++++++++++++ src/heurams/kernel/repomgr/navigator.py | 0 src/heurams/kernel/repomgr/repo.py | 107 ++++++++++++++++++++++++ src/heurams/kernel/repomgr/syncdict.py | 8 ++ 5 files changed, 211 insertions(+) create mode 100644 src/heurams/kernel/repomgr/__init__.py create mode 100644 src/heurams/kernel/repomgr/lict.py create mode 100644 src/heurams/kernel/repomgr/navigator.py create mode 100644 src/heurams/kernel/repomgr/repo.py create mode 100644 src/heurams/kernel/repomgr/syncdict.py diff --git a/src/heurams/kernel/repomgr/__init__.py b/src/heurams/kernel/repomgr/__init__.py new file mode 100644 index 0000000..7ecd655 --- /dev/null +++ b/src/heurams/kernel/repomgr/__init__.py @@ -0,0 +1 @@ +from .repo import * diff --git a/src/heurams/kernel/repomgr/lict.py b/src/heurams/kernel/repomgr/lict.py new file mode 100644 index 0000000..efd436a --- /dev/null +++ b/src/heurams/kernel/repomgr/lict.py @@ -0,0 +1,95 @@ + +from collections import UserList +from typing import Any + +class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) + """"列典" 对象 + 同时兼容字典和列表大多数 API, 两边数据同步的容器 + 列表数据是 dictobj.items() 的格式 + 支持根据字典或列表初始化 + 限制要求: + - 键名一定唯一, 且仅能为字符串 + - 值一定是引用对象 + - 不使用并发 + - 不在乎列表顺序语义和列表索引查找, 因此 sort, index 等功能不可用 + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + """ + def __init__(self, initlist = None, initdict = None): + self.dicted_data = {} + if initdict != None: + initlist = list(initdict.items()) + super().__init__(initlist=initlist) + self._sync_based_on_list() + + def _sync_based_on_dict(self): + self.data = list(self.dicted_data.items()) + + def _sync_based_on_list(self): + self.dicted_data = {} + for i in self.data: + self.dicted_data[i[0]] = i[1] + + def __getitem__(self, i): + if isinstance(i, str): + return self.dicted_data[i] + else: + return super().__getitem__(i) + + def __setitem__(self, i, item): + if isinstance(i, str): + self.dicted_data[i] = item + self._sync_based_on_dict() + else: + if item != (item[0], item[1]): + raise NotImplementedError + super().__setitem__(i, item) + self._sync_based_on_list() + + def __delitem__(self, i): + if isinstance(i, str): + del self.dicted_data[i] + self._sync_based_on_dict() + else: + super().__delitem__(i) + self._sync_based_on_list() + + def append(self, item: Any) -> None: + if item != (item[0], item[1]): + raise NotImplementedError + super().append(item) + self._sync_based_on_list() + + def insert(self, i: int, item: Any) -> None: + if item != (item[0], item[1]): + raise NotImplementedError + super().insert(i, item) + self._sync_based_on_list() + + def pop(self, i: int = -1) -> Any: + super().pop(i) + self._sync_based_on_list() + + def remove(self, item: Any) -> None: + if isinstance(item, str): + item = (item, self.dicted_data[item]) + if item != (item[0], item[1]): + raise NotImplementedError + super().remove(item) + self._sync_based_on_list() + + def clear(self) -> None: + super().clear() + self._sync_based_on_list() + + def index(self): + raise NotImplementedError + + def extend(self): + raise NotImplementedError + + def sort(self): + raise NotImplementedError + + def reverse(self): + raise NotImplementedError + \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/navigator.py b/src/heurams/kernel/repomgr/navigator.py new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py new file mode 100644 index 0000000..4e5771c --- /dev/null +++ b/src/heurams/kernel/repomgr/repo.py @@ -0,0 +1,107 @@ +from pathlib import Path +import heurams.kernel.particles as pt +import toml +import json +from .lict import Lict +class Repo(): + file_mapping = { + "orbital": "orbital.toml", + "payload": "payload.toml", + "algodata": "algodata.json", + "manifest": "manifest.toml", + "formation": "formation.toml", + } + + default_save_list = ["algodata"] + + def __init__(self, orbital, payload, manifest, formation, algodata, source = None) -> None: + self.orbital: pt.Orbital = orbital + self.payload: dict = payload + self.manifest: dict = manifest + self.formation: dict = formation + self.algodata: dict = algodata + self.source: Path | None = source # 若存在, 指向 repo 所在 dir + self.database = { + "orbital": self.orbital, + "payload": self.payload, + "manifest": self.manifest, + "formation": self.formation, + "algodata": self.algodata, + "source": self.source, + } + self.particles = dict() + + def __len__(self): + return len(self.payload) + + def persist_to_repodir(self, save_list: list | None = None, source: Path | None= None): + if save_list == None: + save_list = self.default_save_list + if self.source != None and source == None: + source = self.source + if source == None: + raise FileNotFoundError("不存在仓库到文件的映射") + for keyname in save_list: + filename = self.file_mapping[keyname] + with open(source / filename, 'w') as f: + if filename.endswith("toml"): + toml.dump(self.database[keyname], f) + elif filename.endswith("json"): + json.dump(self.database[keyname], f) + else: + raise ValueError(f"不支持的文件类型: {filename}") + + def export_to_single_dict(self): + return self.database + + @classmethod + def create_new_repo(cls, source = None): + default_database = { + "orbital": {"puzzles": {}, "schedule": {}}, + "payload": {}, + "algodata": {}, + "manifest": {}, + "formation": {"annotation": {}, "unified": {}}, + "source": source + } + return Repo(**default_database) + + @classmethod + def create_from_repodir(cls, source: Path): + database = {} + for keyname, filename in cls.file_mapping.items(): + with open(source / filename, "r") as f: + if filename.endswith("toml"): + database[keyname] = toml.load(f) + elif filename.endswith("json"): + database[keyname] = json.load(f) + else: + raise ValueError(f"不支持的文件类型: {filename}") + database["source"] = source + return Repo(**database) + + @classmethod + def create_from_single_dict(cls, dictdata, source: Path | None = None): + database = dictdata + database["source"] = source + return Repo(**database) + + @classmethod + def check_repodir(cls, source: Path): + try: + cls.create_from_repodir(source) + return 1 + except: + return 0 + + def _load(self): + pass + + def _load_nucleons(self): + self.particles["nucleons"] = Lict(initdict = self.payload) + self.particles["electrons"] = Lict(initdict = self.algodata) + + mtx["list"] = + for ident, payload in self.payload: + res.append() + diff --git a/src/heurams/kernel/repomgr/syncdict.py b/src/heurams/kernel/repomgr/syncdict.py new file mode 100644 index 0000000..c06259d --- /dev/null +++ b/src/heurams/kernel/repomgr/syncdict.py @@ -0,0 +1,8 @@ +from typing import Any, Iterable, TypedDict +from typing_extensions import Self +from .lict import Lict + +class ParticalsContainer(TypedDict): + nucleons: Lict + electrons: Lict + atoms: Lict \ No newline at end of file From 8828db24b5df0a487c5cfd20423cc2a23506afa9 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 29 Dec 2025 21:53:20 +0800 Subject: [PATCH 02/79] =?UTF-8?q?feat:=20=E4=B8=80=E4=BA=9B=E6=94=B9?= =?UTF-8?q?=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/kernel/repomgr/lict.py | 31 ++- src/heurams/kernel/repomgr/navi.py | 3 + src/heurams/kernel/repomgr/navigator.py | 0 src/heurams/kernel/repomgr/refvar.py | 241 ++++++++++++++++++++++++ src/heurams/kernel/repomgr/repo.py | 52 ++--- src/heurams/kernel/repomgr/syncdict.py | 8 - 6 files changed, 300 insertions(+), 35 deletions(-) create mode 100644 src/heurams/kernel/repomgr/navi.py delete mode 100644 src/heurams/kernel/repomgr/navigator.py create mode 100644 src/heurams/kernel/repomgr/refvar.py delete mode 100644 src/heurams/kernel/repomgr/syncdict.py diff --git a/src/heurams/kernel/repomgr/lict.py b/src/heurams/kernel/repomgr/lict.py index efd436a..ad4f587 100644 --- a/src/heurams/kernel/repomgr/lict.py +++ b/src/heurams/kernel/repomgr/lict.py @@ -11,7 +11,7 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) - 键名一定唯一, 且仅能为字符串 - 值一定是引用对象 - 不使用并发 - - 不在乎列表顺序语义和列表索引查找, 因此 sort, index 等功能不可用 + - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 """ def __init__(self, initlist = None, initdict = None): @@ -20,9 +20,11 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) initlist = list(initdict.items()) super().__init__(initlist=initlist) self._sync_based_on_list() + self.data.sort() def _sync_based_on_dict(self): self.data = list(self.dicted_data.items()) + self.data.sort() def _sync_based_on_list(self): self.dicted_data = {} @@ -52,7 +54,10 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) else: super().__delitem__(i) self._sync_based_on_list() - + + def __contains__(self, item): + return (item in self.data or item in self.keys() or item in self.values()) + def append(self, item: Any) -> None: if item != (item[0], item[1]): raise NotImplementedError @@ -60,14 +65,15 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) self._sync_based_on_list() def insert(self, i: int, item: Any) -> None: - if item != (item[0], item[1]): + if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 raise NotImplementedError super().insert(i, item) self._sync_based_on_list() def pop(self, i: int = -1) -> Any: - super().pop(i) + res = super().pop(i) self._sync_based_on_list() + return res def remove(self, item: Any) -> None: if isinstance(item, str): @@ -92,4 +98,19 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) def reverse(self): raise NotImplementedError - \ No newline at end of file + + def keys(self): + return self.dicted_data.keys() + + def values(self): + return self.dicted_data.values() + + def items(self): + return self.data + + def keys_equal_with(self, other): + return self.key_equality(self, other) + + @classmethod + def key_equality(cls, a, b): + return a.keys() == b.keys() \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/navi.py b/src/heurams/kernel/repomgr/navi.py new file mode 100644 index 0000000..46679c8 --- /dev/null +++ b/src/heurams/kernel/repomgr/navi.py @@ -0,0 +1,3 @@ +class Navi(): + def __init__(self, init) -> None: + pass \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/navigator.py b/src/heurams/kernel/repomgr/navigator.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/kernel/repomgr/refvar.py b/src/heurams/kernel/repomgr/refvar.py new file mode 100644 index 0000000..939d22c --- /dev/null +++ b/src/heurams/kernel/repomgr/refvar.py @@ -0,0 +1,241 @@ +class RefVar: + def __init__(self, initvalue) -> None: + self.data = initvalue + + def __repr__(self) -> str: + return f"RefVar({repr(self.data)})" + + def __str__(self) -> str: + return str(self.data) + + def __add__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data + other.data) + return RefVar(self.data + other) + + def __radd__(self, other): + return RefVar(other + self.data) + + def __sub__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data - other.data) + return RefVar(self.data - other) + + def __rsub__(self, other): + return RefVar(other - self.data) + + def __mul__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data * other.data) + return RefVar(self.data * other) + + def __rmul__(self, other): + return RefVar(other * self.data) + + def __truediv__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data / other.data) + return RefVar(self.data / other) + + def __rtruediv__(self, other): + return RefVar(other / self.data) + + def __floordiv__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data // other.data) + return RefVar(self.data // other) + + def __rfloordiv__(self, other): + return RefVar(other // self.data) + + def __mod__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data % other.data) + return RefVar(self.data % other) + + def __rmod__(self, other): + return RefVar(other % self.data) + + def __pow__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data ** other.data) + return RefVar(self.data ** other) + + def __rpow__(self, other): + return RefVar(other ** self.data) + + def __neg__(self): + return RefVar(-self.data) + + def __pos__(self): + return RefVar(+self.data) + + def __abs__(self): + return RefVar(abs(self.data)) + + def __eq__(self, other): + if isinstance(other, RefVar): + return self.data == other.data + return self.data == other + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + if isinstance(other, RefVar): + return self.data < other.data + return self.data < other + + def __le__(self, other): + if isinstance(other, RefVar): + return self.data <= other.data + return self.data <= other + + def __gt__(self, other): + if isinstance(other, RefVar): + return self.data > other.data + return self.data > other + + def __ge__(self, other): + if isinstance(other, RefVar): + return self.data >= other.data + return self.data >= other + + # 位运算 + def __and__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data & other.data) + return RefVar(self.data & other) + + def __rand__(self, other): + return RefVar(other & self.data) + + def __or__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data | other.data) + return RefVar(self.data | other) + + def __ror__(self, other): + return RefVar(other | self.data) + + def __xor__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data ^ other.data) + return RefVar(self.data ^ other) + + def __rxor__(self, other): + return RefVar(other ^ self.data) + + def __lshift__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data << other.data) + return RefVar(self.data << other) + + def __rlshift__(self, other): + return RefVar(other << self.data) + + def __rshift__(self, other): + if isinstance(other, RefVar): + return RefVar(self.data >> other.data) + return RefVar(self.data >> other) + + def __rrshift__(self, other): + return RefVar(other >> self.data) + + def __invert__(self): + return RefVar(~self.data) + + # 类型转换 + def __int__(self): + return int(self.data) + + def __float__(self): + return float(self.data) + + def __bool__(self): + return bool(self.data) + + def __complex__(self): + return complex(self.data) + + def __bytes__(self): + return bytes(self.data) + + def __hash__(self): + return hash(self.data) + + # 容器操作(如果底层数据支持) + def __len__(self): + return len(self.data) + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __delitem__(self, key): + del self.data[key] + + def __contains__(self, item): + return item in self.data + + def __iter__(self): + return iter(self.data) + + def __iadd__(self, other): + if isinstance(other, RefVar): + self.data += other.data + else: + self.data += other + return self + + def __isub__(self, other): + if isinstance(other, RefVar): + self.data -= other.data + else: + self.data -= other + return self + + def __imul__(self, other): + if isinstance(other, RefVar): + self.data *= other.data + else: + self.data *= other + return self + + def __itruediv__(self, other): + if isinstance(other, RefVar): + self.data /= other.data + else: + self.data /= other + return self + + def __ifloordiv__(self, other): + if isinstance(other, RefVar): + self.data //= other.data + else: + self.data //= other + return self + + def __imod__(self, other): + if isinstance(other, RefVar): + self.data %= other.data + else: + self.data %= other + return self + + def __ipow__(self, other): + if isinstance(other, RefVar): + self.data **= other.data + else: + self.data **= other + return self + + def __call__(self, *args, **kwargs): + if callable(self.data): + return self.data(*args, **kwargs) + raise TypeError(f"'{type(self.data).__name__}' object is not callable") + + def __getattr__(self, name): + return getattr(self.data, name) \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py index 4e5771c..b48d6e3 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repomgr/repo.py @@ -3,6 +3,8 @@ import heurams.kernel.particles as pt import toml import json from .lict import Lict +from .refvar import RefVar + class Repo(): file_mapping = { "orbital": "orbital.toml", @@ -12,14 +14,22 @@ class Repo(): "formation": "formation.toml", } + type_mapping = { + "orbital": "dict", + "payload": "lict", + "algodata": "lict", + "manifest": "dict", + "formation": "dict", + } + default_save_list = ["algodata"] def __init__(self, orbital, payload, manifest, formation, algodata, source = None) -> None: self.orbital: pt.Orbital = orbital - self.payload: dict = payload + self.payload: Lict = payload self.manifest: dict = manifest self.formation: dict = formation - self.algodata: dict = algodata + self.algodata: Lict = algodata self.source: Path | None = source # 若存在, 指向 repo 所在 dir self.database = { "orbital": self.orbital, @@ -29,7 +39,6 @@ class Repo(): "algodata": self.algodata, "source": self.source, } - self.particles = dict() def __len__(self): return len(self.payload) @@ -44,10 +53,14 @@ class Repo(): for keyname in save_list: filename = self.file_mapping[keyname] with open(source / filename, 'w') as f: + try: + dict_data = self.database[keyname].dicted_data + except: + dict_data = dict(self.database[keyname]) if filename.endswith("toml"): - toml.dump(self.database[keyname], f) + toml.dump(dict_data, f) elif filename.endswith("json"): - json.dump(self.database[keyname], f) + json.dump(dict_data, f) else: raise ValueError(f"不支持的文件类型: {filename}") @@ -58,8 +71,8 @@ class Repo(): def create_new_repo(cls, source = None): default_database = { "orbital": {"puzzles": {}, "schedule": {}}, - "payload": {}, - "algodata": {}, + "payload": [], + "algodata": [], "manifest": {}, "formation": {"annotation": {}, "unified": {}}, "source": source @@ -71,12 +84,19 @@ class Repo(): database = {} for keyname, filename in cls.file_mapping.items(): with open(source / filename, "r") as f: + loaded: dict if filename.endswith("toml"): - database[keyname] = toml.load(f) + loaded = toml.load(f) elif filename.endswith("json"): - database[keyname] = json.load(f) + loaded = json.load(f) else: raise ValueError(f"不支持的文件类型: {filename}") + if cls.type_mapping[keyname] == "lict": + database[keyname] = Lict(loaded.items()) + elif cls.type_mapping[keyname] == "dict": + database[keyname] = loaded + else: + raise ValueError(f"不支持的数据容器: {cls.type_mapping[keyname]}") database["source"] = source return Repo(**database) @@ -92,16 +112,4 @@ class Repo(): cls.create_from_repodir(source) return 1 except: - return 0 - - def _load(self): - pass - - def _load_nucleons(self): - self.particles["nucleons"] = Lict(initdict = self.payload) - self.particles["electrons"] = Lict(initdict = self.algodata) - - mtx["list"] = - for ident, payload in self.payload: - res.append() - + return 0 \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/syncdict.py b/src/heurams/kernel/repomgr/syncdict.py deleted file mode 100644 index c06259d..0000000 --- a/src/heurams/kernel/repomgr/syncdict.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import Any, Iterable, TypedDict -from typing_extensions import Self -from .lict import Lict - -class ParticalsContainer(TypedDict): - nucleons: Lict - electrons: Lict - atoms: Lict \ No newline at end of file From 8358e2532abf1af1293469fe198882b6b4d24110 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 31 Dec 2025 00:57:07 +0800 Subject: [PATCH 03/79] =?UTF-8?q?feat:=20=E8=BF=9B=E4=B8=80=E6=AD=A5?= =?UTF-8?q?=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {config => data/config}/config.toml | 12 +- data/repo/test/algodata.json | 1 + data/repo/test/manifest.toml | 3 + data/repo/test/payload.toml | 17 +++ data/repo/test/schedule.toml | 3 + data/repo/test/typedef.toml | 19 +++ data/template/blank.toml | 23 ---- pyproject.toml | 2 +- src/heurams/default/config/config.toml | 61 ---------- src/heurams/interface/screens/dashboard.py | 2 +- src/heurams/interface/screens/memorizor.py | 2 +- src/heurams/interface/shim.py | 2 +- src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/kernel/algorithms/__init__.py | 5 +- src/heurams/kernel/algorithms/base.py | 12 +- src/heurams/kernel/algorithms/sm2.py | 2 +- .../{puzzles => evaluators}/__init__.py | 12 +- .../kernel/{puzzles => evaluators}/base.py | 2 +- .../kernel/{puzzles => evaluators}/cloze.py | 4 +- src/heurams/kernel/evaluators/guess.py | 11 ++ .../kernel/{puzzles => evaluators}/mcq.py | 4 +- .../{puzzles => evaluators}/recognition.py | 4 +- src/heurams/kernel/particles/__init__.py | 29 ----- src/heurams/kernel/particles/atom.py | 99 ++++------------ src/heurams/kernel/particles/electron.py | 111 +++++------------- src/heurams/kernel/particles/loader.py | 74 ------------ src/heurams/kernel/particles/nucleon.py | 74 ++++++------ src/heurams/kernel/particles/orbital.py | 30 ----- src/heurams/kernel/particles/probe.py | 62 ---------- src/heurams/kernel/reactor/fission.py | 2 +- src/heurams/kernel/repomgr/aux.py | 5 + src/heurams/kernel/repomgr/repo.py | 42 ++++--- src/heurams/services/version.py | 4 +- src/heurams/utils/README.md | 2 - src/heurams/utils/__init__.py | 0 src/heurams/utils/evalizor.py | 28 +++++ src/heurams/{kernel/repomgr => utils}/lict.py | 0 tests/kernel/algorithms/test_sm2.py | 2 +- tests/kernel/particles/test_electron.py | 2 +- tests/kernel/puzzles/test_base.py | 2 +- tests/kernel/puzzles/test_cloze.py | 2 +- tests/kernel/puzzles/test_mcq.py | 2 +- 43 files changed, 251 insertions(+), 528 deletions(-) rename {config => data/config}/config.toml (90%) create mode 100644 data/repo/test/algodata.json create mode 100644 data/repo/test/manifest.toml create mode 100644 data/repo/test/payload.toml create mode 100644 data/repo/test/schedule.toml create mode 100644 data/repo/test/typedef.toml delete mode 100644 data/template/blank.toml delete mode 100644 src/heurams/default/config/config.toml rename src/heurams/kernel/{puzzles => evaluators}/__init__.py (82%) rename src/heurams/kernel/{puzzles => evaluators}/base.py (95%) rename src/heurams/kernel/{puzzles => evaluators}/cloze.py (97%) create mode 100644 src/heurams/kernel/evaluators/guess.py rename src/heurams/kernel/{puzzles => evaluators}/mcq.py (99%) rename src/heurams/kernel/{puzzles => evaluators}/recognition.py (82%) delete mode 100644 src/heurams/kernel/particles/loader.py delete mode 100644 src/heurams/kernel/particles/orbital.py delete mode 100644 src/heurams/kernel/particles/probe.py create mode 100644 src/heurams/kernel/repomgr/aux.py delete mode 100644 src/heurams/utils/README.md create mode 100644 src/heurams/utils/__init__.py create mode 100644 src/heurams/utils/evalizor.py rename src/heurams/{kernel/repomgr => utils}/lict.py (100%) diff --git a/config/config.toml b/data/config/config.toml similarity index 90% rename from config/config.toml rename to data/config/config.toml index c7a3805..a3b3369 100644 --- a/config/config.toml +++ b/data/config/config.toml @@ -1,18 +1,18 @@ # [调试] 将更改保存到文件 -persist_to_file = 1 +#persist_to_file = 1 # [调试] 覆写时间, 设为 -1 以禁用 -daystamp_override = -1 -timestamp_override = -1 +#daystamp_override = -1 +#timestamp_override = -1 # [调试] 一键通过 -quick_pass = 1 +#quick_pass = 1 # 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 +#scheduled_num = 8 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -timezone_offset = +28800 # 中国标准时间 (UTC+8) +#timezone_offset = +28800 # 中国标准时间 (UTC+8) [interface] diff --git a/data/repo/test/algodata.json b/data/repo/test/algodata.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/data/repo/test/algodata.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/data/repo/test/manifest.toml b/data/repo/test/manifest.toml new file mode 100644 index 0000000..6e5f567 --- /dev/null +++ b/data/repo/test/manifest.toml @@ -0,0 +1,3 @@ +title = "测试单元: 过秦论" +author = "__heurams__" +desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/data/repo/test/payload.toml b/data/repo/test/payload.toml new file mode 100644 index 0000000..d9a34db --- /dev/null +++ b/data/repo/test/payload.toml @@ -0,0 +1,17 @@ +["秦孝公据崤函之固, 拥雍州之地,"] +note = [] +content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" +translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," +keyword_note = {"据"="占据", "崤函"="崤山和函谷关", "雍州"="古代九州之一"} + +["君臣固守以窥周室,"] +note = [] +content = "君臣/固守/以窥/周室,/" +translation = "君臣牢固地守卫着,借以窥视周王室的权力," +keyword_note = {"窥"="窥视"} + +["有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心."] +note = [] +content = "有/席卷/天下/, 包举/宇内/, 囊括/四海/之意/, 并吞/八荒/之心./" +translation = "有席卷天下,包办天宇之间,囊括四海的意图,并统天下的雄心。" +keyword_note = {"席卷"="像卷席子一样全部卷进去", "包举"="像打包一样全部拿走", "囊括"="像装口袋一样全部装进去", "八荒"="八方荒远之地"} \ No newline at end of file diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml new file mode 100644 index 0000000..792ed3d --- /dev/null +++ b/data/repo/test/schedule.toml @@ -0,0 +1,3 @@ +quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] +recognition = [["Recognition", "1.0"]] +final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file diff --git a/data/repo/test/typedef.toml b/data/repo/test/typedef.toml new file mode 100644 index 0000000..d55cc86 --- /dev/null +++ b/data/repo/test/typedef.toml @@ -0,0 +1,19 @@ +["古文句"] + +[annotation] +note = "笔记" +keyword_note = "关键词翻译" +translation = "语句翻译" +delimiter = "分隔符" +content = "内容" +tts_text = "文本转语音文本" + +["common"] +delimiter = "/" +tts_text = "eval:payload['content'].replace('/', '')" + +["puzzles"] # 谜题定义 +# 我们称 "Recognition" 为 recognition 谜题的 alia +"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } +"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/data/template/blank.toml b/data/template/blank.toml deleted file mode 100644 index 49933ec..0000000 --- a/data/template/blank.toml +++ /dev/null @@ -1,23 +0,0 @@ -# Nucleon 是 HeurAMS 软件项目使用的基于 TOML 的专有源文件格式, 版本 5 -# 建议使用的 MIME 类型: application/vnd.xyz.imwangzhiyu.heurams-nucleon.v5+toml - -[__metadata__] -[__metadata__.attribution] # 元信息 -desc = "带有宏支持的空白模板" - -[__metadata__.annotation] # 键批注 - -[__metadata__.formation] # 文件配置 -#delimiter = "/" -#tts_text = "eval:nucleon['content'].replace('/', '')" - -[__metadata__.orbital.puzzles] # 谜题定义 -# 我们称 "Recognition" 为 recognition 谜题的 alia -#"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:nucleon['content']", secondary = ["eval:nucleon['keyword_note']", "eval:nucleon['note']"], top_dim = ["eval:nucleon['translation']"] } -#"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:nucleon['content']", mapping = "eval:nucleon['keyword_note']", jammer = "eval:nucleon['keyword_note']", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -#"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:nucleon['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} - -[__metadata__.orbital.schedule] # 内置的推荐学习方案 -#quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["recognition", "1.0"]] -#recognition = [["Recognition", "1.0"]] -#final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["recognition", "1.0"]] diff --git a/pyproject.toml b/pyproject.toml index 400baf1..ec50274 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "heurams" -version = "0.4.3" +version = "0.5.0" description = "Heuristic Assisted Memory Scheduler" license = {file = "LICENSE"} classifiers = [ diff --git a/src/heurams/default/config/config.toml b/src/heurams/default/config/config.toml deleted file mode 100644 index c7a3805..0000000 --- a/src/heurams/default/config/config.toml +++ /dev/null @@ -1,61 +0,0 @@ -# [调试] 将更改保存到文件 -persist_to_file = 1 - -# [调试] 覆写时间, 设为 -1 以禁用 -daystamp_override = -1 -timestamp_override = -1 - -# [调试] 一键通过 -quick_pass = 1 - -# 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 - -# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -timezone_offset = +28800 # 中国标准时间 (UTC+8) - -[interface] - -[interface.memorizor] -autovoice = true # 自动语音播放, 仅限于 recognition 组件 - -[algorithm] -default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS - -[puzzles] # 谜题默认配置 - -[puzzles.mcq] -max_riddles_num = 2 - -[puzzles.cloze] -min_denominator = 3 - -[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -nucleon_dir = "./data/nucleon" -electron_dir = "./data/electron" -global_dir = "./data/global" # 全局数据路径, SM-15 等算法需要 -orbital_dir = "./data/orbital" -cache_dir = "./data/cache" -template_dir = "./data/template" - -[services] # 定义服务到提供者的映射 -audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) -tts = "edgetts" # 可选项: edgetts -llm = "openai" # 可选项: openai -sync = "webdav" # 可选项: 留空, webdav - -[providers.tts.edgetts] # EdgeTTS 设置 -voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - -[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 -url = "" -key = "" - -[providers.sync.webdav] # WebDAV 同步设置 -url = "" -username = "" -password = "" -remote_path = "/heurams/" -verify_ssl = true - -[sync] diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 38b0d1d..daea1c0 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -61,7 +61,7 @@ class DashboardScreen(Screen): Returns: dict: 包含显示文本的字典,键为行号 """ - from heurams.kernel.particles.loader import load_electron, load_nucleon + from heurams.kernel.repository.particle_loader import load_electron, load_nucleon result = {} filestem = pathlib.Path(filename).stem diff --git a/src/heurams/interface/screens/memorizor.py b/src/heurams/interface/screens/memorizor.py index 9bf03f7..53bb5cf 100644 --- a/src/heurams/interface/screens/memorizor.py +++ b/src/heurams/interface/screens/memorizor.py @@ -8,7 +8,7 @@ from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static import heurams.kernel.particles as pt -import heurams.kernel.puzzles as pz +import heurams.kernel.evaluators as pz from heurams.context import config_var from heurams.kernel.reactor import * from heurams.services.logger import get_logger diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index a8165c8..6dbe361 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -5,7 +5,7 @@ from typing import TypedDict import heurams.interface.widgets as pzw import heurams.kernel.particles as pt -import heurams.kernel.puzzles as pz +import heurams.kernel.evaluators as pz staging = {} # 细粒度缓存区, 是 ident -> quality 的封装 diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 9d8c001..5278969 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -8,7 +8,7 @@ from textual.widget import Widget from textual.widgets import Button, Label import heurams.kernel.particles as pt -import heurams.kernel.puzzles as pz +import heurams.kernel.evaluators as pz from heurams.services.logger import get_logger from .base_puzzle_widget import BasePuzzleWidget diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index e686b49..56820b6 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -6,7 +6,7 @@ from textual.widget import Widget from textual.widgets import Button, Label import heurams.kernel.particles as pt -import heurams.kernel.puzzles as pz +import heurams.kernel.evaluators as pz from heurams.services.hasher import hash from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index a6ebbeb..c1e6fa8 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -2,17 +2,20 @@ from heurams.services.logger import get_logger from .sm2 import SM2Algorithm from .sm15m import SM15MAlgorithm +from .base import BaseAlgorithm logger = get_logger(__name__) __all__ = [ "SM2Algorithm", + "BaseAlgorithm", + "SM15MAlgorithm", ] algorithms = { "SM-2": SM2Algorithm, "SM-15M": SM15MAlgorithm, - # "SM-15M": SM15MAlgorithm, + "Base": BaseAlgorithm, } logger.debug("算法模块初始化完成, 注册的算法: %s", list(algorithms.keys())) diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index b671c5b..3c0dbfb 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -10,7 +10,6 @@ class BaseAlgorithm: algo_name = "BaseAlgorithm" class AlgodataDict(TypedDict): - efactor: float real_rept: int rept: int interval: int @@ -52,7 +51,7 @@ class BaseAlgorithm: return 1 @classmethod - def rate(cls, algodata) -> str: + def get_rating(cls, algodata) -> str: """获取评分信息""" logger.debug( "BaseAlgorithm.rate 被调用, algodata keys: %s", @@ -68,3 +67,12 @@ class BaseAlgorithm: list(algodata.keys()) if algodata else [], ) return -1 + + @classmethod + def check_integrity(cls, algodata): + try: + cls.AlgodataDict(**algodata[cls.algo_name]) + return 1 + except: + return 0 + \ No newline at end of file diff --git a/src/heurams/kernel/algorithms/sm2.py b/src/heurams/kernel/algorithms/sm2.py index 6696784..0d848aa 100644 --- a/src/heurams/kernel/algorithms/sm2.py +++ b/src/heurams/kernel/algorithms/sm2.py @@ -116,7 +116,7 @@ class SM2Algorithm(BaseAlgorithm): return result @classmethod - def rate(cls, algodata): + def get_rating(cls, algodata): efactor = algodata[cls.algo_name]["efactor"] logger.debug("SM2.rate: efactor=%f", efactor) return str(efactor) diff --git a/src/heurams/kernel/puzzles/__init__.py b/src/heurams/kernel/evaluators/__init__.py similarity index 82% rename from src/heurams/kernel/puzzles/__init__.py rename to src/heurams/kernel/evaluators/__init__.py index 5300648..8dd3a86 100644 --- a/src/heurams/kernel/puzzles/__init__.py +++ b/src/heurams/kernel/evaluators/__init__.py @@ -1,20 +1,20 @@ """ -Puzzle 模块 - 谜题生成系统 +Evaluator 模块 - 生成评估模块 -提供多种类型的谜题生成器, 支持从字符串、字典等数据源导入题目 +提供多种类型的辅助评估生成器, 支持从字符串、字典等数据源导入题目 """ from heurams.services.logger import get_logger logger = get_logger(__name__) -from .base import BasePuzzle +from .base import BaseEvaluator from .cloze import ClozePuzzle from .mcq import MCQPuzzle from .recognition import RecognitionPuzzle __all__ = [ - "BasePuzzle", + "BaseEvaluator", "ClozePuzzle", "MCQPuzzle", "RecognitionPuzzle", @@ -24,12 +24,12 @@ puzzles = { "mcq": MCQPuzzle, "cloze": ClozePuzzle, "recognition": RecognitionPuzzle, - "base": BasePuzzle, + "base": BaseEvaluator, } @staticmethod -def create_by_dict(config_dict: dict) -> BasePuzzle: +def create_by_dict(config_dict: dict) -> BaseEvaluator: """ 根据配置字典创建谜题 diff --git a/src/heurams/kernel/puzzles/base.py b/src/heurams/kernel/evaluators/base.py similarity index 95% rename from src/heurams/kernel/puzzles/base.py rename to src/heurams/kernel/evaluators/base.py index 688d7c8..cbae148 100644 --- a/src/heurams/kernel/puzzles/base.py +++ b/src/heurams/kernel/evaluators/base.py @@ -4,7 +4,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -class BasePuzzle: +class BaseEvaluator: """谜题基类""" def refresh(self): diff --git a/src/heurams/kernel/puzzles/cloze.py b/src/heurams/kernel/evaluators/cloze.py similarity index 97% rename from src/heurams/kernel/puzzles/cloze.py rename to src/heurams/kernel/evaluators/cloze.py index 3522aaa..549a91f 100644 --- a/src/heurams/kernel/puzzles/cloze.py +++ b/src/heurams/kernel/evaluators/cloze.py @@ -2,12 +2,12 @@ import random from heurams.services.logger import get_logger -from .base import BasePuzzle +from .base import BaseEvaluator logger = get_logger(__name__) -class ClozePuzzle(BasePuzzle): +class ClozePuzzle(BaseEvaluator): """填空题谜题生成器 Args: diff --git a/src/heurams/kernel/evaluators/guess.py b/src/heurams/kernel/evaluators/guess.py new file mode 100644 index 0000000..6b30b3e --- /dev/null +++ b/src/heurams/kernel/evaluators/guess.py @@ -0,0 +1,11 @@ +import random + +from heurams.services.logger import get_logger + +from .base import BaseEvaluator + +logger = get_logger(__name__) + +class GuessEvaluator(BaseEvaluator): + def __init__(self): + super().__init__() \ No newline at end of file diff --git a/src/heurams/kernel/puzzles/mcq.py b/src/heurams/kernel/evaluators/mcq.py similarity index 99% rename from src/heurams/kernel/puzzles/mcq.py rename to src/heurams/kernel/evaluators/mcq.py index 1246a19..e17db67 100644 --- a/src/heurams/kernel/puzzles/mcq.py +++ b/src/heurams/kernel/evaluators/mcq.py @@ -4,12 +4,12 @@ from typing import Dict, List, Optional, Union from heurams.services.logger import get_logger -from .base import BasePuzzle +from .base import BaseEvaluator logger = get_logger(__name__) -class MCQPuzzle(BasePuzzle): +class MCQPuzzle(BaseEvaluator): """选择题谜题生成器 该类用于生成和管理选择题谜题, 支持多个题目同时生成, diff --git a/src/heurams/kernel/puzzles/recognition.py b/src/heurams/kernel/evaluators/recognition.py similarity index 82% rename from src/heurams/kernel/puzzles/recognition.py rename to src/heurams/kernel/evaluators/recognition.py index 964db3f..81712b0 100644 --- a/src/heurams/kernel/puzzles/recognition.py +++ b/src/heurams/kernel/evaluators/recognition.py @@ -3,12 +3,12 @@ import random from heurams.services.logger import get_logger -from .base import BasePuzzle +from .base import BaseEvaluator logger = get_logger(__name__) -class RecognitionPuzzle(BasePuzzle): +class RecognitionPuzzle(BaseEvaluator): """识别占位符""" def __init__(self) -> None: diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index 331bb16..e69de29 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -1,29 +0,0 @@ -""" -Particle 模块 - 粒子对象系统 - -提供闪卡所需对象, 使用物理学粒子的领域驱动设计 -""" - -from heurams.services.logger import get_logger - -logger = get_logger(__name__) -logger.debug("粒子模块已加载") - -from .atom import Atom, atom_registry -from .electron import Electron -from .loader import load_electron, load_nucleon -from .nucleon import Nucleon -from .orbital import Orbital -from .probe import probe_all, probe_by_filename - -__all__ = [ - "Electron", - "Nucleon", - "Orbital", - "Atom", - "probe_all", - "probe_by_filename", - "load_nucleon", - "load_electron", - "atom_registry", -] diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index dfb172c..68ce358 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -11,7 +11,6 @@ from heurams.services.logger import get_logger from .electron import Electron from .nucleon import Nucleon -from .orbital import Orbital logger = get_logger(__name__) @@ -19,19 +18,12 @@ logger = get_logger(__name__) class AtomRegister_runtime(TypedDict): locked: bool # 只读锁定标识符 min_rate: int # 最低评分 - newact: bool # 新激活 + new_activation: bool # 新激活 class AtomRegister(TypedDict): nucleon: Nucleon - nucleon_path: pathlib.Path - nucleon_fmt: str electron: Electron - electron_path: pathlib.Path - electron_fmt: str - orbital: Orbital - orbital_path: pathlib.Path - orbital_fmt: str runtime: AtomRegister_runtime @@ -44,50 +36,37 @@ class Atom: 以及关联路径 """ - def __init__(self, ident=""): - logger.debug("创建 Atom 实例, ident: '%s'", ident) - self.ident = ident - atom_registry[ident] = self - logger.debug("Atom 已注册到全局注册表, 当前注册表大小: %d", len(atom_registry)) - # self.is_evaled = False + default_runtime = { + "locked": False, + "min_rate": 0x3F3F3F3F, + "new_activation": False, + } + + def __init__(self, nucleon_obj = None, electron_obj = None, orbital_obj = None): self.registry: AtomRegister = { # type: ignore - "nucleon": None, - "nucleon_path": None, - "nucleon_fmt": "toml", - "electron": None, - "electron_path": None, - "electron_fmt": "json", - "orbital": None, - "orbital_path": None, # 允许设置为 None, 此时使用 nucleon 文件内的推荐配置 - "orbital_fmt": "toml", - "runtime": {"locked": False, "min_rate": 0x3F3F3F3F, "newact": False}, + "ident": nucleon_obj["ident"], # type: ignore + "nucleon": nucleon_obj, + "electron": electron_obj, + "orbital": orbital_obj, + "runtime": dict(), } - logger.debug("Atom 初始化完成") - - def link(self, key, value): - logger.debug("Atom.link: key='%s', value type: %s", key, type(value).__name__) - if key in self.registry.keys(): - self.registry[key] = value - logger.debug("键 '%s' 已链接, 触发 do_eval", key) - if key == "electron": - if self.registry["electron"].is_activated() == 0: - self.registry["runtime"]["newact"] = True - else: - logger.error("尝试链接不受支持的键: '%s'", key) - raise ValueError("不受支持的原子元数据链接操作") + if self.registry["electron"].is_activated() == 0: + self.registry["runtime"]["new_activation"] = True + def init_runtime(self): + self.registry['runtime'] = AtomRegister_runtime(**self.default_runtime) + def do_eval(self): """ 执行并以结果替换当前单元的所有 eval 语句 TODO: 带有限制的 eval, 异步/多线程执行避免堵塞 """ - logger.debug("EVAL 开始") - # eval 环境设置 def eval_with_env(s: str): default = config_var.get()["puzzles"] - payload = self.registry["nucleon"].payload - metadata = self.registry["nucleon"].metadata + nucleon = self.registry["nucleon"] + payload = nucleon # 兼容历史遗留问题 + metadata = nucleon # 兼容历史遗留问题 eval_value = eval(s) if isinstance(eval_value, (int, float)): ret = str(eval_value) @@ -158,39 +137,11 @@ class Atom: logger.debug(f"允许总评分: {self.registry['runtime']['min_rate']}") self.registry["electron"].revisor( self.registry["runtime"]["min_rate"], - is_new_activation=self.registry["runtime"]["newact"], + is_new_activation=self.registry["runtime"]["new_activation"], ) else: logger.debug("禁止总评分") - def persist(self, key): - logger.debug("Atom.persist: key='%s'", key) - path: pathlib.Path | None = self.registry[key + "_path"] - if isinstance(path, pathlib.Path): - path = typing.cast(pathlib.Path, path) - logger.debug("持久化路径: %s, 格式: %s", path, self.registry[key + "_fmt"]) - path.parent.mkdir(parents=True, exist_ok=True) - if self.registry[key + "_fmt"] == "toml": - with open(path, "r+") as f: - f.seek(0) - f.truncate() - toml.dump(self.registry[key], f) - logger.debug("TOML 数据已保存到: %s", path) - elif self.registry[key + "_fmt"] == "json": - with open(path, "r+") as f: - origin = json.load(f) - f.seek(0) - f.truncate() - origin[self.ident] = self.registry[key].algodata - json.dump(origin, f, indent=2, ensure_ascii=False) - logger.debug("JSON 数据已保存到: %s", path) - else: - logger.error("不受支持的持久化格式: %s", self.registry[key + "_fmt"]) - raise KeyError("不受支持的持久化格式") - else: - logger.error("路径未初始化: %s_path", key) - raise TypeError("对未初始化的路径对象操作") - def __getitem__(self, key): logger.debug("Atom.__getitem__: key='%s'", key) if key in self.registry: @@ -211,9 +162,3 @@ class Atom: logger.error("不支持的键: '%s'", key) raise KeyError(f"不支持的键: {key}") - @staticmethod - def placeholder(): - return (Electron.placeholder(), Nucleon.placeholder(), {}) - - -atom_registry: bidict.bidict[str, Atom] = bidict.bidict() diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index cc5cdd6..b6de929 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -1,100 +1,71 @@ +from typing import TypedDict import heurams.services.timer as timer from heurams.context import config_var from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger - +import heurams.kernel.algorithms as algolib +from copy import deepcopy logger = get_logger(__name__) +class QueryType(TypedDict): + is_due: bool + is_activated: bool + rating: int + nextdate: int + lastdate: int class Electron: - """电子: 记忆分析元数据及算法""" + """电子: 单算法支持的记忆数据包装""" def __init__(self, ident: str, algodata: dict = {}, algo_name: str = ""): """初始化电子对象 (记忆数据) Args: ident: 算法的唯一标识符, 用于区分不同的算法实例, 使用 algodata[ident] 获取 - algodata: 算法数据字典, 包含算法的各项参数和设置 - algo: 使用的算法模块标识 + algodata: 算法数据字典引用, 包含算法的各项参数和设置 + algo_name: 使用的算法模块标识 """ if algo_name == "": - algo_name = config_var.get()["algorithm"]["default"] - logger.debug( - "创建 Electron 实例, ident: '%s', algo_name: '%s', algodata: %s", - ident, - algo_name, - algodata, - ) + algo_name = "sm-2" self.algodata = algodata self.ident = ident - self.algo = algorithms[algo_name] - logger.debug("使用的算法类: %s", self.algo.__name__) + self.algo: algolib.BaseAlgorithm = algorithms[algo_name] + self.query = dict() - if self.algo.algo_name not in self.algodata.keys(): - self.algodata[self.algo.algo_name] = {} - logger.debug("算法键 '%s' 不存在, 已创建空字典", self.algo) - if not self.algodata[self.algo.algo_name]: - logger.debug( - f"算法数据为空, 使用默认值初始化{self.algodata[self.algo.algo_name]}" - ) - self._default_init(self.algo.defaults) - else: - logger.debug("算法数据已存在, 跳过默认初始化") - logger.debug( - "Electron 初始化完成, algodata keys: %s", list(self.algodata.keys()) - ) - - def _default_init(self, defaults: dict): - """默认初始化包装""" - logger.debug( - "Electron._default_init: 使用默认值, keys: %s", list(defaults.keys()) - ) - self.algodata[self.algo.algo_name] = defaults.copy() + if self.algo.check_integrity(self.algodata): + self.algodata[self.algo.algo_name] = deepcopy(self.algo.defaults) def activate(self): """激活此电子""" - logger.debug("Electron.activate: 激活 ident='%s'", self.ident) self.algodata[self.algo.algo_name]["is_activated"] = 1 self.algodata[self.algo.algo_name]["last_modify"] = timer.get_timestamp() - logger.debug("电子已激活, is_activated=1") - def modify(self, var: str, value): + def modify(self, key, value): """修改 algodata[algo] 中子字典数据""" - logger.debug("Electron.modify: var='%s', value=%s", var, value) - if var in self.algodata[self.algo.algo_name]: - self.algodata[self.algo.algo_name][var] = value + if key in self.algodata[self.algo.algo_name]: + self.algodata[self.algo.algo_name][key] = value self.algodata[self.algo.algo_name]["last_modify"] = timer.get_timestamp() - logger.debug("变量 '%s' 已修改, 更新 last_modify", var) else: - logger.warning("'%s' 非已知元数据字段", var) - print(f"警告: '{var}' 非已知元数据字段") + raise AttributeError("不存在的子键") def is_due(self): """是否应该复习""" - logger.debug("Electron.is_due: 检查 ident='%s'", self.ident) result = self.algo.is_due(self.algodata) - logger.debug("is_due 结果: %s", result) return result and self.is_activated() def is_activated(self): result = self.algodata[self.algo.algo_name]["is_activated"] - logger.debug("Electron.is_activated: ident='%s', 结果: %d", self.ident, result) return result - def get_rate(self): - "评价" + def get_rating(self): try: - logger.debug("Electron.rate: ident='%s'", self.ident) - result = self.algo.rate(self.algodata) - logger.debug("rate 结果: %s", result) + result = self.algo.get_rating(self.algodata) return result except: return 0 def nextdate(self) -> int: - logger.debug("Electron.nextdate: ident='%s'", self.ident) result = self.algo.nextdate(self.algodata) - logger.debug("nextdate 结果: %d", result) return result def revisor(self, quality: int = 5, is_new_activation: bool = False): @@ -104,32 +75,7 @@ class Electron: quality (int): 记忆保留率量化参数 (0-5) is_new_activation (bool): 是否为初次激活 """ - logger.debug( - "Electron.revisor: ident='%s', quality=%d, is_new_activation=%s", - self.ident, - quality, - is_new_activation, - ) self.algo.revisor(self.algodata, quality, is_new_activation) - logger.debug( - "revisor 完成, 更新后的 algodata: %s", self.algodata.get(self.algo, {}) - ) - - def __str__(self): - return ( - f"记忆单元预览 \n" - f"标识符: '{self.ident}' \n" - f"算法: {self.algo} \n" - f"易度系数: {self.algodata[self.algo.algo_name]['efactor']:.2f} \n" - f"已经重复的次数: {self.algodata[self.algo.algo_name]['rept']} \n" - f"下次间隔: {self.algodata[self.algo.algo_name]['interval']} 天 \n" - f"下次复习日期时间戳: {self.algodata[self.algo.algo_name]['next_date']}" - ) - - def __eq__(self, other): - if self.ident == other.ident: - return True - return False def __hash__(self): return hash(self.ident) @@ -151,8 +97,11 @@ class Electron: def __len__(self): """仅返回当前算法的配置数量""" return len(self.algodata[self.algo.algo_name]) - + @staticmethod - def placeholder(): - """生成一个电子占位符""" - return Electron("电子对象样例内容", {}) + def create_on_electonic_data(electronic_data: tuple, algo_name: str = ""): + _data = electronic_data + ident = _data[0] + algodata = _data[1] + ident = ident + return Electron(ident, algodata, algo_name) \ No newline at end of file diff --git a/src/heurams/kernel/particles/loader.py b/src/heurams/kernel/particles/loader.py deleted file mode 100644 index 825e7db..0000000 --- a/src/heurams/kernel/particles/loader.py +++ /dev/null @@ -1,74 +0,0 @@ -import json -import pathlib -from copy import deepcopy - -import toml - -import heurams.services.hasher as hasher -from heurams.services.logger import get_logger - -from .electron import Electron -from .nucleon import Nucleon - -logger = get_logger(__name__) - - -def load_nucleon(path: pathlib.Path, fmt="toml"): - logger.debug("load_nucleon: 加载文件 %s, 格式: %s", path, fmt) - with open(path, "r") as f: - dictdata = dict() - dictdata = toml.load(f) # type: ignore - logger.debug("TOML 解析成功, keys: %s", list(dictdata.keys())) - lst = list() - nested_data = dict() - # 修正 toml 解析器的不管嵌套行为 - for key, value in dictdata.items(): - if "__metadata__" in key: # 以免影响句号 - if "." in key: - parts = key.split(".") - current = nested_data - for part in parts[:-1]: - if part not in current: - current[part] = {} - current = current[part] - current[parts[-1]] = value - logger.debug("处理元数据键: %s", key) - else: - nested_data[key] = value - logger.debug("嵌套数据处理完成, keys: %s", list(nested_data.keys())) - # print(nested_data) - for item, attr in nested_data.items(): - if item == "__metadata__": - continue - logger.debug("处理项目: %s", item) - lst.append( - ( - Nucleon(item, attr, deepcopy(nested_data["__metadata__"])), - deepcopy(nested_data["__metadata__"]["orbital"]), - ) - ) - logger.debug("load_nucleon 完成, 加载了 %d 个 Nucleon 对象", len(lst)) - return lst - - -def load_electron(path: pathlib.Path, fmt="json") -> dict: - """从文件路径加载电子对象 - - Args: - path (pathlib.Path): 路径 - fmt (str): 文件格式(可选, 默认 json) - - Returns: - dict: 键名是电子对象名称, 值是电子对象 - """ - logger.debug("load_electron: 加载文件 %s, 格式: %s", path, fmt) - with open(path, "r") as f: - dictdata = dict() - dictdata = json.load(f) # type: ignore - logger.debug("JSON 解析成功, keys: %s", list(dictdata.keys())) - dic = dict() - for item, attr in dictdata.items(): - logger.debug("处理电子项目: %s, %s", item, attr) - dic[item] = Electron(item, attr) - logger.debug("load_electron 完成, 加载了 %d 个 Electron 对象", len(dic)) - return dic diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 175661b..463020e 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -2,55 +2,55 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) - class Nucleon: - """原子核: 材料元数据""" + """原子核: 带有运行时隔离的半只读材料元数据容器 + """ - def __init__(self, ident: str, payload: dict, metadata: dict = {}): - """初始化原子核 (记忆内容) - - Args: - ident: 唯一标识符 - payload: 记忆内容信息 - metadata: 可选元数据信息 - """ - logger.debug( - "创建 Nucleon 实例, ident: '%s', payload keys: %s, metadata keys: %s", - ident, - list(payload.keys()) if payload else [], - list(metadata.keys()) if metadata else [], - ) - self.metadata = metadata - self.payload = payload + def __init__(self, ident, payload, common): self.ident = ident - logger.debug("Nucleon 初始化完成") + self.payload = payload + self.common = common + self.rtlayer = dict() # 运行时层 def __getitem__(self, key): - logger.debug("Nucleon.__getitem__: key='%s'", key) if key == "ident": - logger.debug("返回 ident: '%s'", self.ident) return self.ident - if key in self.payload: - value = self.payload[key] - logger.debug( - "返回 payload['%s'], value type: %s", key, type(value).__name__ - ) - return value + merged = self.rtlayer | self.payload | self.common + return merged[key] + + def __setitem__(self, key, value): + if key == "ident": + raise AttributeError("ident 应为只读") else: - logger.error("键 '%s' 未在 payload 中找到", key) - raise KeyError(f"Key '{key}' not found in payload.") + self.rtlayer[key] = value + + def __delitem__(self, key): + raise AttributeError("Nucleon 包含的数据被设计为无法删除") def __iter__(self): - yield from self.payload.keys() + merged = self.rtlayer | self.payload | self.common + return iter(merged) + def __contains__(self, key): + return key in (self.rtlayer | self.payload | self.common) + + def get(self, key, default=None): + if key in self: + return self[key] + return default + def __len__(self): - return len(self.payload) + return len(self.rtlayer | self.payload | self.common) - def __hash__(self): - return hash(self.ident) + def __repr__(self): + return f"""RUNTIME:{repr(self.rtlayer)} + PAYLOAD:{repr(self.payload)} + COMMON:{repr(self.common)}""" @staticmethod - def placeholder(): - """生成一个占位原子核""" - logger.debug("创建 Nucleon 占位符") - return Nucleon("核子对象样例内容", {}) + def create_on_nucleonic_data(nucleonic_data: tuple): + _data = nucleonic_data + payload = _data[1][0] + common = _data[1][1] + ident = _data[0] #TODO:实现eval + return Nucleon(ident, payload, common) \ No newline at end of file diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py deleted file mode 100644 index 58d996f..0000000 --- a/src/heurams/kernel/particles/orbital.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import TypedDict - -from heurams.services.logger import get_logger - -logger = get_logger(__name__) -logger.debug("Orbital 类型定义模块已加载") - - -class OrbitalSchedule(TypedDict): - quick_review: list - recognition: list - final_review: list - - -class Orbital(TypedDict): - schedule: OrbitalSchedule - puzzles: dict - - -"""一份示例 -["__metadata__.orbital.puzzles"] # 谜题定义 -"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:nucleon['content']", secondery = ["eval:nucleon['keyword_note']", "eval:nucleon['note']"], top_dim = ["eval:nucleon['translation']"] } -"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:nucleon['content']", jammer = "eval:nucleon['keyword_note']", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:nucleon['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} - -["__metadata__.orbital.schedule"] # 内置的推荐学习方案 -quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["recognition", "1.0"]] -recognition = [["recognition", "1.0"]] -final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["recognition", "1.0"]] -""" diff --git a/src/heurams/kernel/particles/probe.py b/src/heurams/kernel/particles/probe.py deleted file mode 100644 index 5eb18ef..0000000 --- a/src/heurams/kernel/particles/probe.py +++ /dev/null @@ -1,62 +0,0 @@ -import pathlib - -from heurams.context import config_var -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -def probe_by_filename(filename): - """探测指定文件 (无扩展名) 的所有信息""" - logger.debug("probe_by_filename: 探测文件 '%s'", filename) - paths: dict = config_var.get().get("paths") - logger.debug("配置路径: %s", paths) - formats = ["toml", "json"] - result = {} - for item, attr in paths.items(): - for i in formats: - attr: pathlib.Path = pathlib.Path(attr) / filename + "." + i - if attr.exists(): - logger.debug("找到文件: %s", attr) - result[item.replace("_dir", "")] = str(attr) - else: - logger.debug("文件不存在: %s", attr) - logger.debug("probe_by_filename 结果: %s", result) - return result - - -def probe_all(is_stem=1): - """依据目录探测所有信息 - - Args: - is_stem (boolean): 是否**删除**文件扩展名 - - Returns: - dict: 有三项, 每一项的键名都是文件组类型, 值都是文件组列表, 只包含文件名 - """ - logger.debug("probe_all: 开始探测, is_stem=%d", is_stem) - paths: dict = config_var.get().get("paths") - logger.debug("配置路径: %s", paths) - result = {} - for item, attr in paths.items(): - attr: pathlib.Path = pathlib.Path(attr) - result[item.replace("_dir", "")] = list() - logger.debug("扫描目录: %s", attr) - file_count = 0 - for i in attr.iterdir(): - if not i.is_dir(): - file_count += 1 - if is_stem: - result[item.replace("_dir", "")].append(str(i.stem)) - else: - result[item.replace("_dir", "")].append(str(i.name)) - logger.debug("目录 %s 中找到 %d 个文件", attr, file_count) - logger.debug("probe_all 完成, 结果 keys: %s", list(result.keys())) - return result - - -if __name__ == "__main__": - import os - - print(os.getcwd()) - print(probe_all()) diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 6de3576..e57b791 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -1,7 +1,7 @@ import random import heurams.kernel.particles as pt -import heurams.kernel.puzzles as puz +import heurams.kernel.evaluators as puz from heurams.services.logger import get_logger from .states import PhaserState diff --git a/src/heurams/kernel/repomgr/aux.py b/src/heurams/kernel/repomgr/aux.py new file mode 100644 index 0000000..3d0b41f --- /dev/null +++ b/src/heurams/kernel/repomgr/aux.py @@ -0,0 +1,5 @@ +from ...utils.lict import Lict + +def merge(x: Lict, y: Lict): + return Lict(list(x.values()) + list(y.values())) + diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py index b48d6e3..5750db5 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repomgr/repo.py @@ -1,44 +1,56 @@ +from functools import reduce from pathlib import Path import heurams.kernel.particles as pt import toml import json -from .lict import Lict +from ...utils.lict import Lict from .refvar import RefVar class Repo(): file_mapping = { - "orbital": "orbital.toml", + "schedule": "schedule.toml", "payload": "payload.toml", "algodata": "algodata.json", "manifest": "manifest.toml", - "formation": "formation.toml", + "typedef": "typedef.toml", } type_mapping = { - "orbital": "dict", + "schedule": "dict", "payload": "lict", "algodata": "lict", "manifest": "dict", - "formation": "dict", + "typedef": "dict", } default_save_list = ["algodata"] - def __init__(self, orbital, payload, manifest, formation, algodata, source = None) -> None: - self.orbital: pt.Orbital = orbital - self.payload: Lict = payload + def __init__(self, schedule: dict, payload: Lict, manifest: dict, typedef: dict, algodata: Lict, source = None) -> None: + self.schedule: dict = schedule self.manifest: dict = manifest - self.formation: dict = formation + self.typedef: dict = typedef + self.payload: Lict = payload self.algodata: Lict = algodata self.source: Path | None = source # 若存在, 指向 repo 所在 dir self.database = { - "orbital": self.orbital, + "schedule": self.schedule, "payload": self.payload, "manifest": self.manifest, - "formation": self.formation, + "typedef": self.typedef, "algodata": self.algodata, "source": self.source, } + self.generate_particles_data() + + def generate_particles_data(self): + self.nucleonic_data_lict = Lict(list(map(self._attach(self.typedef), self.payload))) + self.electronic_data_lict = self.algodata + + @staticmethod + def _attach(value): + def inner(x): + return (x, value) + return inner def __len__(self): return len(self.payload) @@ -70,11 +82,11 @@ class Repo(): @classmethod def create_new_repo(cls, source = None): default_database = { - "orbital": {"puzzles": {}, "schedule": {}}, - "payload": [], - "algodata": [], + "schedule": {}, + "payload": Lict([]), + "algodata": Lict([]), "manifest": {}, - "formation": {"annotation": {}, "unified": {}}, + "typedef": {}, "source": source } return Repo(**default_database) diff --git a/src/heurams/services/version.py b/src/heurams/services/version.py index 0239b75..4f31e59 100644 --- a/src/heurams/services/version.py +++ b/src/heurams/services/version.py @@ -3,8 +3,8 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -ver = "0.4.3" +ver = "0.5.0" stage = "prototype" -codename = "fledge" # 雏鸟, 0.4.x 版本 +codename = "fulcrom" # 支点 logger.info("HeurAMS 版本: %s (%s), 阶段: %s", ver, codename, stage) diff --git a/src/heurams/utils/README.md b/src/heurams/utils/README.md deleted file mode 100644 index ec435c4..0000000 --- a/src/heurams/utils/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Utils - 实用工具 -脚本与部分分离式工具函数 \ No newline at end of file diff --git a/src/heurams/utils/__init__.py b/src/heurams/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py new file mode 100644 index 0000000..65176b5 --- /dev/null +++ b/src/heurams/utils/evalizor.py @@ -0,0 +1,28 @@ + +from typing import Any + + +class Evalizer(): + def __init__(self, environment: dict) -> None: + self.env = environment + + def __call__(self, *args: Any, **kwds: Any) -> Any: + + +def do_eval(self): + """ + 执行并以结果替换当前单元的所有 eval 语句 + TODO: 带有限制的 eval, 异步/多线程执行避免堵塞 + """ + + # eval 环境设置 + def eval_with_env(s: str): + default = config_var.get()["puzzles"] + payload = self.registry["nucleon"].payload + metadata = self.registry["nucleon"].metadata + eval_value = eval(s) + if isinstance(eval_value, (int, float)): + ret = str(eval_value) + else: + ret = eval_value + return ret \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/lict.py b/src/heurams/utils/lict.py similarity index 100% rename from src/heurams/kernel/repomgr/lict.py rename to src/heurams/utils/lict.py diff --git a/tests/kernel/algorithms/test_sm2.py b/tests/kernel/algorithms/test_sm2.py index 9075715..ecc1a24 100644 --- a/tests/kernel/algorithms/test_sm2.py +++ b/tests/kernel/algorithms/test_sm2.py @@ -174,7 +174,7 @@ class TestSM2Algorithm(unittest.TestCase): def test_rate(self): """测试 rate 方法""" algodata = {SM2Algorithm.algo_name: {"efactor": 2.7}} - self.assertEqual(SM2Algorithm.rate(algodata), "2.7") + self.assertEqual(SM2Algorithm.get_rating(algodata), "2.7") def test_nextdate(self): """测试 nextdate 方法""" diff --git a/tests/kernel/particles/test_electron.py b/tests/kernel/particles/test_electron.py index 75c4552..7fe7e4e 100644 --- a/tests/kernel/particles/test_electron.py +++ b/tests/kernel/particles/test_electron.py @@ -98,7 +98,7 @@ class TestElectron(unittest.TestCase): electron = Electron("test_electron") with patch.object(electron.algo, "rate") as mock_rate: mock_rate.return_value = "good" - result = electron.get_rate() + result = electron.get_rating() mock_rate.assert_called_once_with(electron.algodata) self.assertEqual(result, "good") diff --git a/tests/kernel/puzzles/test_base.py b/tests/kernel/puzzles/test_base.py index 28b70f0..c5e4387 100644 --- a/tests/kernel/puzzles/test_base.py +++ b/tests/kernel/puzzles/test_base.py @@ -1,7 +1,7 @@ import unittest from unittest.mock import Mock -from heurams.kernel.puzzles.base import BasePuzzle +from heurams.kernel.evaluators.base import BasePuzzle class TestBasePuzzle(unittest.TestCase): diff --git a/tests/kernel/puzzles/test_cloze.py b/tests/kernel/puzzles/test_cloze.py index 4a51b5b..86696ee 100644 --- a/tests/kernel/puzzles/test_cloze.py +++ b/tests/kernel/puzzles/test_cloze.py @@ -1,7 +1,7 @@ import unittest from unittest.mock import MagicMock, patch -from heurams.kernel.puzzles.cloze import ClozePuzzle +from heurams.kernel.evaluators.cloze import ClozePuzzle class TestClozePuzzle(unittest.TestCase): diff --git a/tests/kernel/puzzles/test_mcq.py b/tests/kernel/puzzles/test_mcq.py index 61dc1a9..b64b329 100644 --- a/tests/kernel/puzzles/test_mcq.py +++ b/tests/kernel/puzzles/test_mcq.py @@ -1,7 +1,7 @@ import unittest from unittest.mock import MagicMock, call, patch -from heurams.kernel.puzzles.mcq import MCQPuzzle +from heurams.kernel.evaluators.mcq import MCQPuzzle class TestMCQPuzzle(unittest.TestCase): From af63cceba92743965abbaaa175b3e648fc85c51d Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 1 Jan 2026 06:36:27 +0800 Subject: [PATCH 04/79] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B=E7=B2=92?= =?UTF-8?q?=E5=AD=90=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/__init__.py | 2 +- src/heurams/interface/__main__.py | 2 +- src/heurams/interface/screens/about.py | 3 +- src/heurams/interface/screens/dashboard.py | 5 +- src/heurams/interface/screens/intelinote.py | 2 + .../interface/screens/memointegrity.py | 2 + .../screens/{memorizor.py => memoqueue.py} | 3 +- src/heurams/interface/screens/precache.py | 3 +- src/heurams/interface/screens/preparation.py | 5 +- src/heurams/interface/screens/radio.py | 2 + src/heurams/interface/screens/register.py | 0 .../screens/{nucreator.py => repocreator.py} | 3 +- src/heurams/interface/screens/synctool.py | 3 +- src/heurams/interface/screens/type43.py | 0 src/heurams/kernel/particles/atom.py | 75 ++----------------- src/heurams/kernel/particles/electron.py | 10 +-- src/heurams/kernel/particles/nucleon.py | 36 ++++----- src/heurams/kernel/repomgr/repo.py | 2 +- src/heurams/utils/evalizor.py | 49 ++++++------ 19 files changed, 74 insertions(+), 133 deletions(-) create mode 100644 src/heurams/interface/screens/memointegrity.py rename src/heurams/interface/screens/{memorizor.py => memoqueue.py} (99%) create mode 100644 src/heurams/interface/screens/radio.py delete mode 100644 src/heurams/interface/screens/register.py rename src/heurams/interface/screens/{nucreator.py => repocreator.py} (99%) delete mode 100644 src/heurams/interface/screens/type43.py diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 8205e2e..a203359 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -6,7 +6,7 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen -from .screens.nucreator import NucleonCreatorScreen +from .screens.repocreator import NucleonCreatorScreen from .screens.precache import PrecachingScreen from .screens.synctool import SyncScreen diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index a6dae83..8285937 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -7,7 +7,7 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen -from .screens.nucreator import NucleonCreatorScreen +from .screens.repocreator import NucleonCreatorScreen from .screens.precache import PrecachingScreen logger = get_logger(__name__) diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 915da4c..bd8697a 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""关于界面 +""" from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index daea1c0..f3be5c9 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""仪表盘界面 +""" import pathlib from textual.app import ComposeResult @@ -187,7 +188,7 @@ class DashboardScreen(Screen): button_id = event.button.id if button_id == "new_nucleon_button": - from .nucreator import NucleonCreatorScreen + from .repocreator import NucleonCreatorScreen new_screen = NucleonCreatorScreen() self.app.push_screen(new_screen) diff --git a/src/heurams/interface/screens/intelinote.py b/src/heurams/interface/screens/intelinote.py index e69de29..a667d9c 100644 --- a/src/heurams/interface/screens/intelinote.py +++ b/src/heurams/interface/screens/intelinote.py @@ -0,0 +1,2 @@ +"""笔记界面 +""" \ No newline at end of file diff --git a/src/heurams/interface/screens/memointegrity.py b/src/heurams/interface/screens/memointegrity.py new file mode 100644 index 0000000..3049c4c --- /dev/null +++ b/src/heurams/interface/screens/memointegrity.py @@ -0,0 +1,2 @@ +"""整体式记忆工作界面 +""" \ No newline at end of file diff --git a/src/heurams/interface/screens/memorizor.py b/src/heurams/interface/screens/memoqueue.py similarity index 99% rename from src/heurams/interface/screens/memorizor.py rename to src/heurams/interface/screens/memoqueue.py index 53bb5cf..9bc9149 100644 --- a/src/heurams/interface/screens/memorizor.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""队列式记忆工作界面 +""" from enum import Enum, auto from textual.app import ComposeResult diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 4c03bf2..3b24958 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""缓存工具界面 +""" import pathlib from textual.app import ComposeResult diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 37de55f..1647807 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""记忆准备界面 +""" from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.reactive import reactive @@ -130,7 +131,7 @@ class PreparationScreen(Screen): if left_new >= 0: atoms_to_provide.append(i) logger.debug(f"ATP: {atoms_to_provide}") - from .memorizor import MemScreen + from .memoqueue import MemScreen memscreen = MemScreen(atoms_to_provide) self.app.push_screen(memscreen) diff --git a/src/heurams/interface/screens/radio.py b/src/heurams/interface/screens/radio.py new file mode 100644 index 0000000..3ccc1dd --- /dev/null +++ b/src/heurams/interface/screens/radio.py @@ -0,0 +1,2 @@ +""""前进电台" 界面 +""" \ No newline at end of file diff --git a/src/heurams/interface/screens/register.py b/src/heurams/interface/screens/register.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/interface/screens/nucreator.py b/src/heurams/interface/screens/repocreator.py similarity index 99% rename from src/heurams/interface/screens/nucreator.py rename to src/heurams/interface/screens/repocreator.py index 735dda6..ff36b35 100644 --- a/src/heurams/interface/screens/nucreator.py +++ b/src/heurams/interface/screens/repocreator.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""仓库创建向导界面 +""" from pathlib import Path import toml diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index 3d1eebe..4e2c337 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +"""同步工具界面 +""" import pathlib import time diff --git a/src/heurams/interface/screens/type43.py b/src/heurams/interface/screens/type43.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 68ce358..eae9f54 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -3,7 +3,6 @@ import pathlib import typing from typing import TypedDict -import bidict import toml from heurams.context import config_var @@ -20,13 +19,11 @@ class AtomRegister_runtime(TypedDict): min_rate: int # 最低评分 new_activation: bool # 新激活 - class AtomRegister(TypedDict): nucleon: Nucleon electron: Electron runtime: AtomRegister_runtime - class Atom: """ 统一处理一系列对象的所有信息与持久化: @@ -50,61 +47,12 @@ class Atom: "orbital": orbital_obj, "runtime": dict(), } + self.init_runtime() if self.registry["electron"].is_activated() == 0: self.registry["runtime"]["new_activation"] = True def init_runtime(self): self.registry['runtime'] = AtomRegister_runtime(**self.default_runtime) - - def do_eval(self): - """ - 执行并以结果替换当前单元的所有 eval 语句 - TODO: 带有限制的 eval, 异步/多线程执行避免堵塞 - """ - # eval 环境设置 - def eval_with_env(s: str): - default = config_var.get()["puzzles"] - nucleon = self.registry["nucleon"] - payload = nucleon # 兼容历史遗留问题 - metadata = nucleon # 兼容历史遗留问题 - eval_value = eval(s) - if isinstance(eval_value, (int, float)): - ret = str(eval_value) - else: - ret = eval_value - logger.debug( - "eval 执行成功: '%s' -> '%s'", - s, - str(ret)[:50] + "..." if len(ret) > 50 else ret, - ) - return ret - - def traverse(data, modifier): - if isinstance(data, dict): - for key, value in data.items(): - data[key] = traverse(value, modifier) - return data - elif isinstance(data, list): - for i, item in enumerate(data): - data[i] = traverse(item, modifier) - return data - elif isinstance(data, tuple): - return tuple(traverse(item, modifier) for item in data) - else: - if isinstance(data, str): - if data.startswith("eval:"): - logger.debug("发现 eval 表达式: '%s'", data[5:]) - return modifier(data[5:]) - return data - - try: - traverse(self.registry["nucleon"].payload, eval_with_env) - traverse(self.registry["nucleon"].metadata, eval_with_env) - traverse(self.registry["orbital"], eval_with_env) - except Exception as e: - ret = f"此 eval 实例发生错误: {e}" - logger.warning(ret) - logger.debug("EVAL 完成") def minimize(self, rating): """效果等同于 self.registry['runtime']['min_rate'] = min(rating, self.registry['runtime']['min_rate']) @@ -143,22 +91,9 @@ class Atom: logger.debug("禁止总评分") def __getitem__(self, key): - logger.debug("Atom.__getitem__: key='%s'", key) - if key in self.registry: - value = self.registry[key] - logger.debug("返回 value type: %s", type(value).__name__) - return value - logger.error("不支持的键: '%s'", key) - raise KeyError(f"不支持的键: {key}") + return self.registry[key] def __setitem__(self, key, value): - logger.debug( - "Atom.__setitem__: key='%s', value type: %s", key, type(value).__name__ - ) - if key in self.registry: - self.registry[key] = value - logger.debug("键 '%s' 已设置", key) - else: - logger.error("不支持的键: '%s'", key) - raise KeyError(f"不支持的键: {key}") - + if key == "ident": + raise AttributeError("应为只读") + self.registry[key] = value \ No newline at end of file diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index b6de929..3e0b352 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -7,13 +7,6 @@ import heurams.kernel.algorithms as algolib from copy import deepcopy logger = get_logger(__name__) -class QueryType(TypedDict): - is_due: bool - is_activated: bool - rating: int - nextdate: int - lastdate: int - class Electron: """电子: 单算法支持的记忆数据包装""" @@ -30,9 +23,8 @@ class Electron: self.algodata = algodata self.ident = ident self.algo: algolib.BaseAlgorithm = algorithms[algo_name] - self.query = dict() - if self.algo.check_integrity(self.algodata): + if not self.algo.check_integrity(self.algodata): self.algodata[self.algo.algo_name] = deepcopy(self.algo.defaults) def activate(self): diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 463020e..b836742 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,38 +1,36 @@ from heurams.services.logger import get_logger - +from copy import deepcopy +from heurams.utils.evalizor import Evalizer logger = get_logger(__name__) class Nucleon: - """原子核: 带有运行时隔离的半只读材料元数据容器 + """原子核: 带有运行时隔离的模板化只读材料元数据容器 """ def __init__(self, ident, payload, common): self.ident = ident - self.payload = payload - self.common = common - self.rtlayer = dict() # 运行时层 + env = { + "payload": payload + } + self.evalizer = Evalizer(environment=env) + self.data = self.evalizer(deepcopy((payload | common))) def __getitem__(self, key): if key == "ident": return self.ident - merged = self.rtlayer | self.payload | self.common - return merged[key] + return self.data[key] def __setitem__(self, key, value): - if key == "ident": - raise AttributeError("ident 应为只读") - else: - self.rtlayer[key] = value - + raise AttributeError("应为只读") + def __delitem__(self, key): - raise AttributeError("Nucleon 包含的数据被设计为无法删除") + raise AttributeError("应为只读") def __iter__(self): - merged = self.rtlayer | self.payload | self.common - return iter(merged) + return iter(self.data) def __contains__(self, key): - return key in (self.rtlayer | self.payload | self.common) + return key in (self.data) def get(self, key, default=None): if key in self: @@ -40,12 +38,10 @@ class Nucleon: return default def __len__(self): - return len(self.rtlayer | self.payload | self.common) + return len(self.data) def __repr__(self): - return f"""RUNTIME:{repr(self.rtlayer)} - PAYLOAD:{repr(self.payload)} - COMMON:{repr(self.common)}""" + return repr(self.data) @staticmethod def create_on_nucleonic_data(nucleonic_data: tuple): diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py index 5750db5..e7e1e67 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repomgr/repo.py @@ -43,7 +43,7 @@ class Repo(): self.generate_particles_data() def generate_particles_data(self): - self.nucleonic_data_lict = Lict(list(map(self._attach(self.typedef), self.payload))) + self.nucleonic_data_lict = Lict(initlist=list(map(self._attach(self.typedef), self.payload))) self.electronic_data_lict = self.algodata @staticmethod diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py index 65176b5..0638cd0 100644 --- a/src/heurams/utils/evalizor.py +++ b/src/heurams/utils/evalizor.py @@ -1,28 +1,33 @@ - -from typing import Any - - class Evalizer(): + """几乎无副作用的模板系统 + + 接受环境信息并创建一个模板解析工具, 工具传入参数支持list, dict及其嵌套 + 副作用问题: 仅存在于 eval 函数 + """ + # TODO: 弃用风险极高的 eval + # 理论上已经限制了全局函数 但eval仍有风险 + # TODO: 异步/多线程执行避免堵塞 def __init__(self, environment: dict) -> None: self.env = environment - def __call__(self, *args: Any, **kwds: Any) -> Any: - - -def do_eval(self): - """ - 执行并以结果替换当前单元的所有 eval 语句 - TODO: 带有限制的 eval, 异步/多线程执行避免堵塞 - """ - - # eval 环境设置 - def eval_with_env(s: str): - default = config_var.get()["puzzles"] - payload = self.registry["nucleon"].payload - metadata = self.registry["nucleon"].metadata - eval_value = eval(s) - if isinstance(eval_value, (int, float)): - ret = str(eval_value) + def __call__(self, anyobj): + return self.travel(anyobj) + + def travel(self, anyobj): + if isinstance(anyobj, list): + return list(map(self.travel, anyobj)) + elif isinstance(anyobj, dict): + return dict(map(self.travel, anyobj.items())) + elif isinstance(anyobj, str): + if anyobj.startswith("eval:"): + return self.eval_with_env(anyobj[5:]) + else: + return anyobj else: - ret = eval_value + return anyobj + + def eval_with_env(self, s: str): + ret = eval(s, {}, self.env) + if not isinstance(ret, str): + ret = str(ret) return ret \ No newline at end of file From d25e3987012a16da12c7c89110afc56435bff05c Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 1 Jan 2026 16:19:46 +0800 Subject: [PATCH 05/79] =?UTF-8?q?feat:=20=E5=9F=BA=E6=9C=AC=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=AF=B9=E8=B1=A1=E7=B3=BB=E7=BB=9F=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/repo/test/schedule.toml | 2 ++ src/heurams/kernel/particles/__init__.py | 4 ++++ src/heurams/kernel/particles/atom.py | 1 + src/heurams/kernel/particles/orbital.py | 14 ++++++++++++++ src/heurams/kernel/repomgr/repo.py | 10 ++++++++-- src/heurams/utils/lict.py | 19 ++++++++++++++----- .../{kernel/repomgr => utils}/refvar.py | 0 7 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 src/heurams/kernel/particles/orbital.py rename src/heurams/{kernel/repomgr => utils}/refvar.py (100%) diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml index 792ed3d..d62ef1f 100644 --- a/data/repo/test/schedule.toml +++ b/data/repo/test/schedule.toml @@ -1,3 +1,5 @@ +schedule = ["quick_review", "recognition", "final_review"] +[phases] quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] recognition = [["Recognition", "1.0"]] final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index e69de29..93edc74 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -0,0 +1,4 @@ +from .atom import Atom +from .electron import Electron +from .nucleon import Nucleon +from .orbital import Orbital \ No newline at end of file diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index eae9f54..46cd7e2 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -40,6 +40,7 @@ class Atom: } def __init__(self, nucleon_obj = None, electron_obj = None, orbital_obj = None): + self.ident = nucleon_obj["ident"] # type: ignore self.registry: AtomRegister = { # type: ignore "ident": nucleon_obj["ident"], # type: ignore "nucleon": nucleon_obj, diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py new file mode 100644 index 0000000..f2e51e3 --- /dev/null +++ b/src/heurams/kernel/particles/orbital.py @@ -0,0 +1,14 @@ +from heurams.utils.lict import Lict +from heurams.utils.evalizor import Evalizer + +class Orbital(): + @classmethod + def create_orbital(cls, schedule: list, phase_def: dict): + phase_def = Lict(initdict=phase_def) # type: ignore + orbital = Lict() + for i in schedule: + orbital[i] = Lict(phase_def[i]) + return orbital + @classmethod + def create_orbital_on_orbitic_data(cls, orbitic_data): + return cls.create_orbital(orbitic_data["schedule"], orbitic_data["phases"]) \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py index e7e1e67..db1d3b9 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repomgr/repo.py @@ -4,7 +4,6 @@ import heurams.kernel.particles as pt import toml import json from ...utils.lict import Lict -from .refvar import RefVar class Repo(): file_mapping = { @@ -45,6 +44,7 @@ class Repo(): def generate_particles_data(self): self.nucleonic_data_lict = Lict(initlist=list(map(self._attach(self.typedef), self.payload))) self.electronic_data_lict = self.algodata + self.orbitic_data = self.schedule @staticmethod def _attach(value): @@ -52,6 +52,12 @@ class Repo(): return (x, value) return inner + @staticmethod + def _merge(value): + def inner(x): + return map(x, value) + return inner + def __len__(self): return len(self.payload) @@ -104,7 +110,7 @@ class Repo(): else: raise ValueError(f"不支持的文件类型: {filename}") if cls.type_mapping[keyname] == "lict": - database[keyname] = Lict(loaded.items()) + database[keyname] = Lict(list(loaded.items())) elif cls.type_mapping[keyname] == "dict": database[keyname] = loaded else: diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index ad4f587..5e05282 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -1,9 +1,10 @@ from collections import UserList -from typing import Any +from typing import Any, Iterator class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) """"列典" 对象 + 同时兼容字典和列表大多数 API, 两边数据同步的容器 列表数据是 dictobj.items() 的格式 支持根据字典或列表初始化 @@ -12,25 +13,33 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) - 值一定是引用对象 - 不使用并发 - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + + 只有在 Python 3.7+ 中, forced_order 行为才能被取消. """ - def __init__(self, initlist = None, initdict = None): + def __init__(self, initlist: list | None = None, initdict: dict | None = None, forced_order = True): self.dicted_data = {} if initdict != None: initlist = list(initdict.items()) super().__init__(initlist=initlist) + self.forced_order = forced_order self._sync_based_on_list() - self.data.sort() + if self.forced_order: + self.data.sort() def _sync_based_on_dict(self): self.data = list(self.dicted_data.items()) - self.data.sort() + if self.forced_order: + self.data.sort() def _sync_based_on_list(self): self.dicted_data = {} for i in self.data: self.dicted_data[i[0]] = i[1] + def __iter__(self) -> Iterator: + return self.data.__iter__() + def __getitem__(self, i): if isinstance(i, str): return self.dicted_data[i] diff --git a/src/heurams/kernel/repomgr/refvar.py b/src/heurams/utils/refvar.py similarity index 100% rename from src/heurams/kernel/repomgr/refvar.py rename to src/heurams/utils/refvar.py From bd313db5f2a5817d3430f74a6287d875455a01b6 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 1 Jan 2026 20:18:18 +0800 Subject: [PATCH 06/79] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 12 +- examples/repo.ipynb | 366 ++++++++++++++++++ examples/test_repo/algodata.json | 1 + examples/test_repo/manifest.toml | 3 + examples/test_repo/payload.toml | 11 + examples/test_repo/schedule.toml | 5 + examples/test_repo/typedef.toml | 19 + src/heurams/default/config/config.toml | 61 +++ src/heurams/interface/__init__.py | 2 +- src/heurams/interface/__main__.py | 2 +- src/heurams/interface/screens/about.py | 4 +- src/heurams/interface/screens/dashboard.py | 7 +- src/heurams/interface/screens/intelinote.py | 3 +- .../interface/screens/memointegrity.py | 3 +- src/heurams/interface/screens/memoqueue.py | 6 +- src/heurams/interface/screens/precache.py | 4 +- src/heurams/interface/screens/preparation.py | 4 +- src/heurams/interface/screens/radio.py | 3 +- src/heurams/interface/screens/repocreator.py | 4 +- src/heurams/interface/screens/synctool.py | 4 +- src/heurams/interface/shim.py | 2 +- src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/kernel/algorithms/__init__.py | 2 +- src/heurams/kernel/algorithms/base.py | 1 - src/heurams/kernel/evaluators/guess.py | 3 +- src/heurams/kernel/particles/__init__.py | 2 +- src/heurams/kernel/particles/atom.py | 13 +- src/heurams/kernel/particles/electron.py | 12 +- src/heurams/kernel/particles/nucleon.py | 24 +- src/heurams/kernel/particles/orbital.py | 10 +- src/heurams/kernel/reactor/fission.py | 2 +- .../kernel/{repomgr => repolib}/__init__.py | 0 .../kernel/{repomgr => repolib}/aux.py | 2 +- .../kernel/{repomgr => repolib}/navi.py | 4 +- .../kernel/{repomgr => repolib}/repo.py | 64 +-- src/heurams/utils/evalizor.py | 11 +- src/heurams/utils/lict.py | 60 +-- src/heurams/utils/refvar.py | 122 +++--- 39 files changed, 682 insertions(+), 180 deletions(-) create mode 100644 examples/repo.ipynb create mode 100644 examples/test_repo/algodata.json create mode 100644 examples/test_repo/manifest.toml create mode 100644 examples/test_repo/payload.toml create mode 100644 examples/test_repo/schedule.toml create mode 100644 examples/test_repo/typedef.toml create mode 100644 src/heurams/default/config/config.toml rename src/heurams/kernel/{repomgr => repolib}/__init__.py (100%) rename src/heurams/kernel/{repomgr => repolib}/aux.py (100%) rename src/heurams/kernel/{repomgr => repolib}/navi.py (59%) rename src/heurams/kernel/{repomgr => repolib}/repo.py (80%) diff --git a/data/config/config.toml b/data/config/config.toml index a3b3369..c7a3805 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -1,18 +1,18 @@ # [调试] 将更改保存到文件 -#persist_to_file = 1 +persist_to_file = 1 # [调试] 覆写时间, 设为 -1 以禁用 -#daystamp_override = -1 -#timestamp_override = -1 +daystamp_override = -1 +timestamp_override = -1 # [调试] 一键通过 -#quick_pass = 1 +quick_pass = 1 # 对于每个项目的默认新记忆原子数量 -#scheduled_num = 8 +scheduled_num = 8 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -#timezone_offset = +28800 # 中国标准时间 (UTC+8) +timezone_offset = +28800 # 中国标准时间 (UTC+8) [interface] diff --git a/examples/repo.ipynb b/examples/repo.ipynb new file mode 100644 index 0000000..8688803 --- /dev/null +++ b/examples/repo.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "51b89355", + "metadata": {}, + "source": [ + "# 演练场\n", + "此笔记本将带你了解 repomgr 与 particles 对象相关操作" + ] + }, + { + "cell_type": "markdown", + "id": "f5c49014", + "metadata": {}, + "source": [ + "# 从一个例子开始\n", + "## 了解文件结构\n", + "了解一下文件结构" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5ed9864", + "metadata": {}, + "outputs": [], + "source": [ + "!tree # 了解文件结构" + ] + }, + { + "cell_type": "markdown", + "id": "4e10922b", + "metadata": {}, + "source": [ + "如果你先前运行了单元格, 请运行下面一格清理." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9777730e", + "metadata": {}, + "outputs": [], + "source": [ + "!rm -rf test_new_repo\n", + "!rm -rf heurams.log*" + ] + }, + { + "cell_type": "markdown", + "id": "058c098f", + "metadata": {}, + "source": [ + "## 导入模块\n", + "导入所需模块, 你会看到欢迎信息, 标示了库所使用的配置. \n", + "HeurAMS 在基础设施也使用配置文件实现隐式的依赖注入. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf1b00c8", + "metadata": {}, + "outputs": [], + "source": [ + "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", + "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", + "from pathlib import Path # 这是 Python 的 Pathlib 模块, 用于表示文件路径, 在整个项目中, 都使用此模块表示路径" + ] + }, + { + "cell_type": "markdown", + "id": "ea1f68bb", + "metadata": {}, + "source": [ + "## 运行时检查\n", + "如你所见, repo 在文件系统内存储为一个文件夹. \n", + "因此在载入之前, 首先要检查这是否是一个合乎标准的 repo 文件夹. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "897b62d7", + "metadata": {}, + "outputs": [], + "source": [ + "is_vaild = repolib.Repo.check_repodir(Path(\"./test_repo\"))\n", + "print(f\"这是一个 {'合规' if is_vaild else '不合规'} 的 repo!\")" + ] + }, + { + "cell_type": "markdown", + "id": "24a19991", + "metadata": {}, + "source": [ + "## 加载仓库\n", + "接下来, 正式加载 repo." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "708ae7e4", + "metadata": {}, + "outputs": [], + "source": [ + "test_repo = repolib.Repo.create_from_repodir(Path(\"./test_repo\"))" + ] + }, + { + "cell_type": "markdown", + "id": "474f8eb7", + "metadata": {}, + "source": [ + "## 导出为字典\n", + "作为一个数据容器, repo 相应地建立了导入和导出的功能. \n", + "我们刚刚从本地文件夹导入了一个 repo. \n", + "现在试试导出为一个字典." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a11115fb", + "metadata": {}, + "outputs": [], + "source": [ + "test_repo_dic = test_repo.export_to_single_dict()\n", + "from pprint import pprint\n", + "pprint(test_repo_dic)" + ] + }, + { + "cell_type": "markdown", + "id": "35a2e06f", + "metadata": {}, + "source": [ + "## 持久化与部分保存\n", + "如你所见, 所有内容被结构化地输出了! \n", + "\n", + "现在写回到文件夹! \n", + "\n", + "我们注意到, 并非所有的内容都要被修改. \n", + "我们可以只保存接受修改的一部分, 默认情况下, 是迭代的记忆数据(algodata). \n", + "这就是为什么我们一般不使用单个 json 或 toml 来存储 repo.\n", + "\n", + "persist_to_repodir 接受两个可选参数: \n", + "- save_list: 默认为 [\"algodata\"], 是要持久化的数据.\n", + "- source: 默认为原目录, 你也可以手动指定为其他文件夹(通过 Path)\n", + "\n", + "现在做一些演练, 我们将创建一个位于 test_new_repo 的\"克隆\", 此时我们!\n", + "除非文件夹已经存在, Repo 对象将会为你自动创建新文件夹." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05eeaacc", + "metadata": {}, + "outputs": [], + "source": [ + "test_repo.persist_to_repodir(save_list=[\"schedule\", \"payload\", \"manifest\", \"typedef\", \"algodata\"], source=Path(\"test_new_repo\"))\n", + "!tree" + ] + }, + { + "cell_type": "markdown", + "id": "059d7bdf", + "metadata": {}, + "source": [ + "如你所见, test_new_repo 已被生成!" + ] + }, + { + "cell_type": "markdown", + "id": "4ef8925c", + "metadata": {}, + "source": [ + "# 数据结构\n", + "现在讲解 repo 的数据结构" + ] + }, + { + "cell_type": "markdown", + "id": "c19fed95", + "metadata": {}, + "source": [ + "## Lict 对象\n", + "Lict 对象集成了部分列表和字典的功能, 数据在这两种风格的 API 间都可用, 且修改是同步的. \n", + "Lict 默认情况下不会保存序列顺序, 而是在列表形式下, 自动按索引字符序排布, 详情请参阅源代码. \n", + "现在导入并初始化一个 Lict 对象:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e88bd7c", + "metadata": {}, + "outputs": [], + "source": [ + "from heurams.utils.lict import Lict\n", + "lct = Lict() # 空的\n", + "lct = Lict(initlist=[(\"name\", \"tom\"), (\"age\", 12), (\"enemy\", \"jerry\")]) # 基于列表\n", + "print(lct)\n", + "lct = Lict(initdict={\"name\": \"tom\", \"age\": 12, \"enemy\": \"jerry\"}) # 基于字典\n", + "print(lct)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4d760bf9", + "metadata": {}, + "source": [ + "### 输出形式\n", + "lct 的\"官方\"输出形式是列表形式\n", + "你也可以选择输出字典形式" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "248f6cba", + "metadata": {}, + "outputs": [], + "source": [ + "print(lct.dicted_data)" + ] + }, + { + "cell_type": "markdown", + "id": "29dce184", + "metadata": {}, + "source": [ + "### dicted_data 属性与修改方式\n", + "dicted_data 属性是一个字典, 它自动同步来自 Lict 对象操作的修改.\n", + "一个注意事项: 不要直接修改 dicted_data, 这将不会触发同步 hook.\n", + "如果你一定要这样做, 请在完事后手动运行同步 hook.\n", + "推荐的修改方式是直接把 lct 当作一个字典" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0eb07a7", + "metadata": {}, + "outputs": [], + "source": [ + "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", + "\n", + "# 错误的方式\n", + "lct.dicted_data[\"type\"] = \"cat\"\n", + "print(lct) # 将不会同步修改\n", + "\n", + "# 不推荐, 但可用的方式\n", + "lct.dicted_data[\"type\"] = \"cat\"\n", + "lct._sync_based_on_dict()\n", + "print(lct)\n", + "\n", + "# 推荐方式\n", + "lct['is_human'] = False\n", + "print(lct)" + ] + }, + { + "cell_type": "markdown", + "id": "2337d113", + "metadata": {}, + "source": [ + "### data 属性与修改方式\n", + "data 属性是一个列表, 它自动同步来自 Lict 对象操作的修改.\n", + "一个注意事项: 不要直接修改 data, 这将不会触发同步 hook, 并且可能破坏排序.\n", + "如果你一定要这样做, 请在完事后手动运行同步 hook 和 sort, 此处不演示.\n", + "推荐的修改方式是直接把 lct 当作一个列表, 且避免使用索引修改" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ab442d4", + "metadata": {}, + "outputs": [], + "source": [ + "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", + "\n", + "# 唯一推荐方式\n", + "lct.append(('enemy_2', 'spike'))\n", + "print(lct.dicted_data)" + ] + }, + { + "cell_type": "markdown", + "id": "a3383f59", + "metadata": {}, + "source": [ + "### 多面手\n", + "Lict 有一些很酷的功能\n", + "详情请看源文件\n", + "此处是一些例子" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3ca752f", + "metadata": {}, + "outputs": [], + "source": [ + "lct = Lict(initdict={'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'})\n", + "print(lct)\n", + "print(lct.dicted_data)\n", + "print(\"------\")\n", + "for i in lct:\n", + " print(i)\n", + "print(len(lct))\n", + "while len(lct) > 0:\n", + " print(lct.pop())\n", + " print(lct)\n", + "lct = Lict(initdict={'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'})\n", + "..." + ] + }, + { + "cell_type": "markdown", + "id": "2d6d3483", + "metadata": {}, + "source": [ + "关爱环境 从你我做起" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "773bf99c", + "metadata": {}, + "outputs": [], + "source": [ + "!rm -rf test_new_repo\n", + "!rm -rf heurams.log*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/test_repo/algodata.json b/examples/test_repo/algodata.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/examples/test_repo/algodata.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/examples/test_repo/manifest.toml b/examples/test_repo/manifest.toml new file mode 100644 index 0000000..6e5f567 --- /dev/null +++ b/examples/test_repo/manifest.toml @@ -0,0 +1,3 @@ +title = "测试单元: 过秦论" +author = "__heurams__" +desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/examples/test_repo/payload.toml b/examples/test_repo/payload.toml new file mode 100644 index 0000000..314995e --- /dev/null +++ b/examples/test_repo/payload.toml @@ -0,0 +1,11 @@ +["秦孝公据崤函之固, 拥雍州之地,"] +note = [] +content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" +translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," +keyword_note = {"据"="占据", "崤函"="崤山和函谷关", "雍州"="古代九州之一"} + +["君臣固守以窥周室,"] +note = [] +content = "君臣/固守/以窥/周室,/" +translation = "君臣牢固地守卫着,借以窥视周王室的权力," +keyword_note = {"窥"="窥视"} diff --git a/examples/test_repo/schedule.toml b/examples/test_repo/schedule.toml new file mode 100644 index 0000000..d62ef1f --- /dev/null +++ b/examples/test_repo/schedule.toml @@ -0,0 +1,5 @@ +schedule = ["quick_review", "recognition", "final_review"] +[phases] +quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] +recognition = [["Recognition", "1.0"]] +final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file diff --git a/examples/test_repo/typedef.toml b/examples/test_repo/typedef.toml new file mode 100644 index 0000000..d55cc86 --- /dev/null +++ b/examples/test_repo/typedef.toml @@ -0,0 +1,19 @@ +["古文句"] + +[annotation] +note = "笔记" +keyword_note = "关键词翻译" +translation = "语句翻译" +delimiter = "分隔符" +content = "内容" +tts_text = "文本转语音文本" + +["common"] +delimiter = "/" +tts_text = "eval:payload['content'].replace('/', '')" + +["puzzles"] # 谜题定义 +# 我们称 "Recognition" 为 recognition 谜题的 alia +"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } +"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/src/heurams/default/config/config.toml b/src/heurams/default/config/config.toml new file mode 100644 index 0000000..c7a3805 --- /dev/null +++ b/src/heurams/default/config/config.toml @@ -0,0 +1,61 @@ +# [调试] 将更改保存到文件 +persist_to_file = 1 + +# [调试] 覆写时间, 设为 -1 以禁用 +daystamp_override = -1 +timestamp_override = -1 + +# [调试] 一键通过 +quick_pass = 1 + +# 对于每个项目的默认新记忆原子数量 +scheduled_num = 8 + +# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 +timezone_offset = +28800 # 中国标准时间 (UTC+8) + +[interface] + +[interface.memorizor] +autovoice = true # 自动语音播放, 仅限于 recognition 组件 + +[algorithm] +default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS + +[puzzles] # 谜题默认配置 + +[puzzles.mcq] +max_riddles_num = 2 + +[puzzles.cloze] +min_denominator = 3 + +[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 +nucleon_dir = "./data/nucleon" +electron_dir = "./data/electron" +global_dir = "./data/global" # 全局数据路径, SM-15 等算法需要 +orbital_dir = "./data/orbital" +cache_dir = "./data/cache" +template_dir = "./data/template" + +[services] # 定义服务到提供者的映射 +audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) +tts = "edgetts" # 可选项: edgetts +llm = "openai" # 可选项: openai +sync = "webdav" # 可选项: 留空, webdav + +[providers.tts.edgetts] # EdgeTTS 设置 +voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) + +[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 +url = "" +key = "" + +[providers.sync.webdav] # WebDAV 同步设置 +url = "" +username = "" +password = "" +remote_path = "/heurams/" +verify_ssl = true + +[sync] diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index a203359..110c098 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -6,8 +6,8 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen -from .screens.repocreator import NucleonCreatorScreen from .screens.precache import PrecachingScreen +from .screens.repocreator import NucleonCreatorScreen from .screens.synctool import SyncScreen logger = get_logger(__name__) diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 8285937..2130824 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -7,8 +7,8 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen -from .screens.repocreator import NucleonCreatorScreen from .screens.precache import PrecachingScreen +from .screens.repocreator import NucleonCreatorScreen logger = get_logger(__name__) diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index bd8697a..fa26c29 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -1,5 +1,5 @@ -"""关于界面 -""" +"""关于界面""" + from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index f3be5c9..008b001 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -1,5 +1,5 @@ -"""仪表盘界面 -""" +"""仪表盘界面""" + import pathlib from textual.app import ComposeResult @@ -62,7 +62,8 @@ class DashboardScreen(Screen): Returns: dict: 包含显示文本的字典,键为行号 """ - from heurams.kernel.repository.particle_loader import load_electron, load_nucleon + from heurams.kernel.repository.particle_loader import (load_electron, + load_nucleon) result = {} filestem = pathlib.Path(filename).stem diff --git a/src/heurams/interface/screens/intelinote.py b/src/heurams/interface/screens/intelinote.py index a667d9c..4a489df 100644 --- a/src/heurams/interface/screens/intelinote.py +++ b/src/heurams/interface/screens/intelinote.py @@ -1,2 +1 @@ -"""笔记界面 -""" \ No newline at end of file +"""笔记界面""" diff --git a/src/heurams/interface/screens/memointegrity.py b/src/heurams/interface/screens/memointegrity.py index 3049c4c..a7fd862 100644 --- a/src/heurams/interface/screens/memointegrity.py +++ b/src/heurams/interface/screens/memointegrity.py @@ -1,2 +1 @@ -"""整体式记忆工作界面 -""" \ No newline at end of file +"""整体式记忆工作界面""" diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 9bc9149..150f130 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,5 +1,5 @@ -"""队列式记忆工作界面 -""" +"""队列式记忆工作界面""" + from enum import Enum, auto from textual.app import ComposeResult @@ -8,8 +8,8 @@ from textual.reactive import reactive from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static -import heurams.kernel.particles as pt import heurams.kernel.evaluators as pz +import heurams.kernel.particles as pt from heurams.context import config_var from heurams.kernel.reactor import * from heurams.services.logger import get_logger diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 3b24958..971464f 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -1,5 +1,5 @@ -"""缓存工具界面 -""" +"""缓存工具界面""" + import pathlib from textual.app import ComposeResult diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 1647807..bbdff3c 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -1,5 +1,5 @@ -"""记忆准备界面 -""" +"""记忆准备界面""" + from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.reactive import reactive diff --git a/src/heurams/interface/screens/radio.py b/src/heurams/interface/screens/radio.py index 3ccc1dd..dd05b12 100644 --- a/src/heurams/interface/screens/radio.py +++ b/src/heurams/interface/screens/radio.py @@ -1,2 +1 @@ -""""前进电台" 界面 -""" \ No newline at end of file +""" "前进电台" 界面""" diff --git a/src/heurams/interface/screens/repocreator.py b/src/heurams/interface/screens/repocreator.py index ff36b35..74e27cd 100644 --- a/src/heurams/interface/screens/repocreator.py +++ b/src/heurams/interface/screens/repocreator.py @@ -1,5 +1,5 @@ -"""仓库创建向导界面 -""" +"""仓库创建向导界面""" + from pathlib import Path import toml diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index 4e2c337..e38b369 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -1,5 +1,5 @@ -"""同步工具界面 -""" +"""同步工具界面""" + import pathlib import time diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 6dbe361..1868282 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -4,8 +4,8 @@ import random from typing import TypedDict import heurams.interface.widgets as pzw -import heurams.kernel.particles as pt import heurams.kernel.evaluators as pz +import heurams.kernel.particles as pt staging = {} # 细粒度缓存区, 是 ident -> quality 的封装 diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 5278969..e342116 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -7,8 +7,8 @@ from textual.message import Message from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.particles as pt import heurams.kernel.evaluators as pz +import heurams.kernel.particles as pt from heurams.services.logger import get_logger from .base_puzzle_widget import BasePuzzleWidget diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 56820b6..878b4e9 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -5,8 +5,8 @@ from textual.containers import Container, ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.particles as pt import heurams.kernel.evaluators as pz +import heurams.kernel.particles as pt from heurams.services.hasher import hash from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index c1e6fa8..1914f78 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -1,8 +1,8 @@ from heurams.services.logger import get_logger +from .base import BaseAlgorithm from .sm2 import SM2Algorithm from .sm15m import SM15MAlgorithm -from .base import BaseAlgorithm logger = get_logger(__name__) diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index 3c0dbfb..18c30ae 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -75,4 +75,3 @@ class BaseAlgorithm: return 1 except: return 0 - \ No newline at end of file diff --git a/src/heurams/kernel/evaluators/guess.py b/src/heurams/kernel/evaluators/guess.py index 6b30b3e..c9945f6 100644 --- a/src/heurams/kernel/evaluators/guess.py +++ b/src/heurams/kernel/evaluators/guess.py @@ -6,6 +6,7 @@ from .base import BaseEvaluator logger = get_logger(__name__) + class GuessEvaluator(BaseEvaluator): def __init__(self): - super().__init__() \ No newline at end of file + super().__init__() diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index 93edc74..dffbc82 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -1,4 +1,4 @@ from .atom import Atom from .electron import Electron from .nucleon import Nucleon -from .orbital import Orbital \ No newline at end of file +from .orbital import Orbital diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 46cd7e2..acef5b8 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -5,7 +5,6 @@ from typing import TypedDict import toml -from heurams.context import config_var from heurams.services.logger import get_logger from .electron import Electron @@ -19,11 +18,13 @@ class AtomRegister_runtime(TypedDict): min_rate: int # 最低评分 new_activation: bool # 新激活 + class AtomRegister(TypedDict): nucleon: Nucleon electron: Electron runtime: AtomRegister_runtime + class Atom: """ 统一处理一系列对象的所有信息与持久化: @@ -39,10 +40,10 @@ class Atom: "new_activation": False, } - def __init__(self, nucleon_obj = None, electron_obj = None, orbital_obj = None): - self.ident = nucleon_obj["ident"] # type: ignore + def __init__(self, nucleon_obj=None, electron_obj=None, orbital_obj=None): + self.ident = nucleon_obj["ident"] # type: ignore self.registry: AtomRegister = { # type: ignore - "ident": nucleon_obj["ident"], # type: ignore + "ident": nucleon_obj["ident"], # type: ignore "nucleon": nucleon_obj, "electron": electron_obj, "orbital": orbital_obj, @@ -53,7 +54,7 @@ class Atom: self.registry["runtime"]["new_activation"] = True def init_runtime(self): - self.registry['runtime'] = AtomRegister_runtime(**self.default_runtime) + self.registry["runtime"] = AtomRegister_runtime(**self.default_runtime) def minimize(self, rating): """效果等同于 self.registry['runtime']['min_rate'] = min(rating, self.registry['runtime']['min_rate']) @@ -97,4 +98,4 @@ class Atom: def __setitem__(self, key, value): if key == "ident": raise AttributeError("应为只读") - self.registry[key] = value \ No newline at end of file + self.registry[key] = value diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 3e0b352..dd5e7ab 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -1,12 +1,14 @@ +from copy import deepcopy from typing import TypedDict + +import heurams.kernel.algorithms as algolib import heurams.services.timer as timer -from heurams.context import config_var from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger -import heurams.kernel.algorithms as algolib -from copy import deepcopy + logger = get_logger(__name__) + class Electron: """电子: 单算法支持的记忆数据包装""" @@ -89,11 +91,11 @@ class Electron: def __len__(self): """仅返回当前算法的配置数量""" return len(self.algodata[self.algo.algo_name]) - + @staticmethod def create_on_electonic_data(electronic_data: tuple, algo_name: str = ""): _data = electronic_data ident = _data[0] algodata = _data[1] ident = ident - return Electron(ident, algodata, algo_name) \ No newline at end of file + return Electron(ident, algodata, algo_name) diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index b836742..ea479cb 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,17 +1,17 @@ -from heurams.services.logger import get_logger from copy import deepcopy + +from heurams.services.logger import get_logger from heurams.utils.evalizor import Evalizer + logger = get_logger(__name__) + class Nucleon: - """原子核: 带有运行时隔离的模板化只读材料元数据容器 - """ + """原子核: 带有运行时隔离的模板化只读材料元数据容器""" def __init__(self, ident, payload, common): self.ident = ident - env = { - "payload": payload - } + env = {"payload": payload} self.evalizer = Evalizer(environment=env) self.data = self.evalizer(deepcopy((payload | common))) @@ -19,10 +19,10 @@ class Nucleon: if key == "ident": return self.ident return self.data[key] - + def __setitem__(self, key, value): raise AttributeError("应为只读") - + def __delitem__(self, key): raise AttributeError("应为只读") @@ -31,12 +31,12 @@ class Nucleon: def __contains__(self, key): return key in (self.data) - + def get(self, key, default=None): if key in self: return self[key] return default - + def __len__(self): return len(self.data) @@ -48,5 +48,5 @@ class Nucleon: _data = nucleonic_data payload = _data[1][0] common = _data[1][1] - ident = _data[0] #TODO:实现eval - return Nucleon(ident, payload, common) \ No newline at end of file + ident = _data[0] # TODO:实现eval + return Nucleon(ident, payload, common) diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py index f2e51e3..ca5f0d7 100644 --- a/src/heurams/kernel/particles/orbital.py +++ b/src/heurams/kernel/particles/orbital.py @@ -1,14 +1,16 @@ -from heurams.utils.lict import Lict from heurams.utils.evalizor import Evalizer +from heurams.utils.lict import Lict -class Orbital(): + +class Orbital: @classmethod def create_orbital(cls, schedule: list, phase_def: dict): - phase_def = Lict(initdict=phase_def) # type: ignore + phase_def = Lict(initdict=phase_def) # type: ignore orbital = Lict() for i in schedule: orbital[i] = Lict(phase_def[i]) return orbital + @classmethod def create_orbital_on_orbitic_data(cls, orbitic_data): - return cls.create_orbital(orbitic_data["schedule"], orbitic_data["phases"]) \ No newline at end of file + return cls.create_orbital(orbitic_data["schedule"], orbitic_data["phases"]) diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index e57b791..01bfe6c 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -1,7 +1,7 @@ import random -import heurams.kernel.particles as pt import heurams.kernel.evaluators as puz +import heurams.kernel.particles as pt from heurams.services.logger import get_logger from .states import PhaserState diff --git a/src/heurams/kernel/repomgr/__init__.py b/src/heurams/kernel/repolib/__init__.py similarity index 100% rename from src/heurams/kernel/repomgr/__init__.py rename to src/heurams/kernel/repolib/__init__.py diff --git a/src/heurams/kernel/repomgr/aux.py b/src/heurams/kernel/repolib/aux.py similarity index 100% rename from src/heurams/kernel/repomgr/aux.py rename to src/heurams/kernel/repolib/aux.py index 3d0b41f..068231e 100644 --- a/src/heurams/kernel/repomgr/aux.py +++ b/src/heurams/kernel/repolib/aux.py @@ -1,5 +1,5 @@ from ...utils.lict import Lict + def merge(x: Lict, y: Lict): return Lict(list(x.values()) + list(y.values())) - diff --git a/src/heurams/kernel/repomgr/navi.py b/src/heurams/kernel/repolib/navi.py similarity index 59% rename from src/heurams/kernel/repomgr/navi.py rename to src/heurams/kernel/repolib/navi.py index 46679c8..bbd2449 100644 --- a/src/heurams/kernel/repomgr/navi.py +++ b/src/heurams/kernel/repolib/navi.py @@ -1,3 +1,3 @@ -class Navi(): +class Navi: def __init__(self, init) -> None: - pass \ No newline at end of file + pass diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repolib/repo.py similarity index 80% rename from src/heurams/kernel/repomgr/repo.py rename to src/heurams/kernel/repolib/repo.py index db1d3b9..9973bf0 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -1,11 +1,15 @@ +import json from functools import reduce from pathlib import Path -import heurams.kernel.particles as pt + import toml -import json + +import heurams.kernel.particles as pt + from ...utils.lict import Lict -class Repo(): + +class Repo: file_mapping = { "schedule": "schedule.toml", "payload": "payload.toml", @@ -24,13 +28,21 @@ class Repo(): default_save_list = ["algodata"] - def __init__(self, schedule: dict, payload: Lict, manifest: dict, typedef: dict, algodata: Lict, source = None) -> None: + def __init__( + self, + schedule: dict, + payload: Lict, + manifest: dict, + typedef: dict, + algodata: Lict, + source=None, + ) -> None: self.schedule: dict = schedule self.manifest: dict = manifest self.typedef: dict = typedef self.payload: Lict = payload self.algodata: Lict = algodata - self.source: Path | None = source # 若存在, 指向 repo 所在 dir + self.source: Path | None = source # 若存在, 指向 repo 所在 dir self.database = { "schedule": self.schedule, "payload": self.payload, @@ -42,35 +54,43 @@ class Repo(): self.generate_particles_data() def generate_particles_data(self): - self.nucleonic_data_lict = Lict(initlist=list(map(self._attach(self.typedef), self.payload))) + + self.nucleonic_data_lict = Lict( + initlist=list(map( + self._nucleonic_proc, + self.payload)) + ) self.electronic_data_lict = self.algodata self.orbitic_data = self.schedule - @staticmethod - def _attach(value): - def inner(x): - return (x, value) - return inner + def _nucleonic_proc(self, unit): + ident = unit[0] + common = self.typedef["common"] + return (ident, (unit[1], common)) @staticmethod def _merge(value): def inner(x): - return map(x, value) + return (x, value) + return inner def __len__(self): return len(self.payload) - def persist_to_repodir(self, save_list: list | None = None, source: Path | None= None): + def persist_to_repodir( + self, save_list: list | None = None, source: Path | None = None + ): if save_list == None: save_list = self.default_save_list if self.source != None and source == None: source = self.source if source == None: raise FileNotFoundError("不存在仓库到文件的映射") + source.mkdir(parents=True, exist_ok=False) for keyname in save_list: filename = self.file_mapping[keyname] - with open(source / filename, 'w') as f: + with open(source / filename, "w") as f: try: dict_data = self.database[keyname].dicted_data except: @@ -81,22 +101,22 @@ class Repo(): json.dump(dict_data, f) else: raise ValueError(f"不支持的文件类型: {filename}") - + def export_to_single_dict(self): return self.database - + @classmethod - def create_new_repo(cls, source = None): + def create_new_repo(cls, source=None): default_database = { "schedule": {}, "payload": Lict([]), "algodata": Lict([]), "manifest": {}, "typedef": {}, - "source": source + "source": source, } return Repo(**default_database) - + @classmethod def create_from_repodir(cls, source: Path): database = {} @@ -117,17 +137,17 @@ class Repo(): raise ValueError(f"不支持的数据容器: {cls.type_mapping[keyname]}") database["source"] = source return Repo(**database) - + @classmethod def create_from_single_dict(cls, dictdata, source: Path | None = None): database = dictdata database["source"] = source return Repo(**database) - + @classmethod def check_repodir(cls, source: Path): try: cls.create_from_repodir(source) return 1 except: - return 0 \ No newline at end of file + return 0 diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py index 0638cd0..4cf5020 100644 --- a/src/heurams/utils/evalizor.py +++ b/src/heurams/utils/evalizor.py @@ -1,18 +1,19 @@ -class Evalizer(): +class Evalizer: """几乎无副作用的模板系统 - 接受环境信息并创建一个模板解析工具, 工具传入参数支持list, dict及其嵌套 + 接受环境信息并创建一个模板解析工具, 工具传入参数支持list, dict及其嵌套 副作用问题: 仅存在于 eval 函数 """ + # TODO: 弃用风险极高的 eval # 理论上已经限制了全局函数 但eval仍有风险 # TODO: 异步/多线程执行避免堵塞 def __init__(self, environment: dict) -> None: self.env = environment - + def __call__(self, anyobj): return self.travel(anyobj) - + def travel(self, anyobj): if isinstance(anyobj, list): return list(map(self.travel, anyobj)) @@ -30,4 +31,4 @@ class Evalizer(): ret = eval(s, {}, self.env) if not isinstance(ret, str): ret = str(ret) - return ret \ No newline at end of file + return ret diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index 5e05282..40559c6 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -1,23 +1,29 @@ - from collections import UserList from typing import Any, Iterator -class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) - """"列典" 对象 - 同时兼容字典和列表大多数 API, 两边数据同步的容器 - 列表数据是 dictobj.items() 的格式 +class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) + """ "列典" 对象 + + 同时兼容字典和列表大多数 API, 两边数据同步的容器 + 列表数据是 dictobj.items() 的格式 支持根据字典或列表初始化 限制要求: - 键名一定唯一, 且仅能为字符串 - 值一定是引用对象 - 不使用并发 - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 - + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + 只有在 Python 3.7+ 中, forced_order 行为才能被取消. """ - def __init__(self, initlist: list | None = None, initdict: dict | None = None, forced_order = True): + + def __init__( + self, + initlist: list | None = None, + initdict: dict | None = None, + forced_order=True, + ): self.dicted_data = {} if initdict != None: initlist = list(initdict.items()) @@ -26,7 +32,7 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) self._sync_based_on_list() if self.forced_order: self.data.sort() - + def _sync_based_on_dict(self): self.data = list(self.dicted_data.items()) if self.forced_order: @@ -45,7 +51,7 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) return self.dicted_data[i] else: return super().__getitem__(i) - + def __setitem__(self, i, item): if isinstance(i, str): self.dicted_data[i] = item @@ -55,7 +61,7 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) raise NotImplementedError super().__setitem__(i, item) self._sync_based_on_list() - + def __delitem__(self, i): if isinstance(i, str): del self.dicted_data[i] @@ -65,25 +71,29 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) self._sync_based_on_list() def __contains__(self, item): - return (item in self.data or item in self.keys() or item in self.values()) + return item in self.data or item in self.keys() or item in self.values() def append(self, item: Any) -> None: if item != (item[0], item[1]): raise NotImplementedError super().append(item) self._sync_based_on_list() - + if self.forced_order: + self.data.sort() + def insert(self, i: int, item: Any) -> None: - if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 + if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 raise NotImplementedError super().insert(i, item) self._sync_based_on_list() - + if self.forced_order: + self.data.sort() + def pop(self, i: int = -1) -> Any: res = super().pop(i) self._sync_based_on_list() return res - + def remove(self, item: Any) -> None: if isinstance(item, str): item = (item, self.dicted_data[item]) @@ -91,29 +101,31 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) raise NotImplementedError super().remove(item) self._sync_based_on_list() - + if self.forced_order: + self.data.sort() + def clear(self) -> None: super().clear() self._sync_based_on_list() - + def index(self): raise NotImplementedError - + def extend(self): raise NotImplementedError - + def sort(self): raise NotImplementedError - + def reverse(self): raise NotImplementedError def keys(self): return self.dicted_data.keys() - + def values(self): return self.dicted_data.values() - + def items(self): return self.data @@ -122,4 +134,4 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) @classmethod def key_equality(cls, a, b): - return a.keys() == b.keys() \ No newline at end of file + return a.keys() == b.keys() diff --git a/src/heurams/utils/refvar.py b/src/heurams/utils/refvar.py index 939d22c..12aab09 100644 --- a/src/heurams/utils/refvar.py +++ b/src/heurams/utils/refvar.py @@ -1,241 +1,241 @@ class RefVar: def __init__(self, initvalue) -> None: self.data = initvalue - + def __repr__(self) -> str: return f"RefVar({repr(self.data)})" - + def __str__(self) -> str: return str(self.data) - + def __add__(self, other): if isinstance(other, RefVar): return RefVar(self.data + other.data) return RefVar(self.data + other) - + def __radd__(self, other): return RefVar(other + self.data) - + def __sub__(self, other): if isinstance(other, RefVar): return RefVar(self.data - other.data) return RefVar(self.data - other) - + def __rsub__(self, other): return RefVar(other - self.data) - + def __mul__(self, other): if isinstance(other, RefVar): return RefVar(self.data * other.data) return RefVar(self.data * other) - + def __rmul__(self, other): return RefVar(other * self.data) - + def __truediv__(self, other): if isinstance(other, RefVar): return RefVar(self.data / other.data) return RefVar(self.data / other) - + def __rtruediv__(self, other): return RefVar(other / self.data) - + def __floordiv__(self, other): if isinstance(other, RefVar): return RefVar(self.data // other.data) return RefVar(self.data // other) - + def __rfloordiv__(self, other): return RefVar(other // self.data) - + def __mod__(self, other): if isinstance(other, RefVar): return RefVar(self.data % other.data) return RefVar(self.data % other) - + def __rmod__(self, other): return RefVar(other % self.data) - + def __pow__(self, other): if isinstance(other, RefVar): - return RefVar(self.data ** other.data) - return RefVar(self.data ** other) - + return RefVar(self.data**other.data) + return RefVar(self.data**other) + def __rpow__(self, other): - return RefVar(other ** self.data) - + return RefVar(other**self.data) + def __neg__(self): return RefVar(-self.data) - + def __pos__(self): return RefVar(+self.data) - + def __abs__(self): return RefVar(abs(self.data)) - + def __eq__(self, other): if isinstance(other, RefVar): return self.data == other.data return self.data == other - + def __ne__(self, other): return not self.__eq__(other) - + def __lt__(self, other): if isinstance(other, RefVar): return self.data < other.data return self.data < other - + def __le__(self, other): if isinstance(other, RefVar): return self.data <= other.data return self.data <= other - + def __gt__(self, other): if isinstance(other, RefVar): return self.data > other.data return self.data > other - + def __ge__(self, other): if isinstance(other, RefVar): return self.data >= other.data return self.data >= other - + # 位运算 def __and__(self, other): if isinstance(other, RefVar): return RefVar(self.data & other.data) return RefVar(self.data & other) - + def __rand__(self, other): return RefVar(other & self.data) - + def __or__(self, other): if isinstance(other, RefVar): return RefVar(self.data | other.data) return RefVar(self.data | other) - + def __ror__(self, other): return RefVar(other | self.data) - + def __xor__(self, other): if isinstance(other, RefVar): return RefVar(self.data ^ other.data) return RefVar(self.data ^ other) - + def __rxor__(self, other): return RefVar(other ^ self.data) - + def __lshift__(self, other): if isinstance(other, RefVar): return RefVar(self.data << other.data) return RefVar(self.data << other) - + def __rlshift__(self, other): return RefVar(other << self.data) - + def __rshift__(self, other): if isinstance(other, RefVar): return RefVar(self.data >> other.data) return RefVar(self.data >> other) - + def __rrshift__(self, other): return RefVar(other >> self.data) - + def __invert__(self): return RefVar(~self.data) - + # 类型转换 def __int__(self): return int(self.data) - + def __float__(self): return float(self.data) - + def __bool__(self): return bool(self.data) - + def __complex__(self): return complex(self.data) - + def __bytes__(self): return bytes(self.data) - + def __hash__(self): return hash(self.data) - + # 容器操作(如果底层数据支持) def __len__(self): return len(self.data) - + def __getitem__(self, key): return self.data[key] - + def __setitem__(self, key, value): self.data[key] = value - + def __delitem__(self, key): del self.data[key] - + def __contains__(self, item): return item in self.data - + def __iter__(self): return iter(self.data) - + def __iadd__(self, other): if isinstance(other, RefVar): self.data += other.data else: self.data += other return self - + def __isub__(self, other): if isinstance(other, RefVar): self.data -= other.data else: self.data -= other return self - + def __imul__(self, other): if isinstance(other, RefVar): self.data *= other.data else: self.data *= other return self - + def __itruediv__(self, other): if isinstance(other, RefVar): self.data /= other.data else: self.data /= other return self - + def __ifloordiv__(self, other): if isinstance(other, RefVar): self.data //= other.data else: self.data //= other return self - + def __imod__(self, other): if isinstance(other, RefVar): self.data %= other.data else: self.data %= other return self - + def __ipow__(self, other): if isinstance(other, RefVar): self.data **= other.data else: self.data **= other return self - + def __call__(self, *args, **kwargs): if callable(self.data): return self.data(*args, **kwargs) raise TypeError(f"'{type(self.data).__name__}' object is not callable") - + def __getattr__(self, name): - return getattr(self.data, name) \ No newline at end of file + return getattr(self.data, name) From f2d91b016410cbd2d99d7a72ad17b5a5a5295005 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Fri, 2 Jan 2026 06:12:49 +0800 Subject: [PATCH 07/79] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=95=8C=E9=9D=A2=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 12 +- data/repo/test/manifest.toml | 2 +- examples/repo.ipynb | 372 ++++++++++++++++-- examples/simplemem.py | 12 + src/heurams/context.py | 38 +- src/heurams/default/config/config.toml | 7 +- src/heurams/interface/__init__.py | 7 +- src/heurams/interface/__main__.py | 2 +- src/heurams/interface/screens/dashboard.py | 172 ++++---- src/heurams/interface/screens/preparation.py | 25 +- src/heurams/interface/screens/repocreator.py | 4 +- src/heurams/kernel/algorithms/sm15m.py | 2 +- src/heurams/kernel/particles/electron.py | 7 +- src/heurams/kernel/particles/nucleon.py | 4 +- src/heurams/kernel/reactor/__init__.py | 12 - src/heurams/kernel/reactor/phaser.py | 69 +--- src/heurams/kernel/reactor/procession.py | 92 +---- src/heurams/kernel/reactor1/__init__.py | 12 + .../kernel/{reactor => reactor1}/fission.py | 0 src/heurams/kernel/reactor1/phaser.py | 51 +++ src/heurams/kernel/reactor1/procession.py | 74 ++++ .../kernel/{reactor => reactor1}/states.py | 0 src/heurams/kernel/repolib/repo.py | 26 +- src/heurams/utils/evalizor.py | 7 +- src/heurams/utils/lict.py | 12 + tests/kernel/reactor/test_phaser.py | 2 +- 26 files changed, 700 insertions(+), 323 deletions(-) create mode 100644 examples/simplemem.py create mode 100644 src/heurams/kernel/reactor1/__init__.py rename src/heurams/kernel/{reactor => reactor1}/fission.py (100%) create mode 100644 src/heurams/kernel/reactor1/phaser.py create mode 100644 src/heurams/kernel/reactor1/procession.py rename src/heurams/kernel/{reactor => reactor1}/states.py (100%) diff --git a/data/config/config.toml b/data/config/config.toml index c7a3805..eb225ae 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -31,13 +31,11 @@ max_riddles_num = 2 min_denominator = 3 [paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -nucleon_dir = "./data/nucleon" -electron_dir = "./data/electron" -global_dir = "./data/global" # 全局数据路径, SM-15 等算法需要 -orbital_dir = "./data/orbital" -cache_dir = "./data/cache" -template_dir = "./data/template" - +data = "./data" +cache = "./data/cache" +config = "./data/config" +global = "./data/global" +repo = "./data/repo" [services] # 定义服务到提供者的映射 audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) tts = "edgetts" # 可选项: edgetts diff --git a/data/repo/test/manifest.toml b/data/repo/test/manifest.toml index 6e5f567..5929408 100644 --- a/data/repo/test/manifest.toml +++ b/data/repo/test/manifest.toml @@ -1,3 +1,3 @@ -title = "测试单元: 过秦论" +title = "测试单元 (过秦论)" author = "__heurams__" desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/examples/repo.ipynb b/examples/repo.ipynb index 8688803..5feb1ae 100644 --- a/examples/repo.ipynb +++ b/examples/repo.ipynb @@ -21,10 +21,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "a5ed9864", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;34m.\u001b[0m\n", + "├── \u001b[00mrepo.ipynb\u001b[0m\n", + "└── \u001b[01;34mtest_repo\u001b[0m\n", + " ├── \u001b[00malgodata.json\u001b[0m\n", + " ├── \u001b[00mmanifest.toml\u001b[0m\n", + " ├── \u001b[00mpayload.toml\u001b[0m\n", + " ├── \u001b[00mschedule.toml\u001b[0m\n", + " └── \u001b[00mtypedef.toml\u001b[0m\n", + "\n", + "2 directories, 6 files\n" + ] + } + ], "source": [ "!tree # 了解文件结构" ] @@ -39,10 +56,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "9777730e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zsh:1: no matches found: heurams.log*\n" + ] + } + ], "source": [ "!rm -rf test_new_repo\n", "!rm -rf heurams.log*" @@ -60,10 +85,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "bf1b00c8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "欢迎使用 HeurAMS 及其组件!\n", + "rootdir: /mnt/data/Devel/HeurAMS/HeurAMS/src/heurams\n", + "workdir: /mnt/data/Devel/HeurAMS/HeurAMS/examples\n", + "未能加载自定义用户配置\n" + ] + } + ], "source": [ "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", @@ -82,10 +118,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "897b62d7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "这是一个 合规 的 repo!\n" + ] + } + ], "source": [ "is_vaild = repolib.Repo.check_repodir(Path(\"./test_repo\"))\n", "print(f\"这是一个 {'合规' if is_vaild else '不合规'} 的 repo!\")" @@ -102,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "708ae7e4", "metadata": {}, "outputs": [], @@ -123,10 +167,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "a11115fb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'algodata': [('君臣固守以窥周室,', {}), ('秦孝公据崤函之固, 拥雍州之地,', {})],\n", + " 'manifest': {'author': '__heurams__',\n", + " 'desc': '高考古诗文: 过秦论',\n", + " 'title': '测试单元: 过秦论'},\n", + " 'payload': [('君臣固守以窥周室,',\n", + " {'content': '君臣/固守/以窥/周室,/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'}),\n", + " ('秦孝公据崤函之固, 拥雍州之地,',\n", + " {'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", + " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", + " 'note': [],\n", + " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'})],\n", + " 'schedule': {'phases': {'final_review': [['FillBlank', '0.7'],\n", + " ['SelectMeaning', '0.7'],\n", + " ['Recognition', '1.0']],\n", + " 'quick_review': [['FillBlank', '1.0'],\n", + " ['SelectMeaning', '0.5'],\n", + " ['Recognition', '1.0']],\n", + " 'recognition': [['Recognition', '1.0']]},\n", + " 'schedule': ['quick_review', 'recognition', 'final_review']},\n", + " 'source': PosixPath('test_repo'),\n", + " 'typedef': {'annotation': {'content': '内容',\n", + " 'delimiter': '分隔符',\n", + " 'keyword_note': '关键词翻译',\n", + " 'note': '笔记',\n", + " 'translation': '语句翻译',\n", + " 'tts_text': '文本转语音文本'},\n", + " 'common': {'delimiter': '/',\n", + " 'tts_text': \"eval:payload['content'].replace('/', '')\"},\n", + " 'puzzles': {'FillBlank': {'__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': \"eval:metadata['formation']['delimiter']\",\n", + " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", + " 'text': \"eval:payload['content']\"},\n", + " 'Recognition': {'__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': \"eval:payload['content']\",\n", + " 'secondary': [\"eval:payload['keyword_note']\",\n", + " \"eval:payload['note']\"],\n", + " 'top_dim': [\"eval:payload['translation']\"]},\n", + " 'SelectMeaning': {'__hint__': \"eval:payload['content']\",\n", + " '__origin__': 'mcq',\n", + " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", + " 'mapping': \"eval:payload['keyword_note']\",\n", + " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': \"eval:payload['content']\"}},\n", + " '古文句': {}}}\n" + ] + } + ], "source": [ "test_repo_dic = test_repo.export_to_single_dict()\n", "from pprint import pprint\n", @@ -157,10 +258,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "05eeaacc", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;34m.\u001b[0m\n", + "├── \u001b[00mheurams.log\u001b[0m\n", + "├── \u001b[00mrepo.ipynb\u001b[0m\n", + "├── \u001b[01;34mtest_new_repo\u001b[0m\n", + "│   ├── \u001b[00malgodata.json\u001b[0m\n", + "│   ├── \u001b[00mmanifest.toml\u001b[0m\n", + "│   ├── \u001b[00mpayload.toml\u001b[0m\n", + "│   ├── \u001b[00mschedule.toml\u001b[0m\n", + "│   └── \u001b[00mtypedef.toml\u001b[0m\n", + "└── \u001b[01;34mtest_repo\u001b[0m\n", + " ├── \u001b[00malgodata.json\u001b[0m\n", + " ├── \u001b[00mmanifest.toml\u001b[0m\n", + " ├── \u001b[00mpayload.toml\u001b[0m\n", + " ├── \u001b[00mschedule.toml\u001b[0m\n", + " └── \u001b[00mtypedef.toml\u001b[0m\n", + "\n", + "3 directories, 12 files\n" + ] + } + ], "source": [ "test_repo.persist_to_repodir(save_list=[\"schedule\", \"payload\", \"manifest\", \"typedef\", \"algodata\"], source=Path(\"test_new_repo\"))\n", "!tree" @@ -196,10 +321,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "7e88bd7c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n", + "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n" + ] + } + ], "source": [ "from heurams.utils.lict import Lict\n", "lct = Lict() # 空的\n", @@ -221,10 +355,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "248f6cba", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'tom', 'age': 12, 'enemy': 'jerry'}\n" + ] + } + ], "source": [ "print(lct.dicted_data)" ] @@ -243,10 +385,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "a0eb07a7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n", + "[('age', 12), ('enemy', 'jerry'), ('name', 'tom'), ('type', 'cat')]\n", + "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n" + ] + } + ], "source": [ "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", "\n", @@ -278,10 +430,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "0ab442d4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'}\n" + ] + } + ], "source": [ "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", "\n", @@ -303,10 +463,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "f3ca752f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n", + "{'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'}\n", + "------\n", + "('age', 12)\n", + "('enemy', 'jerry')\n", + "('enemy_2', 'spike')\n", + "('is_human', False)\n", + "('name', 'tom')\n", + "('type', 'cat')\n", + "6\n", + "('type', 'cat')\n", + "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False), ('name', 'tom')]\n", + "('name', 'tom')\n", + "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False)]\n", + "('is_human', False)\n", + "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike')]\n", + "('enemy_2', 'spike')\n", + "[('age', 12), ('enemy', 'jerry')]\n", + "('enemy', 'jerry')\n", + "[('age', 12)]\n", + "('age', 12)\n", + "[]\n" + ] + }, + { + "data": { + "text/plain": [ + "Ellipsis" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "lct = Lict(initdict={'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'})\n", "print(lct)\n", @@ -332,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "773bf99c", "metadata": {}, "outputs": [], @@ -340,6 +539,131 @@ "!rm -rf test_new_repo\n", "!rm -rf heurams.log*" ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8645c5a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ 'content': '君臣/固守/以窥/周室,/',\n", + " 'delimiter': '/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,',\n", + " 'tts_text': '君臣固守以窥周室,'}\n", + "{ 'SM-2': { 'efactor': 2.5,\n", + " 'interval': 1,\n", + " 'is_activated': 1,\n", + " 'last_date': 20454,\n", + " 'last_modify': 1767274438.752494,\n", + " 'next_date': 20455,\n", + " 'real_rept': 1,\n", + " 'rept': 0}}\n", + "{ 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", + " 'delimiter': '/',\n", + " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", + " 'note': [],\n", + " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,',\n", + " 'tts_text': '秦孝公据崤函之固, 拥雍州之地,'}\n", + "{ 'SM-2': { 'efactor': 2.5,\n", + " 'interval': 1,\n", + " 'is_activated': 1,\n", + " 'last_date': 20454,\n", + " 'last_modify': 1767274438.7534873,\n", + " 'next_date': 20455,\n", + " 'real_rept': 1,\n", + " 'rept': 0}}\n", + "{ 'algodata': [ ( '君臣固守以窥周室,',\n", + " { 'SM-2': { 'efactor': 2.5,\n", + " 'interval': 1,\n", + " 'is_activated': 1,\n", + " 'last_date': 20454,\n", + " 'last_modify': 1767274438.752494,\n", + " 'next_date': 20455,\n", + " 'real_rept': 1,\n", + " 'rept': 0}}),\n", + " ( '秦孝公据崤函之固, 拥雍州之地,',\n", + " { 'SM-2': { 'efactor': 2.5,\n", + " 'interval': 1,\n", + " 'is_activated': 1,\n", + " 'last_date': 20454,\n", + " 'last_modify': 1767274438.7534873,\n", + " 'next_date': 20455,\n", + " 'real_rept': 1,\n", + " 'rept': 0}})],\n", + " 'manifest': { 'author': '__heurams__',\n", + " 'desc': '高考古诗文: 过秦论',\n", + " 'title': '测试单元: 过秦论'},\n", + " 'payload': [ ( '君臣固守以窥周室,',\n", + " { 'content': '君臣/固守/以窥/周室,/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'}),\n", + " ( '秦孝公据崤函之固, 拥雍州之地,',\n", + " { 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", + " 'keyword_note': { '崤函': '崤山和函谷关',\n", + " '据': '占据',\n", + " '雍州': '古代九州之一'},\n", + " 'note': [],\n", + " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'})],\n", + " 'schedule': { 'phases': { 'final_review': [ ['FillBlank', '0.7'],\n", + " ['SelectMeaning', '0.7'],\n", + " ['Recognition', '1.0']],\n", + " 'quick_review': [ ['FillBlank', '1.0'],\n", + " ['SelectMeaning', '0.5'],\n", + " ['Recognition', '1.0']],\n", + " 'recognition': [['Recognition', '1.0']]},\n", + " 'schedule': [ 'quick_review',\n", + " 'recognition',\n", + " 'final_review']},\n", + " 'source': PosixPath('test_repo'),\n", + " 'typedef': { 'annotation': { 'content': '内容',\n", + " 'delimiter': '分隔符',\n", + " 'keyword_note': '关键词翻译',\n", + " 'note': '笔记',\n", + " 'translation': '语句翻译',\n", + " 'tts_text': '文本转语音文本'},\n", + " 'common': { 'delimiter': '/',\n", + " 'tts_text': \"eval:payload['content'].replace('/', \"\n", + " \"'')\"},\n", + " 'puzzles': { 'FillBlank': { '__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': \"eval:metadata['formation']['delimiter']\",\n", + " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", + " 'text': \"eval:payload['content']\"},\n", + " 'Recognition': { '__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': \"eval:payload['content']\",\n", + " 'secondary': [ \"eval:payload['keyword_note']\",\n", + " \"eval:payload['note']\"],\n", + " 'top_dim': [ \"eval:payload['translation']\"]},\n", + " 'SelectMeaning': { '__hint__': \"eval:payload['content']\",\n", + " '__origin__': 'mcq',\n", + " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", + " 'mapping': \"eval:payload['keyword_note']\",\n", + " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': \"eval:payload['content']\"}},\n", + " '古文句': {}}}\n" + ] + } + ], + "source": [ + "repo = repolib.Repo.create_from_repodir(Path('./test_repo'))\n", + "for i in repo.ident_index:\n", + " n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i))\n", + " e = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i))\n", + " e.activate()\n", + " e.revisor(5, True)\n", + " print(repr(n))\n", + " print(repr(e))\n", + "print(repo)" + ] } ], "metadata": { diff --git a/examples/simplemem.py b/examples/simplemem.py new file mode 100644 index 0000000..48e13c4 --- /dev/null +++ b/examples/simplemem.py @@ -0,0 +1,12 @@ +import heurams.kernel.repolib as repolib +import heurams.kernel.particles as pt +from pathlib import Path +repo = repolib.Repo.create_from_repodir(Path('./test_repo')) +for i in repo.ident_index: + n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) + e = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i)) + e.activate() + e.revisor(5, True) + print(repr(n)) + print(repr(e)) +print(repo) \ No newline at end of file diff --git a/src/heurams/context.py b/src/heurams/context.py index 92eab06..1c90268 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -5,6 +5,7 @@ import pathlib from contextvars import ContextVar +import shutil from heurams.services.config import ConfigFile from heurams.services.logger import get_logger @@ -14,32 +15,33 @@ from heurams.services.logger import get_logger # 数据文件路径规定: 以运行目录为准 rootdir = pathlib.Path(__file__).parent -print(f"rootdir: {rootdir}") +print(f"项目根目录: {rootdir}") logger = get_logger(__name__) logger.debug(f"项目根目录: {rootdir}") workdir = pathlib.Path.cwd() -print(f"workdir: {workdir}") +print(f"工作目录: {workdir}") logger.debug(f"工作目录: {workdir}") -config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(rootdir / "default" / "config" / "config.toml") -) -try: - config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(workdir / "config" / "config.toml") - ) # 配置文件 - print("已加载自定义用户配置") - logger.info("已加载自定义用户配置, 路径: %s", workdir / "config" / "config.toml") -except Exception as e: - print("未能加载自定义用户配置") - logger.warning("未能加载自定义用户配置, 错误: %s", e) -if pathlib.Path(workdir / "config" / "config_dev.toml").exists(): + +if pathlib.Path(workdir / "data" / "config" / "config_dev.toml").exists(): print("使用开发设置") logger.debug("使用开发设置") config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(workdir / "config" / "config_dev.toml") + "config_var", default=ConfigFile(workdir / "data" / "config" / "config_dev.toml") ) -# runtime_var: ContextVar = ContextVar('runtime_var', default=dict()) # 运行时共享数据 - +else: + try: + config_var: ContextVar[ConfigFile] = ContextVar( + "config_var", default=ConfigFile(workdir / "data" / "config" / "config.toml") + ) # 配置文件 + except Exception as e: + input("按下回车以创建新的配置文件, 或按下 Ctrl + C 以终止程序 ") + (workdir / "data" / 'config').mkdir(parents=True, exist_ok=True) + (workdir / "data" / 'config' / 'config').unlink(missing_ok=True) + shutil.copy((rootdir / 'default' / 'config' / 'config.toml'), workdir / "data" / "config" / "config.toml") + finally: + config_var: ContextVar[ConfigFile] = ContextVar( + "config_var", default=ConfigFile(workdir / "data" / "config" / "config.toml") + ) # 配置文件 class ConfigContext: """ diff --git a/src/heurams/default/config/config.toml b/src/heurams/default/config/config.toml index c7a3805..22c0f2f 100644 --- a/src/heurams/default/config/config.toml +++ b/src/heurams/default/config/config.toml @@ -31,12 +31,7 @@ max_riddles_num = 2 min_denominator = 3 [paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -nucleon_dir = "./data/nucleon" -electron_dir = "./data/electron" -global_dir = "./data/global" # 全局数据路径, SM-15 等算法需要 -orbital_dir = "./data/orbital" -cache_dir = "./data/cache" -template_dir = "./data/template" +data = "./data" [services] # 定义服务到提供者的映射 audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 110c098..c7bcdbc 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -7,12 +7,11 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen from .screens.precache import PrecachingScreen -from .screens.repocreator import NucleonCreatorScreen +from .screens.repocreator import RepoCreatorScreen from .screens.synctool import SyncScreen logger = get_logger(__name__) - def environment_check(): from pathlib import Path @@ -39,13 +38,13 @@ class HeurAMSApp(App): ("d", "toggle_dark", "切换色调"), ("1", "app.push_screen('dashboard')", "仪表盘"), ("2", "app.push_screen('precache_all')", "缓存管理器"), - ("3", "app.push_screen('nucleon_creator')", "创建新单元"), + ("3", "app.push_screen('nucleon_creator')", "创建新仓库"), # ("4", "app.push_screen('synctool')", "同步工具"), ("0", "app.push_screen('about')", "版本信息"), ] SCREENS = { "dashboard": DashboardScreen, - "nucleon_creator": NucleonCreatorScreen, + "repo_creator": RepoCreatorScreen, "precache_all": PrecachingScreen, "synctool": SyncScreen, "about": AboutScreen, diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 2130824..6e87ebe 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -8,7 +8,7 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen from .screens.precache import PrecachingScreen -from .screens.repocreator import NucleonCreatorScreen +from .screens.repocreator import RepoCreatorScreen logger = get_logger(__name__) diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 008b001..836d2fc 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -12,6 +12,7 @@ import heurams.services.timer as timer import heurams.services.version as version from heurams.context import * from heurams.kernel.particles import * +from heurams.kernel.repolib import * from heurams.services.logger import get_logger from .about import AboutScreen @@ -32,9 +33,10 @@ class DashboardScreen(Screen): classes: str | None = None, ) -> None: super().__init__(name, id, classes) - self.nextdates = {} - self.texts = {} - self.stay_enabled = {} + self.repostat = {} + self.title2dirname = {} + self.title2repo = {} + self._load_data() def compose(self) -> ComposeResult: """组合界面组件""" @@ -44,119 +46,86 @@ class DashboardScreen(Screen): Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()}"), Label(f'时区修正: UTC+{config_var.get()["timezone_offset"] / 3600}'), Label(f"使用算法: {config_var.get()['algorithm']['default']}"), - Label("选择待学习或待修改的记忆单元集:", classes="title-label"), - ListView(id="union-list", classes="union-list-view"), + Label("选择待学习或待修改的仓库:", classes="title-label"), + ListView(id="repo-list", classes="repo-list-view"), Label( f'"潜进" 启发式辅助记忆调度器 | 版本 {version.ver} ' - f"{version.codename.capitalize()} 2025" ), ) yield Footer() - def analyser(self, filename: str) -> dict: - """分析文件状态以生成显示文本 + def _load_data(self): + self.repo_dirs = Repo.probe_vaild_repos_in_dir(Path(config_var.get()['paths']['data']) / 'repo') + for repo_dir in self.repo_dirs: + repo = Repo.create_from_repodir(repo_dir) + self._analyse_repo(repo) - Args: - filename: 要分析的文件名 - - Returns: - dict: 包含显示文本的字典,键为行号 - """ - from heurams.kernel.repository.particle_loader import (load_electron, - load_nucleon) - - result = {} - filestem = pathlib.Path(filename).stem - - # 构建电子文件路径 - electron_dir = config_var.get()["paths"]["electron_dir"] - electron_file_path = pathlib.Path(electron_dir) / f"{filestem}.json" - - logger.debug(f"电子文件路径: {electron_file_path}") - - # 确保电子文件存在 - if not electron_file_path.exists(): - electron_file_path.touch() - electron_file_path.write_text("{}") - - # 加载电子数据 - electron_dict = load_electron(path=electron_file_path) - logger.debug(f"电子数据: {electron_dict}") - - # 分析电子状态 + def _analyse_repo(self, repo: Repo): + dirname = repo.source.name # type: ignore + title = repo.manifest["title"] is_due = 0 - is_activated = 0 - nextdate = 0x3F3F3F3F - - for electron in electron_dict.values(): - logger.debug(f"{electron}, 是否到期: {electron.is_due()}") - - if electron.is_due(): - is_due = 1 + unit_sum = len(repo) + activated_sum = 0 + nextdate = 0x3f3f3f3f + is_unfinished = (unit_sum > activated_sum) + for i in repo.ident_index: + nucleon = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) + electron = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i)) if electron.is_activated(): - is_activated = 1 - nextdate = min(nextdate, electron.nextdate()) - - # 检查是否需要更多复习 - nucleon_dir = config_var.get()["paths"]["nucleon_dir"] - nucleon_path = pathlib.Path(nucleon_dir) / f"{filestem}.toml" - nucleon_count = len(load_nucleon(nucleon_path)) - electron_count = len(electron_dict) - is_more = not (electron_count >= nucleon_count) - - logger.debug(f"是否需要更多复习: {is_more}") - - # 更新状态 - self.nextdates[filename] = nextdate - self.stay_enabled[filename] = is_due or is_more - - # 构建返回结果 - result[0] = f"{filename}\0" - - if not is_activated: - result[1] = " 尚未激活" - else: - status_text = "需要复习" if is_due else "当前无需复习" - result[1] = f"下一次复习: {nextdate}\n{status_text}" - - return result + activated_sum += 1 + if electron.is_due(): + is_due = 1 + nextdate = min(nextdate, electron.nextdate()) + if is_unfinished: + nextdate = min(nextdate, timer.get_daystamp()) + need_to_study = is_due or is_unfinished + prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum}\n {"需要学习" if need_to_study else "无需操作"}" + stat = { + "is_due": is_due, + "unit_sum": unit_sum, + "title": title, + "activated_sum": activated_sum, + "nextdate": nextdate, + "is_unfinished": is_unfinished, + "need_to_study": need_to_study, + "prompt": prompt, + "dirname": dirname, + } + self.repostat[dirname] = stat + self.title2dirname[title] = dirname + self.title2repo[title] = repo def on_mount(self) -> None: """挂载组件时初始化""" - union_list_widget = self.query_one("#union-list", ListView) - probe = probe_all(0) - - # 分析所有文件 - for file in probe["nucleon"]: - self.texts[file] = self.analyser(file) + repo_list_widget = self.query_one("#repo-list", ListView) # 按下次复习时间排序 - nucleon_files = sorted( - probe["nucleon"], - key=lambda f: self.nextdates[f], + repodirs = sorted( + self.repo_dirs, + key=lambda f: self.repostat[f.name]['nextdate'], reverse=True, ) - + repotitles = map(lambda f: self.repostat[f.name]['title'], repodirs) # 填充列表 - if not probe["nucleon"]: - union_list_widget.append( + if not repodirs: + repo_list_widget.append( ListItem( Static( - "在 ./nucleon/ 中未找到任何内容源数据文件。\n" - "请放置文件后重启应用,或者新建空的单元集。" + "在 ./data/repo/ 中未找到任何仓库.\n" + "请导入仓库后重启应用, 或者新建空的仓库." ) ) ) - union_list_widget.disabled = True + repo_list_widget.disabled = True return - for file in nucleon_files: - text = self.texts[file] - list_item = ListItem(Label(f"{text[0]}\n{text[1]}")) - union_list_widget.append(list_item) + for repotitle in repotitles: + prompt = self.repostat[self.title2dirname[repotitle]]['prompt'] + list_item = ListItem(Label(prompt)) + repo_list_widget.append(list_item) - if not self.stay_enabled[file]: - list_item.disabled = True + #if not self.stay_enabled[repodir]: + # list_item.disabled = True def on_list_view_selected(self, event) -> None: """处理列表项选择事件""" @@ -166,32 +135,25 @@ class DashboardScreen(Screen): selected_label = event.item.query_one(Label) label_text = str(selected_label.renderable) - if "未找到任何 .toml 文件" in label_text: + if "未找到任何仓库" in label_text: return # 提取文件名 - selected_filename = pathlib.Path(label_text.partition("\0")[0].replace("*", "")) - - # 构建文件路径 - nucleon_dir = config_var.get()["paths"]["nucleon_dir"] - electron_dir = config_var.get()["paths"]["electron_dir"] - - nucleon_file_path = pathlib.Path(nucleon_dir) / selected_filename - electron_file_path = ( - pathlib.Path(electron_dir) / f"{selected_filename.stem}.json" - ) + selected_repotitle = label_text.partition("\0")[0].replace("*", "") + selected_repo = self.title2repo[label_text.partition("\0")[0].replace("*", "")] + # 跳转到准备屏幕 - self.app.push_screen(PreparationScreen(nucleon_file_path, electron_file_path)) + self.app.push_screen(PreparationScreen(selected_repo, self.repostat[self.title2dirname[selected_repotitle]])) def on_button_pressed(self, event) -> None: """处理按钮点击事件""" button_id = event.button.id if button_id == "new_nucleon_button": - from .repocreator import NucleonCreatorScreen + from .repocreator import RepoCreatorScreen - new_screen = NucleonCreatorScreen() + new_screen = RepoCreatorScreen() self.app.push_screen(new_screen) elif button_id == "precache_all_button": diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index bbdff3c..37a9f80 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -12,6 +12,7 @@ import heurams.services.hasher as hasher from heurams.context import * from heurams.context import config_var from heurams.services.logger import get_logger +from heurams.kernel.repolib import * logger = get_logger(__name__) @@ -29,24 +30,19 @@ class PreparationScreen(Screen): scheduled_num = reactive(config_var.get()["scheduled_num"]) - def __init__(self, nucleon_file: pathlib.Path, electron_file: pathlib.Path) -> None: + def __init__(self, repo: Repo, repostat: dict) -> None: super().__init__(name=None, id=None, classes=None) - self.nucleon_file = nucleon_file - self.electron_file = electron_file - self.nucleons_with_orbital = pt.load_nucleon(self.nucleon_file) - self.electrons = pt.load_electron(self.electron_file) + self.repo = repo + self.repostat = repostat def compose(self) -> ComposeResult: yield Header(show_clock=True) with ScrollableContainer(id="vice_container"): - yield Label(f"准备就绪: [b]{self.nucleon_file.stem}[/b]\n") + yield Label(f"准备就绪: [b]{self.repostat['title']}[/b]\n") yield Label( - f"内容源文件: {config_var.get()['paths']['nucleon_dir']}/[b]{self.nucleon_file.name}[/b]" + f"仓库路径: {config_var.get()['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]" ) - yield Label( - f"元数据文件: {config_var.get()['paths']['electron_dir']}/[b]{self.electron_file.name}[/b]" - ) - yield Label(f"\n单元数量: {len(self.nucleons_with_orbital)}\n") + yield Label(f"\n单元数量: {len(self.repo)}\n") yield Label(f"单次记忆数量: {self.scheduled_num}", id="schnum_label") yield Button( @@ -76,10 +72,9 @@ class PreparationScreen(Screen): def _get_full_content(self): content = "" - for nucleon, orbital in self.nucleons_with_orbital: - nucleon: pt.Nucleon - # print(nucleon.payload) - content += " - " + nucleon["content"] + " \n" + for i in self.repo.ident_index: + n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i)) + content += f"- {n['content']} \n" return content def action_go_back(self): diff --git a/src/heurams/interface/screens/repocreator.py b/src/heurams/interface/screens/repocreator.py index 74e27cd..503cc3b 100644 --- a/src/heurams/interface/screens/repocreator.py +++ b/src/heurams/interface/screens/repocreator.py @@ -13,9 +13,9 @@ from heurams.context import config_var from heurams.services.version import ver -class NucleonCreatorScreen(Screen): +class RepoCreatorScreen(Screen): BINDINGS = [("q", "go_back", "返回")] - SUB_TITLE = "单元集创建向导" + SUB_TITLE = "仓库创建向导" def __init__(self) -> None: super().__init__(name=None, id=None, classes=None) diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index fc5abd7..2423d41 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -20,7 +20,7 @@ from heurams.kernel.algorithms.sm15m_calc import (MAX_AF, MIN_AF, NOTCH_AF, # 全局状态文件路径 _GLOBAL_STATE_FILE = os.path.expanduser( - pathlib.Path(config_var.get()["paths"]["global_dir"]) / "sm15m_global_state.json" + pathlib.Path(config_var.get()["paths"]["data"]) / 'global' / "sm15m_global_state.json" ) diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index dd5e7ab..ab7ff31 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -21,7 +21,7 @@ class Electron: algo_name: 使用的算法模块标识 """ if algo_name == "": - algo_name = "sm-2" + algo_name = "SM-2" self.algodata = algodata self.ident = ident self.algo: algolib.BaseAlgorithm = algorithms[algo_name] @@ -29,6 +29,11 @@ class Electron: if not self.algo.check_integrity(self.algodata): self.algodata[self.algo.algo_name] = deepcopy(self.algo.defaults) + def __repr__(self): + from pprint import pformat + s = pformat(self.algodata, indent=4) + return s + def activate(self): """激活此电子""" self.algodata[self.algo.algo_name]["is_activated"] = 1 diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index ea479cb..531e541 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -41,7 +41,9 @@ class Nucleon: return len(self.data) def __repr__(self): - return repr(self.data) + from pprint import pformat + s = pformat(self.data, indent=4) + return s @staticmethod def create_on_nucleonic_data(nucleonic_data: tuple): diff --git a/src/heurams/kernel/reactor/__init__.py b/src/heurams/kernel/reactor/__init__.py index dc87681..e69de29 100644 --- a/src/heurams/kernel/reactor/__init__.py +++ b/src/heurams/kernel/reactor/__init__.py @@ -1,12 +0,0 @@ -from heurams.services.logger import get_logger - -from .fission import Fission -from .phaser import Phaser -from .procession import Procession -from .states import PhaserState, ProcessionState - -logger = get_logger(__name__) - -__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] - -logger.debug("反应堆模块已加载") diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 80e6d16..4e5c003 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,51 +1,24 @@ -# 移相器类定义 +from enum import Enum +from typing import Any, Sequence, Type +from transitions import Machine, State, Event, EventData -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger +class Phaser(Machine): + def __init__(self, schedule: list): + state_words = ["init"] + schedule.copy() + state_objects = list() + for name in state_words: + state_objects.append(State( + name=name, + on_enter=["on_enter"] + )) + Machine.__init__(self, states=state_objects, initial="init", send_event=True) + self.add_ordered_transitions(loop=False) -from .procession import Procession -from .states import PhaserState, ProcessionState + def on_enter(self, event_data: EventData): + print(event_data.transition.source, "->", event_data.transition.dest) # type: ignore -logger = get_logger(__name__) - - -class Phaser: - """移相器: 全局调度阶段管理器""" - - def __init__(self, atoms: list[pt.Atom]) -> None: - logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) - new_atoms = list() - old_atoms = list() - self.state = PhaserState.UNSURE - for i in atoms: - if not i.registry["electron"].is_activated(): - new_atoms.append(i) - else: - old_atoms.append(i) - logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) - self.processions = list() - if len(old_atoms): - self.processions.append( - Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") - ) - logger.debug("创建初始复习 Procession") - if len(new_atoms): - self.processions.append( - Procession(new_atoms, PhaserState.RECOGNITION, "新记忆") - ) - logger.debug("创建新记忆 Procession") - self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) - logger.debug("创建总体复习 Procession") - logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) - - def current_procession(self): - logger.debug("Phaser.current_procession 被调用") - for i in self.processions: - i: Procession - if not i.state == ProcessionState.FINISHED: - self.state = i.phase - logger.debug("找到未完成的 Procession: phase=%s", i.phase) - return i - self.state = PhaserState.FINISHED - logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") - return 0 +if __name__ == "__main__": + p = Phaser(["a", "b"]) + p.next_state() + p.next_state() + print(p.state) diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 39811b6..4e5c003 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -1,74 +1,24 @@ -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger +from enum import Enum +from typing import Any, Sequence, Type +from transitions import Machine, State, Event, EventData -from .states import PhaserState, ProcessionState +class Phaser(Machine): + def __init__(self, schedule: list): + state_words = ["init"] + schedule.copy() + state_objects = list() + for name in state_words: + state_objects.append(State( + name=name, + on_enter=["on_enter"] + )) + Machine.__init__(self, states=state_objects, initial="init", send_event=True) + self.add_ordered_transitions(loop=False) -logger = get_logger(__name__) + def on_enter(self, event_data: EventData): + print(event_data.transition.source, "->", event_data.transition.dest) # type: ignore - -class Procession: - """队列: 标识单次记忆流程""" - - def __init__(self, atoms: list, phase: PhaserState, name: str = ""): - logger.debug( - "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", - len(atoms), - phase.value, - name, - ) - self.atoms = atoms - self.queue = atoms.copy() - self.current_atom = atoms[0] - self.cursor = 0 - self.name = name - self.phase = phase - self.state: ProcessionState = ProcessionState.RUNNING - logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) - - def forward(self, step=1): - logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) - self.cursor += step - if self.cursor == len(self.queue): - self.state = ProcessionState.FINISHED - logger.debug("Procession 已完成") - else: - self.state = ProcessionState.RUNNING - try: - logger.debug("cursor 更新为: %d", self.cursor) - self.current_atom = self.queue[self.cursor] - logger.debug("当前原子更新为: %s", self.current_atom.ident) - return 1 # 成功 - except IndexError as e: - logger.debug("IndexError: %s", e) - self.state = ProcessionState.FINISHED - logger.debug("Procession 因索引错误而完成") - return 0 - - def append(self, atom=None): - if atom == None: - atom = self.current_atom - logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") - if self.queue[len(self.queue) - 1] != atom or len(self) <= 1: - self.queue.append(atom) - logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) - else: - logger.debug("原子未追加(重复或队列长度<=1)") - - def __len__(self): - length = len(self.queue) - self.cursor - logger.debug("Procession.__len__: 剩余长度=%d", length) - return length - - def process(self): - logger.debug("Procession.process: cursor=%d", self.cursor) - return self.cursor - - def total_length(self): - total = len(self.queue) - logger.debug("Procession.total_length: %d", total) - return total - - def is_empty(self): - empty = len(self.queue) - logger.debug("Procession.is_empty: %d", empty) - return empty +if __name__ == "__main__": + p = Phaser(["a", "b"]) + p.next_state() + p.next_state() + print(p.state) diff --git a/src/heurams/kernel/reactor1/__init__.py b/src/heurams/kernel/reactor1/__init__.py new file mode 100644 index 0000000..dc87681 --- /dev/null +++ b/src/heurams/kernel/reactor1/__init__.py @@ -0,0 +1,12 @@ +from heurams.services.logger import get_logger + +from .fission import Fission +from .phaser import Phaser +from .procession import Procession +from .states import PhaserState, ProcessionState + +logger = get_logger(__name__) + +__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] + +logger.debug("反应堆模块已加载") diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor1/fission.py similarity index 100% rename from src/heurams/kernel/reactor/fission.py rename to src/heurams/kernel/reactor1/fission.py diff --git a/src/heurams/kernel/reactor1/phaser.py b/src/heurams/kernel/reactor1/phaser.py new file mode 100644 index 0000000..250b450 --- /dev/null +++ b/src/heurams/kernel/reactor1/phaser.py @@ -0,0 +1,51 @@ +# 移相器类定义 + +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger + +from .procession import Procession +from .states import PhaserState, ProcessionState + +logger = get_logger(__name__) + + +class Phaser: + """全局调度阶段管理器""" + + def __init__(self, atoms: list[pt.Atom]) -> None: + logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) + new_atoms = list() + old_atoms = list() + self.state = PhaserState.UNSURE + for i in atoms: + if not i.registry["electron"].is_activated(): + new_atoms.append(i) + else: + old_atoms.append(i) + logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) + self.processions = list() + if len(old_atoms): + self.processions.append( + Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") + ) + logger.debug("创建初始复习 Procession") + if len(new_atoms): + self.processions.append( + Procession(new_atoms, PhaserState.RECOGNITION, "新记忆") + ) + logger.debug("创建新记忆 Procession") + self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) + logger.debug("创建总体复习 Procession") + logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) + + def current_procession(self): + logger.debug("Phaser.current_procession 被调用") + for i in self.processions: + i: Procession + if not i.state == ProcessionState.FINISHED: + self.state = i.phase + logger.debug("找到未完成的 Procession: phase=%s", i.phase) + return i + self.state = PhaserState.FINISHED + logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") + return 0 diff --git a/src/heurams/kernel/reactor1/procession.py b/src/heurams/kernel/reactor1/procession.py new file mode 100644 index 0000000..39811b6 --- /dev/null +++ b/src/heurams/kernel/reactor1/procession.py @@ -0,0 +1,74 @@ +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger + +from .states import PhaserState, ProcessionState + +logger = get_logger(__name__) + + +class Procession: + """队列: 标识单次记忆流程""" + + def __init__(self, atoms: list, phase: PhaserState, name: str = ""): + logger.debug( + "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", + len(atoms), + phase.value, + name, + ) + self.atoms = atoms + self.queue = atoms.copy() + self.current_atom = atoms[0] + self.cursor = 0 + self.name = name + self.phase = phase + self.state: ProcessionState = ProcessionState.RUNNING + logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) + + def forward(self, step=1): + logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) + self.cursor += step + if self.cursor == len(self.queue): + self.state = ProcessionState.FINISHED + logger.debug("Procession 已完成") + else: + self.state = ProcessionState.RUNNING + try: + logger.debug("cursor 更新为: %d", self.cursor) + self.current_atom = self.queue[self.cursor] + logger.debug("当前原子更新为: %s", self.current_atom.ident) + return 1 # 成功 + except IndexError as e: + logger.debug("IndexError: %s", e) + self.state = ProcessionState.FINISHED + logger.debug("Procession 因索引错误而完成") + return 0 + + def append(self, atom=None): + if atom == None: + atom = self.current_atom + logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") + if self.queue[len(self.queue) - 1] != atom or len(self) <= 1: + self.queue.append(atom) + logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) + else: + logger.debug("原子未追加(重复或队列长度<=1)") + + def __len__(self): + length = len(self.queue) - self.cursor + logger.debug("Procession.__len__: 剩余长度=%d", length) + return length + + def process(self): + logger.debug("Procession.process: cursor=%d", self.cursor) + return self.cursor + + def total_length(self): + total = len(self.queue) + logger.debug("Procession.total_length: %d", total) + return total + + def is_empty(self): + empty = len(self.queue) + logger.debug("Procession.is_empty: %d", empty) + return empty diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor1/states.py similarity index 100% rename from src/heurams/kernel/reactor/states.py rename to src/heurams/kernel/reactor1/states.py diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index 9973bf0..2377afe 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -1,6 +1,7 @@ import json from functools import reduce from pathlib import Path +from typing import TypedDict import toml @@ -8,6 +9,10 @@ import heurams.kernel.particles as pt from ...utils.lict import Lict +class RepoManifest(TypedDict): + title: str + author: str + desc: str class Repo: file_mapping = { @@ -38,7 +43,7 @@ class Repo: source=None, ) -> None: self.schedule: dict = schedule - self.manifest: dict = manifest + self.manifest: RepoManifest = manifest # type: ignore self.typedef: dict = typedef self.payload: Lict = payload self.algodata: Lict = algodata @@ -60,8 +65,11 @@ class Repo: self._nucleonic_proc, self.payload)) ) - self.electronic_data_lict = self.algodata self.orbitic_data = self.schedule + self.ident_index = self.nucleonic_data_lict.keys() + for i in self.ident_index: + self.algodata.append_new((i, {})) + self.electronic_data_lict = self.algodata def _nucleonic_proc(self, unit): ident = unit[0] @@ -78,6 +86,11 @@ class Repo: def __len__(self): return len(self.payload) + def __repr__(self): + from pprint import pformat + s = pformat(self.database, indent=4) + return s + def persist_to_repodir( self, save_list: list | None = None, source: Path | None = None ): @@ -151,3 +164,12 @@ class Repo: return 1 except: return 0 + + @classmethod + def probe_vaild_repos_in_dir(cls, folder: Path): + lst = list() + for i in folder.iterdir(): + if i.is_dir(): + if cls.check_repodir(i): + lst.append(i) + return lst \ No newline at end of file diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py index 4cf5020..9abb580 100644 --- a/src/heurams/utils/evalizor.py +++ b/src/heurams/utils/evalizor.py @@ -1,4 +1,4 @@ -class Evalizer: +class Evalizer(): """几乎无副作用的模板系统 接受环境信息并创建一个模板解析工具, 工具传入参数支持list, dict及其嵌套 @@ -6,7 +6,6 @@ class Evalizer: """ # TODO: 弃用风险极高的 eval - # 理论上已经限制了全局函数 但eval仍有风险 # TODO: 异步/多线程执行避免堵塞 def __init__(self, environment: dict) -> None: self.env = environment @@ -19,6 +18,8 @@ class Evalizer: return list(map(self.travel, anyobj)) elif isinstance(anyobj, dict): return dict(map(self.travel, anyobj.items())) + elif isinstance(anyobj, tuple): + return tuple(map(self.travel, anyobj)) elif isinstance(anyobj, str): if anyobj.startswith("eval:"): return self.eval_with_env(anyobj[5:]) @@ -28,7 +29,7 @@ class Evalizer: return anyobj def eval_with_env(self, s: str): - ret = eval(s, {}, self.env) + ret = eval(s, globals(), self.env) if not isinstance(ret, str): ret = str(ret) return ret diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index 40559c6..ffcad3b 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -52,6 +52,9 @@ class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) else: return super().__getitem__(i) + def get_itemic_unit(self, i): + return (i, self.dicted_data[i]) + def __setitem__(self, i, item): if isinstance(i, str): self.dicted_data[i] = item @@ -81,6 +84,15 @@ class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) if self.forced_order: self.data.sort() + def append_new(self, item: Any): + if item != (item[0], item[1]): + raise NotImplementedError + if item[0] not in self: + super().append(item) + self._sync_based_on_list() + if self.forced_order: + self.data.sort() + def insert(self, i: int, item: Any) -> None: if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 raise NotImplementedError diff --git a/tests/kernel/reactor/test_phaser.py b/tests/kernel/reactor/test_phaser.py index a5a3334..fba30e4 100644 --- a/tests/kernel/reactor/test_phaser.py +++ b/tests/kernel/reactor/test_phaser.py @@ -3,7 +3,7 @@ from unittest.mock import MagicMock, Mock, patch from heurams.kernel.particles.atom import Atom from heurams.kernel.particles.electron import Electron -from heurams.kernel.reactor.phaser import Phaser +from heurams.kernel.reactor.procession import Phaser from heurams.kernel.reactor.states import PhaserState, ProcessionState From 32cd44b8e7f3a7ac628e2f3ba6aa8037826ece77 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 3 Jan 2026 05:05:41 +0800 Subject: [PATCH 08/79] =?UTF-8?q?feat(kernel):=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/data/config/config.toml | 56 ++++++++ examples/jiebatest.py | 14 ++ examples/simplemem.py | 7 +- src/heurams/interface/__init__.py | 2 +- src/heurams/interface/screens/about.py | 2 +- src/heurams/interface/screens/dashboard.py | 20 --- src/heurams/interface/screens/memoqueue.py | 2 - src/heurams/interface/screens/precache.py | 48 ++----- src/heurams/interface/screens/preparation.py | 43 +++--- src/heurams/kernel/particles/atom.py | 10 +- src/heurams/kernel/particles/nucleon.py | 11 +- src/heurams/kernel/reactor/README.md | 1 + src/heurams/kernel/reactor/__init__.py | 12 ++ src/heurams/kernel/reactor/fission.py | 49 +++++++ src/heurams/kernel/reactor/phaser.py | 133 ++++++++++++++++--- src/heurams/kernel/reactor/procession.py | 130 +++++++++++++++--- src/heurams/kernel/reactor/states.py | 21 +++ src/heurams/services/version.py | 3 +- src/heurams/utils/lict.py | 4 +- 19 files changed, 428 insertions(+), 140 deletions(-) create mode 100644 examples/data/config/config.toml create mode 100644 examples/jiebatest.py create mode 100644 src/heurams/kernel/reactor/README.md create mode 100644 src/heurams/kernel/reactor/fission.py create mode 100644 src/heurams/kernel/reactor/states.py diff --git a/examples/data/config/config.toml b/examples/data/config/config.toml new file mode 100644 index 0000000..22c0f2f --- /dev/null +++ b/examples/data/config/config.toml @@ -0,0 +1,56 @@ +# [调试] 将更改保存到文件 +persist_to_file = 1 + +# [调试] 覆写时间, 设为 -1 以禁用 +daystamp_override = -1 +timestamp_override = -1 + +# [调试] 一键通过 +quick_pass = 1 + +# 对于每个项目的默认新记忆原子数量 +scheduled_num = 8 + +# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 +timezone_offset = +28800 # 中国标准时间 (UTC+8) + +[interface] + +[interface.memorizor] +autovoice = true # 自动语音播放, 仅限于 recognition 组件 + +[algorithm] +default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS + +[puzzles] # 谜题默认配置 + +[puzzles.mcq] +max_riddles_num = 2 + +[puzzles.cloze] +min_denominator = 3 + +[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 +data = "./data" + +[services] # 定义服务到提供者的映射 +audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) +tts = "edgetts" # 可选项: edgetts +llm = "openai" # 可选项: openai +sync = "webdav" # 可选项: 留空, webdav + +[providers.tts.edgetts] # EdgeTTS 设置 +voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) + +[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 +url = "" +key = "" + +[providers.sync.webdav] # WebDAV 同步设置 +url = "" +username = "" +password = "" +remote_path = "/heurams/" +verify_ssl = true + +[sync] diff --git a/examples/jiebatest.py b/examples/jiebatest.py new file mode 100644 index 0000000..21c3e48 --- /dev/null +++ b/examples/jiebatest.py @@ -0,0 +1,14 @@ +# encoding=utf-8 +import jieba + +#jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持 +strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"] +#for str in strs: +# seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式 +# print("Paddle Mode: " + '/'.join(list(seg_list))) + +seg_list = jieba.cut("秦孝公据崤函之固, 拥雍州之地", cut_all=False) +print("Default Mode: " + "/ ".join(seg_list)) # 精确模式 + +seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式 +print(", ".join(seg_list)) diff --git a/examples/simplemem.py b/examples/simplemem.py index 48e13c4..01b84d0 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -5,8 +5,9 @@ repo = repolib.Repo.create_from_repodir(Path('./test_repo')) for i in repo.ident_index: n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) e = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i)) + a = pt.Atom(n, e, repo.orbitic_data) e.activate() e.revisor(5, True) - print(repr(n)) - print(repr(e)) -print(repo) \ No newline at end of file + print(repr(a)) + #print(repr(e)) +#print(repo) \ No newline at end of file diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index c7bcdbc..c1bfccb 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -38,7 +38,7 @@ class HeurAMSApp(App): ("d", "toggle_dark", "切换色调"), ("1", "app.push_screen('dashboard')", "仪表盘"), ("2", "app.push_screen('precache_all')", "缓存管理器"), - ("3", "app.push_screen('nucleon_creator')", "创建新仓库"), + ("3", "app.push_screen('repo_creator')", "创建新仓库"), # ("4", "app.push_screen('synctool')", "同步工具"), ("0", "app.push_screen('about')", "版本信息"), ] diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index fa26c29..1bf0e1e 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -20,7 +20,7 @@ class AboutScreen(Screen): 版本 {version.ver} {version.stage.capitalize()} -开发代号: {version.codename.capitalize()} +开发代号: {version.codename.capitalize()} {version.codename_cn} 一个基于启发式算法的开放源代码记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 836d2fc..4008e0d 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -146,26 +146,6 @@ class DashboardScreen(Screen): # 跳转到准备屏幕 self.app.push_screen(PreparationScreen(selected_repo, self.repostat[self.title2dirname[selected_repotitle]])) - def on_button_pressed(self, event) -> None: - """处理按钮点击事件""" - button_id = event.button.id - - if button_id == "new_nucleon_button": - from .repocreator import RepoCreatorScreen - - new_screen = RepoCreatorScreen() - self.app.push_screen(new_screen) - - elif button_id == "precache_all_button": - from .precache import PrecachingScreen - - precache_screen = PrecachingScreen() - self.app.push_screen(precache_screen) - - elif button_id == "about_button": - about_screen = AboutScreen() - self.app.push_screen(about_screen) - def action_quit_app(self) -> None: """退出应用程序""" self.app.exit() diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 150f130..7ab2b8c 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -47,8 +47,6 @@ class MemScreen(Screen): ) -> None: super().__init__(name, id, classes) self.atoms = atoms - for i in self.atoms: - i.do_eval() self.phaser = Phaser(atoms) # logger.debug(self.phaser.state) self.procession: Procession = self.phaser.current_procession() # type: ignore diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 971464f..b78d73d 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -38,12 +38,6 @@ class PrecachingScreen(Screen): self.precache_worker = None self.cancel_flag = 0 self.desc = desc - for i in nucleons: - i: pt.Nucleon - atom = pt.Atom() - atom.link("nucleon", i) - atom.do_eval() - # print("完成 EVAL") def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -94,7 +88,7 @@ class PrecachingScreen(Screen): """预缓存单段文本的音频""" from heurams.context import config_var, rootdir, workdir - cache_dir = pathlib.Path(config_var.get()["paths"]["cache_dir"]) + cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / 'cache' cache_dir.mkdir(parents=True, exist_ok=True) cache_file = cache_dir / f"{hasher.get_md5(text)}.wav" if not cache_file.exists(): @@ -110,10 +104,8 @@ class PrecachingScreen(Screen): def precache_by_nucleon(self, nucleon: pt.Nucleon): """依据 Nucleon 缓存""" - # print(nucleon.metadata['formation']['tts_text']) - ret = self.precache_by_text(nucleon.metadata["formation"]["tts_text"]) + ret = self.precache_by_text(nucleon["tts_text"]) return ret - # print(f"TTS 缓存: {nucleon.metadata['formation']['tts_text']}") def precache_by_list(self, nucleons: list): """依据 Nucleons 列表缓存""" @@ -122,7 +114,7 @@ class PrecachingScreen(Screen): worker = get_current_worker() if worker and worker.is_cancelled: # 函数在worker中执行且已被取消 return False - text = nucleon.metadata["formation"]["tts_text"] + text = nucleon["tts_text"] # self.current_item = text[:30] + "..." if len(text) > 50 else text # print(text) self.processed += 1 @@ -152,38 +144,26 @@ class PrecachingScreen(Screen): # print(f"返回 {ret}") return ret - def precache_by_filepath(self, path: pathlib.Path): - """预缓存单个文件的所有内容""" - lst = list() - for i in pt.load_nucleon(path): - lst.append(i[0]) - return self.precache_by_list(lst) - def precache_all_files(self): """预缓存所有文件""" from heurams.context import config_var, rootdir, workdir + from heurams.kernel.repolib import Repo - nucleon_path = pathlib.Path(config_var.get()["paths"]["nucleon_dir"]) - nucleon_files = [ - f for f in nucleon_path.iterdir() if f.suffix == ".toml" - ] # TODO: 解耦合 + repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / 'repo' + repo_dirs = Repo.probe_vaild_repos_in_dir(repo_path) + repos = map(Repo.create_from_repodir, repo_dirs) # 计算总项目数 self.total = 0 - nu = list() - for file in nucleon_files: + nucleon_list = list() + for repo in repos: try: - for i in pt.load_nucleon(file): - nu.append(i[0]) + for i in repo.ident_index: + nucleon_list.append(pt.Nucleon.create_on_nucleonic_data(repo.nucleonic_data_lict.get_itemic_unit(i))) except: continue - self.total = len(nu) - for i in nu: - i: pt.Nucleon - atom = pt.Atom() - atom.link("nucleon", i) - atom.do_eval() - return self.precache_by_list(nu) + self.total = len(nucleon_list) + return self.precache_by_list(nucleon_list) def on_button_pressed(self, event: Button.Pressed) -> None: event.stop() @@ -221,7 +201,7 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir shutil.rmtree( - f"{config_var.get()["paths"]["cache_dir"]}", ignore_errors=True + f"{config_var.get()["paths"]["data"]}/'cache'", ignore_errors=True ) self.update_status("已清空", "音频缓存已清空", 0) except Exception as e: diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 37a9f80..2cdb8a5 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -84,9 +84,9 @@ class PreparationScreen(Screen): from ..screens.precache import PrecachingScreen lst = list() - for i in self.nucleons_with_orbital: - lst.append(i[0]) - precache_screen = PrecachingScreen(lst) + for i in self.repo.ident_index: + lst.append(pt.Nucleon.create_on_nucleonic_data(self.repo.nucleonic_data_lict.get_itemic_unit(i))) + precache_screen = PrecachingScreen(nucleons=lst, desc=self.repo.manifest["title"]) self.app.push_screen(precache_screen) def action_quit_app(self): @@ -97,38 +97,27 @@ class PreparationScreen(Screen): logger.debug("按下按钮") if event.button.id == "start_memorizing_button": atoms = list() - for nucleon, orbital in self.nucleons_with_orbital: - atom = pt.Atom(nucleon.ident) - atom.link("nucleon", nucleon) - try: - atom.link("electron", self.electrons[nucleon.ident]) - except KeyError: - atom.link("electron", pt.Electron(nucleon.ident)) - atom.link("orbital", orbital) - atom.link("nucleon_fmt", "toml") - atom.link("electron_fmt", "json") - atom.link("orbital_fmt", "toml") - atom.link("nucleon_path", self.nucleon_file) - atom.link("electron_path", self.electron_file) - atom.link("orbital_path", None) - atoms.append(atom) + for i in self.repo.ident_index: + n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i)) + e = pt.Electron.create_on_electonic_data(electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i)) + a = pt.Atom(n, e, self.repo.orbitic_data) + atoms.append(a) + atoms_to_provide = list() left_new = self.scheduled_num for i in atoms: i: pt.Atom - if i.registry["electron"].is_due(): - atoms_to_provide.append(i) + if i.registry['electron'].is_activated(): + if i.registry["electron"].is_due(): + atoms_to_provide.append(i) else: - if i.registry["electron"].is_activated(): - pass - else: - left_new -= 1 - if left_new >= 0: - atoms_to_provide.append(i) - logger.debug(f"ATP: {atoms_to_provide}") + left_new -= 1 + if left_new >= 0: + atoms_to_provide.append(i) from .memoqueue import MemScreen memscreen = MemScreen(atoms_to_provide) self.app.push_screen(memscreen) + elif event.button.id == "precache_button": self.action_precache() diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index acef5b8..3e8cc33 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -1,9 +1,5 @@ -import json -import pathlib -import typing from typing import TypedDict -import toml from heurams.services.logger import get_logger @@ -22,6 +18,7 @@ class AtomRegister_runtime(TypedDict): class AtomRegister(TypedDict): nucleon: Nucleon electron: Electron + orbital: dict runtime: AtomRegister_runtime @@ -99,3 +96,8 @@ class Atom: if key == "ident": raise AttributeError("应为只读") self.registry[key] = value + + def __repr__(self): + from pprint import pformat + s = pformat(self.registry, indent=4) + return s diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 531e541..1c1c738 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -13,12 +13,15 @@ class Nucleon: self.ident = ident env = {"payload": payload} self.evalizer = Evalizer(environment=env) - self.data = self.evalizer(deepcopy((payload | common))) + self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore def __getitem__(self, key): - if key == "ident": - return self.ident - return self.data[key] + if isinstance(key, str): + if key == "ident": + return self.ident + return self.data[key] + else: + raise AttributeError def __setitem__(self, key, value): raise AttributeError("应为只读") diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md new file mode 100644 index 0000000..4c6bfa4 --- /dev/null +++ b/src/heurams/kernel/reactor/README.md @@ -0,0 +1 @@ +# Reactor - 记忆过程状态机模块 \ No newline at end of file diff --git a/src/heurams/kernel/reactor/__init__.py b/src/heurams/kernel/reactor/__init__.py index e69de29..278b6b1 100644 --- a/src/heurams/kernel/reactor/__init__.py +++ b/src/heurams/kernel/reactor/__init__.py @@ -0,0 +1,12 @@ +from heurams.services.logger import get_logger + +from .fission import Fission +from .phaser import Phaser +from .procession import Procession +from .states import PhaserState, ProcessionState + +logger = get_logger(__name__) + +__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] + +logger.debug("反应堆模块已加载") \ No newline at end of file diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py new file mode 100644 index 0000000..ef6e881 --- /dev/null +++ b/src/heurams/kernel/reactor/fission.py @@ -0,0 +1,49 @@ +import random + +import heurams.kernel.evaluators as puz +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger + +from .states import PhaserState + + +class Fission: + """裂变器: 单原子调度展开器""" + + def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION): + self.logger = get_logger(__name__) + self.atom = atom + + #NOTE: phase 为 PhaserState 枚举实例,需要获取其value + phase_value = phase_state.value if isinstance(phase_state, PhaserState) else phase_state + + self.orbital_schedule = atom.registry["orbital"]["schedule"][phase_value] # type: ignore + self.orbital_puzzles = atom.registry["orbital"]["puzzles"] + + self.puzzles = list() + for item, possibility in self.orbital_schedule: # type: ignore + self.logger.debug(f"开始处理 orbital 项: {item}") + if not isinstance(possibility, float): + possibility = float(possibility) + + while possibility > 1: + self.puzzles.append( + { + "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], + "alia": item, + } + ) + possibility -= 1 + + if random.random() <= possibility: + self.puzzles.append( + { + "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], + "alia": item, + } + ) + + self.logger.debug(f"orbital 项处理完成: {item}") + + def generate(self): + yield from self.puzzles \ No newline at end of file diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 4e5c003..70922c8 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,24 +1,117 @@ -from enum import Enum -from typing import Any, Sequence, Type -from transitions import Machine, State, Event, EventData +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger +from transitions import Machine + +from .procession import Procession +from .states import PhaserState, ProcessionState + +logger = get_logger(__name__) + class Phaser(Machine): - def __init__(self, schedule: list): - state_words = ["init"] + schedule.copy() - state_objects = list() - for name in state_words: - state_objects.append(State( - name=name, - on_enter=["on_enter"] - )) - Machine.__init__(self, states=state_objects, initial="init", send_event=True) - self.add_ordered_transitions(loop=False) + """全局调度阶段管理器""" - def on_enter(self, event_data: EventData): - print(event_data.transition.source, "->", event_data.transition.dest) # type: ignore + def __init__(self, atoms: list[pt.Atom]) -> None: + logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) + + new_atoms = list() + old_atoms = list() + + for i in atoms: + if not i.registry["electron"].is_activated(): + new_atoms.append(i) + else: + old_atoms.append(i) + + logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) + + self.processions = list() + #TODO: 改进为基于配置文件的可变复习阶段管理 + if len(old_atoms): + self.processions.append( + Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") + ) + logger.debug("创建初始复习 Procession") -if __name__ == "__main__": - p = Phaser(["a", "b"]) - p.next_state() - p.next_state() - print(p.state) + if len(new_atoms): + self.processions.append( + Procession(new_atoms, PhaserState.RECOGNITION, "新记忆") + ) + logger.debug("创建新记忆 Procession") + + self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) + logger.debug("创建总体复习 Procession") + logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) + + # 设置transitions状态机 + states = [ + {'name': PhaserState.UNSURE.value, 'on_enter': 'on_unsure'}, + {'name': PhaserState.QUICK_REVIEW.value, 'on_enter': 'on_quick_review'}, + {'name': PhaserState.RECOGNITION.value, 'on_enter': 'on_recognition'}, + {'name': PhaserState.FINAL_REVIEW.value, 'on_enter': 'on_final_review'}, + {'name': PhaserState.FINISHED.value, 'on_enter': 'on_finished'} + ] + + transitions = [ + {'trigger': 'to_unsure', 'source': '*', 'dest': PhaserState.UNSURE.value}, + {'trigger': 'to_quick_review', 'source': '*', 'dest': PhaserState.QUICK_REVIEW.value}, + {'trigger': 'to_recognition', 'source': '*', 'dest': PhaserState.RECOGNITION.value}, + {'trigger': 'to_final_review', 'source': '*', 'dest': PhaserState.FINAL_REVIEW.value}, + {'trigger': 'to_finished', 'source': '*', 'dest': PhaserState.FINISHED.value} + ] + + Machine.__init__(self, states=states, transitions=transitions, + initial=PhaserState.UNSURE.value) + + self.to_unsure() + + def on_unsure(self): + """进入UNSURE状态时的回调""" + logger.debug("Phaser 进入 UNSURE 状态") + + def on_quick_review(self): + """进入QUICK_REVIEW状态时的回调""" + logger.debug("Phaser 进入 QUICK_REVIEW 状态") + + def on_recognition(self): + """进入RECOGNITION状态时的回调""" + logger.debug("Phaser 进入 RECOGNITION 状态") + + def on_final_review(self): + """进入FINAL_REVIEW状态时的回调""" + logger.debug("Phaser 进入 FINAL_REVIEW 状态") + + def on_finished(self): + """进入FINISHED状态时的回调""" + logger.debug("Phaser 进入 FINISHED 状态") + + def current_procession(self): + logger.debug("Phaser.current_procession 被调用") + for i in self.processions: + i: Procession + if i.state != ProcessionState.FINISHED.value: + # 根据当前procession的phase更新Phaser状态 + if i.phase == PhaserState.QUICK_REVIEW: + self.to_quick_review() + elif i.phase == PhaserState.RECOGNITION: + self.to_recognition() + elif i.phase == PhaserState.FINAL_REVIEW: + self.to_final_review() + + logger.debug("找到未完成的 Procession: phase=%s", i.phase) + return i + + # 所有Procession都已完成 + self.to_finished() + logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") + return None + + @property + def state(self): + """获取当前状态值""" + current_state = self.get_model_state(self) + # 将字符串状态转换为PhaserState枚举 + for phase in PhaserState: + if phase.value == current_state: + return phase + return PhaserState.UNSURE \ No newline at end of file diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 4e5c003..46f7611 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -1,24 +1,112 @@ -from enum import Enum -from typing import Any, Sequence, Type -from transitions import Machine, State, Event, EventData +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger +from transitions import Machine -class Phaser(Machine): - def __init__(self, schedule: list): - state_words = ["init"] + schedule.copy() - state_objects = list() - for name in state_words: - state_objects.append(State( - name=name, - on_enter=["on_enter"] - )) - Machine.__init__(self, states=state_objects, initial="init", send_event=True) - self.add_ordered_transitions(loop=False) +from .states import PhaserState, ProcessionState - def on_enter(self, event_data: EventData): - print(event_data.transition.source, "->", event_data.transition.dest) # type: ignore +logger = get_logger(__name__) -if __name__ == "__main__": - p = Phaser(["a", "b"]) - p.next_state() - p.next_state() - print(p.state) + +class Procession(Machine): + """队列: 标识单次记忆流程""" + + def __init__(self, atoms: list, phase_state: PhaserState, name: str = ""): + logger.debug( + "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", + len(atoms), + phase_state.value, + name, + ) + + # 初始化原子队列 + self.atoms = atoms + self.queue = atoms.copy() + self.current_atom = atoms[0] if atoms else None + self.cursor = 0 + self.name = name + self.phase = phase_state + + # 设置transitions状态机 + states = [{'name': ProcessionState.RUNNING.value, 'on_enter': 'on_running'}, + {'name': ProcessionState.FINISHED.value, 'on_enter': 'on_finished'}] + + transitions = [ + {'trigger': 'finish', 'source': ProcessionState.RUNNING.value, 'dest': ProcessionState.FINISHED.value}, + {'trigger': 'restart', 'source': ProcessionState.FINISHED.value, 'dest': ProcessionState.RUNNING.value} + ] + + Machine.__init__(self, states=states, transitions=transitions, + initial=ProcessionState.RUNNING.value) + + logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) + + def on_running(self): + """进入RUNNING状态时的回调""" + logger.debug("Procession 进入 RUNNING 状态") + + def on_finished(self): + """进入FINISHED状态时的回调""" + logger.debug("Procession 进入 FINISHED 状态") + + def forward(self, step=1): + logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) + self.cursor += step + + if self.cursor >= len(self.queue): + if self.state != ProcessionState.FINISHED.value: + self.finish() # 触发状态转换 + logger.debug("Procession 已完成") + else: + if self.state != ProcessionState.RUNNING.value: + self.restart() # 确保在RUNNING状态 + self.current_atom = self.queue[self.cursor] + logger.debug("cursor 更新为: %d", self.cursor) + logger.debug("当前原子更新为: %s", self.current_atom.ident if self.current_atom else "None") + return 1 # 成功 + + return 0 + + def append(self, atom=None): + if atom is None: + atom = self.current_atom + logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") + + if not self.queue or self.queue[-1] != atom or len(self) <= 1: + self.queue.append(atom) + logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) + else: + logger.debug("原子未追加(重复或队列长度<=1)") + + def __len__(self): + if not self.queue: + return 0 + length = len(self.queue) - self.cursor + logger.debug("Procession.__len__: 剩余长度=%d", length) + return length + + def process(self): + logger.debug("Procession.process: cursor=%d", self.cursor) + return self.cursor + + def total_length(self): + total = len(self.queue) + logger.debug("Procession.total_length: %d", total) + return total + + def is_empty(self): + empty = len(self.queue) == 0 + logger.debug("Procession.is_empty: %s", empty) + return empty + + @property + def state(self): + """获取当前状态值""" + return self.get_model_state(self) + + @state.setter + def state(self, value): + """设置状态值""" + if value == ProcessionState.RUNNING.value: + self.restart() + elif value == ProcessionState.FINISHED.value: + self.finish() \ No newline at end of file diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py new file mode 100644 index 0000000..4c9afa1 --- /dev/null +++ b/src/heurams/kernel/reactor/states.py @@ -0,0 +1,21 @@ +from enum import Enum, auto + +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +class PhaserState(Enum): + UNSURE = "unsure" + QUICK_REVIEW = "quick_review" + RECOGNITION = "recognition" + FINAL_REVIEW = "final_review" + FINISHED = "finished" + + +class ProcessionState(Enum): + RUNNING = "running" + FINISHED = "finished" + + +logger.debug("状态枚举定义已加载") \ No newline at end of file diff --git a/src/heurams/services/version.py b/src/heurams/services/version.py index 4f31e59..a8135ba 100644 --- a/src/heurams/services/version.py +++ b/src/heurams/services/version.py @@ -5,6 +5,7 @@ logger = get_logger(__name__) ver = "0.5.0" stage = "prototype" -codename = "fulcrom" # 支点 +codename = "fulcrom" +codename_cn = "支点" logger.info("HeurAMS 版本: %s (%s), 阶段: %s", ver, codename, stage) diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index ffcad3b..446090e 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -52,8 +52,8 @@ class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) else: return super().__getitem__(i) - def get_itemic_unit(self, i): - return (i, self.dicted_data[i]) + def get_itemic_unit(self, ident): + return (ident, self.dicted_data[ident]) def __setitem__(self, i, item): if isinstance(i, str): From 7f364500799992551c61b1503859b51c3118bff8 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 3 Jan 2026 13:08:08 +0800 Subject: [PATCH 09/79] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ++--- data/repo/test/typedef.toml | 2 +- examples/jiebatest.py | 6 +- examples/repo.ipynb | 61 ++++++++++++----- examples/simplemem.py | 15 +++-- src/heurams/context.py | 19 ++++-- src/heurams/interface/__init__.py | 1 + src/heurams/interface/screens/dashboard.py | 40 ++++++----- src/heurams/interface/screens/precache.py | 10 ++- src/heurams/interface/screens/preparation.py | 24 +++++-- src/heurams/interface/screens/repocreator.py | 3 +- src/heurams/kernel/algorithms/sm15m.py | 17 +++-- src/heurams/kernel/particles/atom.py | 1 + src/heurams/kernel/particles/electron.py | 1 + src/heurams/kernel/particles/nucleon.py | 3 +- src/heurams/kernel/particles/orbital.py | 27 ++++---- src/heurams/kernel/reactor/__init__.py | 2 +- src/heurams/kernel/reactor/fission.py | 30 +++++---- src/heurams/kernel/reactor/phaser.py | 70 +++++++++++++------- src/heurams/kernel/reactor/procession.py | 57 ++++++++++------ src/heurams/kernel/reactor/states.py | 2 +- src/heurams/kernel/repolib/repo.py | 11 +-- src/heurams/utils/evalizor.py | 2 +- tests/interface/test_synctool.py | 11 +-- 24 files changed, 275 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index 1b3ef80..8693167 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,16 @@ "潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的多用途辅助记忆软件, 提供动态规划的优化记忆方案 ## 关于此仓库 -"潜进" 软件组项目包含多个子项目 -此仓库包含了 "潜进" 项目的核心和基于 Textual 的基本用户界面的实现 +本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现 +除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 -## 开发进程 +## 版本日志 - 0.0.x: 简易调度器实现与最小原型. - 0.1.x: 命令行操作的调度器. -- 0.2.x: 使用 Textual 构建富文本终端用户界面, 项目可行性验证, 采用 SM-2 原始算法, 评估方式为用户自评估的原型. -- 0.3.x: 简单的多文件项目, 创建了记忆内容/算法数据结构, 基于 SM-2 改进算法的自动复习测评评估. 重点设计古诗文记忆理解功能, 以及 TUI 界面实现, 简单的 TTS 集成. -- 0.4.x: 使用模块管理解耦设计, 增加文档与类型标注, 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现, 支持其他调度算法模块 (SM-2, FSRS) 与谜题模块, 采用日志调试, 更新文件格式, 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控, 更佳的用户数据处理, 加入模块化扩展集成, 将算法数据格式换为 json 提高性能, 采用 provider-service 抽象架构, 支持切换服务提供者, 整体兼容性改进. +- 0.2.x: 使用 Textual 构建富文本终端用户界面; 项目可行性验证; 采用 SM-2 原始算法, 评估方式为用户自评估原型. +- 0.3.x: 简单的多文件项目; 创建了记忆内容/算法数据结构; 基于 SM-2 改进算法的自动复习测评评估; 重点设计古诗文记忆理解功能; TUI 界面改进; 简单的 TTS 集成. +- 0.4.x: 使用模块管理解耦设计; 增加文档与类型标注; 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现; 支持其他调度算法模块 (SM-2, FSRS) 与谜题模块; 采用日志调试; 更新文件格式; 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控; 更佳的用户数据处理; 加入模块化扩展集成; 将算法数据格式换为 json 提高性能; 采用 provider-service 抽象架构, 支持切换服务提供者; 整体兼容性改进. +- 0.5.x: 以仓库(repo)对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能; 使用具有列表 - 字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储; 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担; 实现声音形式回顾 "电台" 功能; 改进数据存储结构, 实现选择性持久化; 增强可配置性; 使用 Transitions 状态机库重新实现 reactor 状态机, 增强可维护性; 实现整体回顾记忆功能, 与队列式记忆功能并列. > 下一步? > 使用 Flutter 构建酷酷的现代化前端, 增加云同步/文档源服务... @@ -103,7 +104,7 @@ verify_ssl = true # SSL 证书验证 ## 项目结构 -### 架构图 +### 架构图(待更新 0.5.0) 以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: @@ -164,7 +165,7 @@ graph TB Algorithms --> Files ``` -### 目录结构 +### 目录结构(待更新 0.5.0) ``` src/heurams/ ├── __init__.py # 包入口点 diff --git a/data/repo/test/typedef.toml b/data/repo/test/typedef.toml index d55cc86..736f11c 100644 --- a/data/repo/test/typedef.toml +++ b/data/repo/test/typedef.toml @@ -12,7 +12,7 @@ tts_text = "文本转语音文本" delimiter = "/" tts_text = "eval:payload['content'].replace('/', '')" -["puzzles"] # 谜题定义 +["common.puzzles"] # 谜题定义, 也可以单独定义到 payload, common 不会对 payload 已有内容进行覆盖, 参见 nucleon.py 第16行 # 我们称 "Recognition" 为 recognition 谜题的 alia "Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } "SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } diff --git a/examples/jiebatest.py b/examples/jiebatest.py index 21c3e48..df2a89b 100644 --- a/examples/jiebatest.py +++ b/examples/jiebatest.py @@ -1,9 +1,9 @@ # encoding=utf-8 import jieba -#jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持 -strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"] -#for str in strs: +# jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持 +strs = ["我来到北京清华大学", "乒乓球拍卖完了", "中国科学技术大学"] +# for str in strs: # seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式 # print("Paddle Mode: " + '/'.join(list(seg_list))) diff --git a/examples/repo.ipynb b/examples/repo.ipynb index 5feb1ae..c6bbeed 100644 --- a/examples/repo.ipynb +++ b/examples/repo.ipynb @@ -101,9 +101,11 @@ } ], "source": [ - "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", - "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", - "from pathlib import Path # 这是 Python 的 Pathlib 模块, 用于表示文件路径, 在整个项目中, 都使用此模块表示路径" + "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", + "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", + "from pathlib import (\n", + " Path,\n", + ") # 这是 Python 的 Pathlib 模块, 用于表示文件路径, 在整个项目中, 都使用此模块表示路径" ] }, { @@ -231,6 +233,7 @@ "source": [ "test_repo_dic = test_repo.export_to_single_dict()\n", "from pprint import pprint\n", + "\n", "pprint(test_repo_dic)" ] }, @@ -287,7 +290,10 @@ } ], "source": [ - "test_repo.persist_to_repodir(save_list=[\"schedule\", \"payload\", \"manifest\", \"typedef\", \"algodata\"], source=Path(\"test_new_repo\"))\n", + "test_repo.persist_to_repodir(\n", + " save_list=[\"schedule\", \"payload\", \"manifest\", \"typedef\", \"algodata\"],\n", + " source=Path(\"test_new_repo\"),\n", + ")\n", "!tree" ] }, @@ -336,11 +342,12 @@ ], "source": [ "from heurams.utils.lict import Lict\n", - "lct = Lict() # 空的\n", - "lct = Lict(initlist=[(\"name\", \"tom\"), (\"age\", 12), (\"enemy\", \"jerry\")]) # 基于列表\n", + "\n", + "lct = Lict() # 空的\n", + "lct = Lict(initlist=[(\"name\", \"tom\"), (\"age\", 12), (\"enemy\", \"jerry\")]) # 基于列表\n", "print(lct)\n", - "lct = Lict(initdict={\"name\": \"tom\", \"age\": 12, \"enemy\": \"jerry\"}) # 基于字典\n", - "print(lct)\n" + "lct = Lict(initdict={\"name\": \"tom\", \"age\": 12, \"enemy\": \"jerry\"}) # 基于字典\n", + "print(lct)" ] }, { @@ -404,7 +411,7 @@ "\n", "# 错误的方式\n", "lct.dicted_data[\"type\"] = \"cat\"\n", - "print(lct) # 将不会同步修改\n", + "print(lct) # 将不会同步修改\n", "\n", "# 不推荐, 但可用的方式\n", "lct.dicted_data[\"type\"] = \"cat\"\n", @@ -412,7 +419,7 @@ "print(lct)\n", "\n", "# 推荐方式\n", - "lct['is_human'] = False\n", + "lct[\"is_human\"] = False\n", "print(lct)" ] }, @@ -446,7 +453,7 @@ "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", "\n", "# 唯一推荐方式\n", - "lct.append(('enemy_2', 'spike'))\n", + "lct.append((\"enemy_2\", \"spike\"))\n", "print(lct.dicted_data)" ] }, @@ -507,7 +514,16 @@ } ], "source": [ - "lct = Lict(initdict={'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'})\n", + "lct = Lict(\n", + " initdict={\n", + " \"age\": 12,\n", + " \"enemy\": \"jerry\",\n", + " \"is_human\": False,\n", + " \"name\": \"tom\",\n", + " \"type\": \"cat\",\n", + " \"enemy_2\": \"spike\",\n", + " }\n", + ")\n", "print(lct)\n", "print(lct.dicted_data)\n", "print(\"------\")\n", @@ -517,7 +533,16 @@ "while len(lct) > 0:\n", " print(lct.pop())\n", " print(lct)\n", - "lct = Lict(initdict={'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'})\n", + "lct = Lict(\n", + " initdict={\n", + " \"age\": 12,\n", + " \"enemy\": \"jerry\",\n", + " \"is_human\": False,\n", + " \"name\": \"tom\",\n", + " \"type\": \"cat\",\n", + " \"enemy_2\": \"spike\",\n", + " }\n", + ")\n", "..." ] }, @@ -654,10 +679,14 @@ } ], "source": [ - "repo = repolib.Repo.create_from_repodir(Path('./test_repo'))\n", + "repo = repolib.Repo.create_from_repodir(Path(\"./test_repo\"))\n", "for i in repo.ident_index:\n", - " n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i))\n", - " e = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i))\n", + " n = pt.Nucleon.create_on_nucleonic_data(\n", + " nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)\n", + " )\n", + " e = pt.Electron.create_on_electonic_data(\n", + " electronic_data=repo.electronic_data_lict.get_itemic_unit(i)\n", + " )\n", " e.activate()\n", " e.revisor(5, True)\n", " print(repr(n))\n", diff --git a/examples/simplemem.py b/examples/simplemem.py index 01b84d0..fc8ea53 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -1,13 +1,18 @@ import heurams.kernel.repolib as repolib import heurams.kernel.particles as pt from pathlib import Path -repo = repolib.Repo.create_from_repodir(Path('./test_repo')) + +repo = repolib.Repo.create_from_repodir(Path("./test_repo")) for i in repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) - e = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i)) + n = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) + ) + e = pt.Electron.create_on_electonic_data( + electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + ) a = pt.Atom(n, e, repo.orbitic_data) e.activate() e.revisor(5, True) print(repr(a)) - #print(repr(e)) -#print(repo) \ No newline at end of file + # print(repr(e)) +# print(repo) diff --git a/src/heurams/context.py b/src/heurams/context.py index 1c90268..439640a 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -26,23 +26,30 @@ if pathlib.Path(workdir / "data" / "config" / "config_dev.toml").exists(): print("使用开发设置") logger.debug("使用开发设置") config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(workdir / "data" / "config" / "config_dev.toml") + "config_var", + default=ConfigFile(workdir / "data" / "config" / "config_dev.toml"), ) else: try: config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(workdir / "data" / "config" / "config.toml") + "config_var", + default=ConfigFile(workdir / "data" / "config" / "config.toml"), ) # 配置文件 except Exception as e: input("按下回车以创建新的配置文件, 或按下 Ctrl + C 以终止程序 ") - (workdir / "data" / 'config').mkdir(parents=True, exist_ok=True) - (workdir / "data" / 'config' / 'config').unlink(missing_ok=True) - shutil.copy((rootdir / 'default' / 'config' / 'config.toml'), workdir / "data" / "config" / "config.toml") + (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) + (workdir / "data" / "config" / "config").unlink(missing_ok=True) + shutil.copy( + (rootdir / "default" / "config" / "config.toml"), + workdir / "data" / "config" / "config.toml", + ) finally: config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", default=ConfigFile(workdir / "data" / "config" / "config.toml") + "config_var", + default=ConfigFile(workdir / "data" / "config" / "config.toml"), ) # 配置文件 + class ConfigContext: """ 功能完备的上下文管理器 diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index c1bfccb..f825008 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -12,6 +12,7 @@ from .screens.synctool import SyncScreen logger = get_logger(__name__) + def environment_check(): from pathlib import Path diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 4008e0d..3fb9aee 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -5,8 +5,7 @@ import pathlib from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen -from textual.widgets import (Button, Footer, Header, Label, ListItem, ListView, - Static) +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static import heurams.services.timer as timer import heurams.services.version as version @@ -48,29 +47,33 @@ class DashboardScreen(Screen): Label(f"使用算法: {config_var.get()['algorithm']['default']}"), Label("选择待学习或待修改的仓库:", classes="title-label"), ListView(id="repo-list", classes="repo-list-view"), - Label( - f'"潜进" 启发式辅助记忆调度器 | 版本 {version.ver} ' - ), + Label(f'"潜进" 启发式辅助记忆调度器 | 版本 {version.ver} '), ) yield Footer() def _load_data(self): - self.repo_dirs = Repo.probe_vaild_repos_in_dir(Path(config_var.get()['paths']['data']) / 'repo') + self.repo_dirs = Repo.probe_vaild_repos_in_dir( + Path(config_var.get()["paths"]["data"]) / "repo" + ) for repo_dir in self.repo_dirs: repo = Repo.create_from_repodir(repo_dir) self._analyse_repo(repo) def _analyse_repo(self, repo: Repo): - dirname = repo.source.name # type: ignore + dirname = repo.source.name # type: ignore title = repo.manifest["title"] is_due = 0 unit_sum = len(repo) activated_sum = 0 - nextdate = 0x3f3f3f3f - is_unfinished = (unit_sum > activated_sum) + nextdate = 0x3F3F3F3F + is_unfinished = unit_sum > activated_sum for i in repo.ident_index: - nucleon = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) - electron = pt.Electron.create_on_electonic_data(electronic_data=repo.electronic_data_lict.get_itemic_unit(i)) + nucleon = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) + ) + electron = pt.Electron.create_on_electonic_data( + electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + ) if electron.is_activated(): activated_sum += 1 if electron.is_due(): @@ -102,10 +105,10 @@ class DashboardScreen(Screen): # 按下次复习时间排序 repodirs = sorted( self.repo_dirs, - key=lambda f: self.repostat[f.name]['nextdate'], + key=lambda f: self.repostat[f.name]["nextdate"], reverse=True, ) - repotitles = map(lambda f: self.repostat[f.name]['title'], repodirs) + repotitles = map(lambda f: self.repostat[f.name]["title"], repodirs) # 填充列表 if not repodirs: repo_list_widget.append( @@ -120,11 +123,11 @@ class DashboardScreen(Screen): return for repotitle in repotitles: - prompt = self.repostat[self.title2dirname[repotitle]]['prompt'] + prompt = self.repostat[self.title2dirname[repotitle]]["prompt"] list_item = ListItem(Label(prompt)) repo_list_widget.append(list_item) - #if not self.stay_enabled[repodir]: + # if not self.stay_enabled[repodir]: # list_item.disabled = True def on_list_view_selected(self, event) -> None: @@ -141,10 +144,13 @@ class DashboardScreen(Screen): # 提取文件名 selected_repotitle = label_text.partition("\0")[0].replace("*", "") selected_repo = self.title2repo[label_text.partition("\0")[0].replace("*", "")] - # 跳转到准备屏幕 - self.app.push_screen(PreparationScreen(selected_repo, self.repostat[self.title2dirname[selected_repotitle]])) + self.app.push_screen( + PreparationScreen( + selected_repo, self.repostat[self.title2dirname[selected_repotitle]] + ) + ) def action_quit_app(self) -> None: """退出应用程序""" diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index b78d73d..e0ec3de 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -88,7 +88,7 @@ class PrecachingScreen(Screen): """预缓存单段文本的音频""" from heurams.context import config_var, rootdir, workdir - cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / 'cache' + cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" cache_dir.mkdir(parents=True, exist_ok=True) cache_file = cache_dir / f"{hasher.get_md5(text)}.wav" if not cache_file.exists(): @@ -149,7 +149,7 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir from heurams.kernel.repolib import Repo - repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / 'repo' + repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / "repo" repo_dirs = Repo.probe_vaild_repos_in_dir(repo_path) repos = map(Repo.create_from_repodir, repo_dirs) @@ -159,7 +159,11 @@ class PrecachingScreen(Screen): for repo in repos: try: for i in repo.ident_index: - nucleon_list.append(pt.Nucleon.create_on_nucleonic_data(repo.nucleonic_data_lict.get_itemic_unit(i))) + nucleon_list.append( + pt.Nucleon.create_on_nucleonic_data( + repo.nucleonic_data_lict.get_itemic_unit(i) + ) + ) except: continue self.total = len(nucleon_list) diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 2cdb8a5..b563744 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -73,7 +73,9 @@ class PreparationScreen(Screen): def _get_full_content(self): content = "" for i in self.repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i)) + n = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) + ) content += f"- {n['content']} \n" return content @@ -85,8 +87,14 @@ class PreparationScreen(Screen): lst = list() for i in self.repo.ident_index: - lst.append(pt.Nucleon.create_on_nucleonic_data(self.repo.nucleonic_data_lict.get_itemic_unit(i))) - precache_screen = PrecachingScreen(nucleons=lst, desc=self.repo.manifest["title"]) + lst.append( + pt.Nucleon.create_on_nucleonic_data( + self.repo.nucleonic_data_lict.get_itemic_unit(i) + ) + ) + precache_screen = PrecachingScreen( + nucleons=lst, desc=self.repo.manifest["title"] + ) self.app.push_screen(precache_screen) def action_quit_app(self): @@ -98,8 +106,12 @@ class PreparationScreen(Screen): if event.button.id == "start_memorizing_button": atoms = list() for i in self.repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i)) - e = pt.Electron.create_on_electonic_data(electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i)) + n = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) + ) + e = pt.Electron.create_on_electonic_data( + electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i) + ) a = pt.Atom(n, e, self.repo.orbitic_data) atoms.append(a) @@ -107,7 +119,7 @@ class PreparationScreen(Screen): left_new = self.scheduled_num for i in atoms: i: pt.Atom - if i.registry['electron'].is_activated(): + if i.registry["electron"].is_activated(): if i.registry["electron"].is_due(): atoms_to_provide.append(i) else: diff --git a/src/heurams/interface/screens/repocreator.py b/src/heurams/interface/screens/repocreator.py index 503cc3b..6b2e916 100644 --- a/src/heurams/interface/screens/repocreator.py +++ b/src/heurams/interface/screens/repocreator.py @@ -6,8 +6,7 @@ import toml from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen -from textual.widgets import (Button, Footer, Header, Input, Label, Markdown, - Select) +from textual.widgets import Button, Footer, Header, Input, Label, Markdown, Select from heurams.context import config_var from heurams.services.version import ver diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 2423d41..a909d58 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -14,13 +14,22 @@ import pathlib from typing import TypedDict from heurams.context import config_var -from heurams.kernel.algorithms.sm15m_calc import (MAX_AF, MIN_AF, NOTCH_AF, - RANGE_AF, RANGE_REPETITION, - SM, THRESHOLD_RECALL, Item) +from heurams.kernel.algorithms.sm15m_calc import ( + MAX_AF, + MIN_AF, + NOTCH_AF, + RANGE_AF, + RANGE_REPETITION, + SM, + THRESHOLD_RECALL, + Item, +) # 全局状态文件路径 _GLOBAL_STATE_FILE = os.path.expanduser( - pathlib.Path(config_var.get()["paths"]["data"]) / 'global' / "sm15m_global_state.json" + pathlib.Path(config_var.get()["paths"]["data"]) + / "global" + / "sm15m_global_state.json" ) diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 3e8cc33..3cd22a0 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -99,5 +99,6 @@ class Atom: def __repr__(self): from pprint import pformat + s = pformat(self.registry, indent=4) return s diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index ab7ff31..ba58db5 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -31,6 +31,7 @@ class Electron: def __repr__(self): from pprint import pformat + s = pformat(self.algodata, indent=4) return s diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 1c1c738..61e4d56 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -13,7 +13,7 @@ class Nucleon: self.ident = ident env = {"payload": payload} self.evalizer = Evalizer(environment=env) - self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore + self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore def __getitem__(self, key): if isinstance(key, str): @@ -45,6 +45,7 @@ class Nucleon: def __repr__(self): from pprint import pformat + s = pformat(self.data, indent=4) return s diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py index ca5f0d7..8d76364 100644 --- a/src/heurams/kernel/particles/orbital.py +++ b/src/heurams/kernel/particles/orbital.py @@ -1,16 +1,17 @@ -from heurams.utils.evalizor import Evalizer -from heurams.utils.lict import Lict +"""轨道对象""" +# 似乎没有实现这个类的必要... +# 那不妨在这儿写点文档 -class Orbital: - @classmethod - def create_orbital(cls, schedule: list, phase_def: dict): - phase_def = Lict(initdict=phase_def) # type: ignore - orbital = Lict() - for i in schedule: - orbital[i] = Lict(phase_def[i]) - return orbital +""" +orbital, 即轨道, 是定义队列式复习阶段流程的数据结构, 其实就是个字典, 至于为何不用typeddict, 因为懒. - @classmethod - def create_orbital_on_orbitic_data(cls, orbitic_data): - return cls.create_orbital(orbitic_data["schedule"], orbitic_data["phases"]) +orbital_example = { + "schedule": [列表 存储阶段(phases)名称] + "phases":{ + 阶段名称 = [["谜题(puzzle 现称 evaluator 评估器)名称", "概率系数 可大于1(整数部分为重复次数) 注意使用字符串包裹(toml 规范)"], ...], + ... + } +} +至于谜题定义 放在 nucleon['puzzles'], 这样设计是为了兼容多种不同谜题实现的记忆单元, 尽管如此, 你也可见其谜题调度方式必须是相同的. +""" diff --git a/src/heurams/kernel/reactor/__init__.py b/src/heurams/kernel/reactor/__init__.py index 278b6b1..dc87681 100644 --- a/src/heurams/kernel/reactor/__init__.py +++ b/src/heurams/kernel/reactor/__init__.py @@ -9,4 +9,4 @@ logger = get_logger(__name__) __all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] -logger.debug("反应堆模块已加载") \ No newline at end of file +logger.debug("反应堆模块已加载") diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index ef6e881..a7499a0 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -8,24 +8,26 @@ from .states import PhaserState class Fission: - """裂变器: 单原子调度展开器""" + """单原子调度展开器""" def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION): self.logger = get_logger(__name__) self.atom = atom - - #NOTE: phase 为 PhaserState 枚举实例,需要获取其value - phase_value = phase_state.value if isinstance(phase_state, PhaserState) else phase_state - - self.orbital_schedule = atom.registry["orbital"]["schedule"][phase_value] # type: ignore - self.orbital_puzzles = atom.registry["orbital"]["puzzles"] - + + # NOTE: phase 为 PhaserState 枚举实例,需要获取其value + phase_value = ( + phase_state.value if isinstance(phase_state, PhaserState) else phase_state + ) + + self.orbital_schedule = atom.registry["phases"][phase_value] # type: ignore + self.orbital_puzzles = atom.registry["nucleon"]["puzzles"] + self.puzzles = list() for item, possibility in self.orbital_schedule: # type: ignore - self.logger.debug(f"开始处理 orbital 项: {item}") + self.logger.debug(f"开始处理: {item}") if not isinstance(possibility, float): possibility = float(possibility) - + while possibility > 1: self.puzzles.append( { @@ -34,7 +36,7 @@ class Fission: } ) possibility -= 1 - + if random.random() <= possibility: self.puzzles.append( { @@ -42,8 +44,8 @@ class Fission: "alia": item, } ) - + self.logger.debug(f"orbital 项处理完成: {item}") - def generate(self): - yield from self.puzzles \ No newline at end of file + def get_puzzles_list(self): + yield from self.puzzles diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 70922c8..fd91bf6 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -13,20 +13,20 @@ class Phaser(Machine): def __init__(self, atoms: list[pt.Atom]) -> None: logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) - + new_atoms = list() old_atoms = list() - + for i in atoms: if not i.registry["electron"].is_activated(): new_atoms.append(i) else: old_atoms.append(i) - + logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) - + self.processions = list() - #TODO: 改进为基于配置文件的可变复习阶段管理 + # TODO: 改进为基于配置文件的可变复习阶段管理 if len(old_atoms): self.processions.append( Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") @@ -42,27 +42,47 @@ class Phaser(Machine): self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) logger.debug("创建总体复习 Procession") logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) - + # 设置transitions状态机 states = [ - {'name': PhaserState.UNSURE.value, 'on_enter': 'on_unsure'}, - {'name': PhaserState.QUICK_REVIEW.value, 'on_enter': 'on_quick_review'}, - {'name': PhaserState.RECOGNITION.value, 'on_enter': 'on_recognition'}, - {'name': PhaserState.FINAL_REVIEW.value, 'on_enter': 'on_final_review'}, - {'name': PhaserState.FINISHED.value, 'on_enter': 'on_finished'} + {"name": PhaserState.UNSURE.value, "on_enter": "on_unsure"}, + {"name": PhaserState.QUICK_REVIEW.value, "on_enter": "on_quick_review"}, + {"name": PhaserState.RECOGNITION.value, "on_enter": "on_recognition"}, + {"name": PhaserState.FINAL_REVIEW.value, "on_enter": "on_final_review"}, + {"name": PhaserState.FINISHED.value, "on_enter": "on_finished"}, ] - + transitions = [ - {'trigger': 'to_unsure', 'source': '*', 'dest': PhaserState.UNSURE.value}, - {'trigger': 'to_quick_review', 'source': '*', 'dest': PhaserState.QUICK_REVIEW.value}, - {'trigger': 'to_recognition', 'source': '*', 'dest': PhaserState.RECOGNITION.value}, - {'trigger': 'to_final_review', 'source': '*', 'dest': PhaserState.FINAL_REVIEW.value}, - {'trigger': 'to_finished', 'source': '*', 'dest': PhaserState.FINISHED.value} + {"trigger": "to_unsure", "source": "*", "dest": PhaserState.UNSURE.value}, + { + "trigger": "to_quick_review", + "source": "*", + "dest": PhaserState.QUICK_REVIEW.value, + }, + { + "trigger": "to_recognition", + "source": "*", + "dest": PhaserState.RECOGNITION.value, + }, + { + "trigger": "to_final_review", + "source": "*", + "dest": PhaserState.FINAL_REVIEW.value, + }, + { + "trigger": "to_finished", + "source": "*", + "dest": PhaserState.FINISHED.value, + }, ] - - Machine.__init__(self, states=states, transitions=transitions, - initial=PhaserState.UNSURE.value) - + + Machine.__init__( + self, + states=states, + transitions=transitions, + initial=PhaserState.UNSURE.value, + ) + self.to_unsure() def on_unsure(self): @@ -97,15 +117,15 @@ class Phaser(Machine): self.to_recognition() elif i.phase == PhaserState.FINAL_REVIEW: self.to_final_review() - + logger.debug("找到未完成的 Procession: phase=%s", i.phase) return i - + # 所有Procession都已完成 self.to_finished() logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") return None - + @property def state(self): """获取当前状态值""" @@ -114,4 +134,4 @@ class Phaser(Machine): for phase in PhaserState: if phase.value == current_state: return phase - return PhaserState.UNSURE \ No newline at end of file + return PhaserState.UNSURE diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 46f7611..256a0de 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -17,27 +17,39 @@ class Procession(Machine): phase_state.value, name, ) - - # 初始化原子队列 + self.atoms = atoms self.queue = atoms.copy() self.current_atom = atoms[0] if atoms else None self.cursor = 0 self.name = name self.phase = phase_state - - # 设置transitions状态机 - states = [{'name': ProcessionState.RUNNING.value, 'on_enter': 'on_running'}, - {'name': ProcessionState.FINISHED.value, 'on_enter': 'on_finished'}] - - transitions = [ - {'trigger': 'finish', 'source': ProcessionState.RUNNING.value, 'dest': ProcessionState.FINISHED.value}, - {'trigger': 'restart', 'source': ProcessionState.FINISHED.value, 'dest': ProcessionState.RUNNING.value} + + states = [ + {"name": ProcessionState.RUNNING.value, "on_enter": "on_running"}, + {"name": ProcessionState.FINISHED.value, "on_enter": "on_finished"}, ] - - Machine.__init__(self, states=states, transitions=transitions, - initial=ProcessionState.RUNNING.value) - + + transitions = [ + { + "trigger": "finish", + "source": ProcessionState.RUNNING.value, + "dest": ProcessionState.FINISHED.value, + }, + { + "trigger": "restart", + "source": ProcessionState.FINISHED.value, + "dest": ProcessionState.RUNNING.value, + }, + ] + + Machine.__init__( + self, + states=states, + transitions=transitions, + initial=ProcessionState.RUNNING.value, + ) + logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) def on_running(self): @@ -51,7 +63,7 @@ class Procession(Machine): def forward(self, step=1): logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step - + if self.cursor >= len(self.queue): if self.state != ProcessionState.FINISHED.value: self.finish() # 触发状态转换 @@ -61,16 +73,19 @@ class Procession(Machine): self.restart() # 确保在RUNNING状态 self.current_atom = self.queue[self.cursor] logger.debug("cursor 更新为: %d", self.cursor) - logger.debug("当前原子更新为: %s", self.current_atom.ident if self.current_atom else "None") + logger.debug( + "当前原子更新为: %s", + self.current_atom.ident if self.current_atom else "None", + ) return 1 # 成功 - + return 0 def append(self, atom=None): if atom is None: atom = self.current_atom logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") - + if not self.queue or self.queue[-1] != atom or len(self) <= 1: self.queue.append(atom) logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) @@ -97,16 +112,16 @@ class Procession(Machine): empty = len(self.queue) == 0 logger.debug("Procession.is_empty: %s", empty) return empty - + @property def state(self): """获取当前状态值""" return self.get_model_state(self) - + @state.setter def state(self, value): """设置状态值""" if value == ProcessionState.RUNNING.value: self.restart() elif value == ProcessionState.FINISHED.value: - self.finish() \ No newline at end of file + self.finish() diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py index 4c9afa1..ae4a8db 100644 --- a/src/heurams/kernel/reactor/states.py +++ b/src/heurams/kernel/reactor/states.py @@ -18,4 +18,4 @@ class ProcessionState(Enum): FINISHED = "finished" -logger.debug("状态枚举定义已加载") \ No newline at end of file +logger.debug("状态枚举定义已加载") diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index 2377afe..d492d67 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -9,11 +9,13 @@ import heurams.kernel.particles as pt from ...utils.lict import Lict + class RepoManifest(TypedDict): title: str author: str desc: str + class Repo: file_mapping = { "schedule": "schedule.toml", @@ -43,7 +45,7 @@ class Repo: source=None, ) -> None: self.schedule: dict = schedule - self.manifest: RepoManifest = manifest # type: ignore + self.manifest: RepoManifest = manifest # type: ignore self.typedef: dict = typedef self.payload: Lict = payload self.algodata: Lict = algodata @@ -61,9 +63,7 @@ class Repo: def generate_particles_data(self): self.nucleonic_data_lict = Lict( - initlist=list(map( - self._nucleonic_proc, - self.payload)) + initlist=list(map(self._nucleonic_proc, self.payload)) ) self.orbitic_data = self.schedule self.ident_index = self.nucleonic_data_lict.keys() @@ -88,6 +88,7 @@ class Repo: def __repr__(self): from pprint import pformat + s = pformat(self.database, indent=4) return s @@ -172,4 +173,4 @@ class Repo: if i.is_dir(): if cls.check_repodir(i): lst.append(i) - return lst \ No newline at end of file + return lst diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py index 9abb580..b58138e 100644 --- a/src/heurams/utils/evalizor.py +++ b/src/heurams/utils/evalizor.py @@ -1,4 +1,4 @@ -class Evalizer(): +class Evalizer: """几乎无副作用的模板系统 接受环境信息并创建一个模板解析工具, 工具传入参数支持list, dict及其嵌套 diff --git a/tests/interface/test_synctool.py b/tests/interface/test_synctool.py index b70d8a3..096ac8a 100644 --- a/tests/interface/test_synctool.py +++ b/tests/interface/test_synctool.py @@ -10,8 +10,12 @@ from unittest.mock import MagicMock, Mock, patch from heurams.context import ConfigContext from heurams.services.config import ConfigFile -from heurams.services.sync_service import (ConflictStrategy, SyncConfig, - SyncMode, SyncService) +from heurams.services.sync_service import ( + ConflictStrategy, + SyncConfig, + SyncMode, + SyncService, +) class TestSyncServiceUnit(unittest.TestCase): @@ -202,8 +206,7 @@ class TestSyncServiceUnit(unittest.TestCase): mock_config.data = config_data mock_config_var.get.return_value = mock_config - from heurams.services.sync_service import \ - create_sync_service_from_config + from heurams.services.sync_service import create_sync_service_from_config service = create_sync_service_from_config() From 10f541325bccf3c624cdf355525b9aea55503b59 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 4 Jan 2026 00:28:44 +0800 Subject: [PATCH 10/79] =?UTF-8?q?feat(reactor):=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E8=BF=9B=E4=B8=80=E6=AD=A5=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++- data/repo/test/typedef.toml | 2 - examples/simplemem.py | 41 +++++++++++-- examples/test_repo/typedef.toml | 2 - src/heurams/interface/screens/precache.py | 4 +- src/heurams/kernel/particles/__init__.py | 2 +- src/heurams/kernel/reactor/phaser.py | 21 ++++--- src/heurams/kernel/reactor/procession.py | 40 ++++++------ src/heurams/kernel/reactor1/__init__.py | 12 ---- src/heurams/kernel/reactor1/fission.py | 45 -------------- src/heurams/kernel/reactor1/phaser.py | 51 ---------------- src/heurams/kernel/reactor1/procession.py | 74 ----------------------- src/heurams/kernel/reactor1/states.py | 21 ------- src/heurams/services/textproc.py | 4 ++ src/heurams/utils/lict.py | 2 +- 15 files changed, 83 insertions(+), 245 deletions(-) delete mode 100644 src/heurams/kernel/reactor1/__init__.py delete mode 100644 src/heurams/kernel/reactor1/fission.py delete mode 100644 src/heurams/kernel/reactor1/phaser.py delete mode 100644 src/heurams/kernel/reactor1/procession.py delete mode 100644 src/heurams/kernel/reactor1/states.py create mode 100644 src/heurams/services/textproc.py diff --git a/README.md b/README.md index 8693167..be064f1 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,20 @@ # 潜进 (HeurAMS) - 启发式辅助记忆程序 ## 概述 -"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的多用途辅助记忆软件, 提供动态规划的优化记忆方案 +"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的开放源代码多用途辅助记忆软件, 提供动态规划的优化记忆方案 ## 关于此仓库 本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现 除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 +本仓库在 AGPLv3 下开放源代码(详见 LICENSE 文件) ## 版本日志 - 0.0.x: 简易调度器实现与最小原型. - 0.1.x: 命令行操作的调度器. - 0.2.x: 使用 Textual 构建富文本终端用户界面; 项目可行性验证; 采用 SM-2 原始算法, 评估方式为用户自评估原型. - 0.3.x: 简单的多文件项目; 创建了记忆内容/算法数据结构; 基于 SM-2 改进算法的自动复习测评评估; 重点设计古诗文记忆理解功能; TUI 界面改进; 简单的 TTS 集成. -- 0.4.x: 使用模块管理解耦设计; 增加文档与类型标注; 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现; 支持其他调度算法模块 (SM-2, FSRS) 与谜题模块; 采用日志调试; 更新文件格式; 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控; 更佳的用户数据处理; 加入模块化扩展集成; 将算法数据格式换为 json 提高性能; 采用 provider-service 抽象架构, 支持切换服务提供者; 整体兼容性改进. -- 0.5.x: 以仓库(repo)对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能; 使用具有列表 - 字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储; 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担; 实现声音形式回顾 "电台" 功能; 改进数据存储结构, 实现选择性持久化; 增强可配置性; 使用 Transitions 状态机库重新实现 reactor 状态机, 增强可维护性; 实现整体回顾记忆功能, 与队列式记忆功能并列. +- 0.4.x: 开发目标转为多用途; 使用模块管理解耦设计; 增加文档与类型标注; 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现; 支持其他调度算法模块 (SM-2, SM-18M 逆向工程实现, FSRS) 与谜题模块; 采用日志调试; 更新文件格式; 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控; 更佳的用户数据处理; 加入模块化扩展集成; 将算法数据格式换为 json 提高性能; 采用 provider-service 抽象架构, 支持切换服务提供者; 整体兼容性改进. +- 0.5.x: 以仓库(repo)对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能; 使用具有列表 - 字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储; 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担; 实现声音形式回顾 "电台" 功能; 改进数据存储结构, 实现选择性持久化; 增强可配置性; 使用 Transitions 状态机库重新实现 reactor 状态机, 增强可维护性; 实现整体回顾记忆功能, 与队列式记忆功能并列; 加入状态机快照功能(基于 pickle), 使中断的记忆流程得以恢复; 增加"整体文章引用"功能, 实现从一篇长文本中摘取内容片段记忆并在原文中高亮查看的组织操作. > 下一步? > 使用 Flutter 构建酷酷的现代化前端, 增加云同步/文档源服务... diff --git a/data/repo/test/typedef.toml b/data/repo/test/typedef.toml index 736f11c..9a2b7d9 100644 --- a/data/repo/test/typedef.toml +++ b/data/repo/test/typedef.toml @@ -1,5 +1,3 @@ -["古文句"] - [annotation] note = "笔记" keyword_note = "关键词翻译" diff --git a/examples/simplemem.py b/examples/simplemem.py index fc8ea53..dc1f8c1 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -1,8 +1,11 @@ import heurams.kernel.repolib as repolib import heurams.kernel.particles as pt +from heurams.services.textproc import truncate from pathlib import Path - +import time repo = repolib.Repo.create_from_repodir(Path("./test_repo")) +alist = list() +print(repo.ident_index) for i in repo.ident_index: n = pt.Nucleon.create_on_nucleonic_data( nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) @@ -11,8 +14,38 @@ for i in repo.ident_index: electronic_data=repo.electronic_data_lict.get_itemic_unit(i) ) a = pt.Atom(n, e, repo.orbitic_data) - e.activate() - e.revisor(5, True) + alist.append(a) + #e.activate() + #e.revisor(5, True) print(repr(a)) # print(repr(e)) -# print(repo) +print(repo) +import heurams.kernel.reactor as rt +ph: rt.Phaser = rt.Phaser(alist) +print(ph) +pr: rt.Procession = ph.current_procession() # type: ignore +print(pr) +pr.forward() +print(pr) +pr.forward() # 如果过界了? +print(pr) # 静默设置状态 无报错 +pr.forward() +print(pr) +pr = ph.current_procession() # type: ignore # 下一个队列 +print(pr) +pr.forward() +print(pr) +pr.append() # 如果记忆失败了? +print(pr) +pr.forward() +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +# 重复项目只会占据一个车尾 +print(pr) +pr.forward() +print(pr) +pr = ph.current_procession() # type: ignore +print(pr) diff --git a/examples/test_repo/typedef.toml b/examples/test_repo/typedef.toml index d55cc86..5c1d99e 100644 --- a/examples/test_repo/typedef.toml +++ b/examples/test_repo/typedef.toml @@ -1,5 +1,3 @@ -["古文句"] - [annotation] note = "笔记" keyword_note = "关键词翻译" diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index e0ec3de..c716788 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -12,6 +12,7 @@ import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * +cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" / 'voice' class PrecachingScreen(Screen): """预缓存音频文件屏幕 @@ -88,7 +89,6 @@ class PrecachingScreen(Screen): """预缓存单段文本的音频""" from heurams.context import config_var, rootdir, workdir - cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" cache_dir.mkdir(parents=True, exist_ok=True) cache_file = cache_dir / f"{hasher.get_md5(text)}.wav" if not cache_file.exists(): @@ -205,7 +205,7 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir shutil.rmtree( - f"{config_var.get()["paths"]["data"]}/'cache'", ignore_errors=True + cache_dir, ignore_errors=True ) self.update_status("已清空", "音频缓存已清空", 0) except Exception as e: diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index dffbc82..5714307 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -1,4 +1,4 @@ from .atom import Atom from .electron import Electron from .nucleon import Nucleon -from .orbital import Orbital +#from .orbital import Orbital diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index fd91bf6..e30885f 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -126,12 +126,15 @@ class Phaser(Machine): logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") return None - @property - def state(self): - """获取当前状态值""" - current_state = self.get_model_state(self) - # 将字符串状态转换为PhaserState枚举 - for phase in PhaserState: - if phase.value == current_state: - return phase - return PhaserState.UNSURE + def __repr__(self): + from heurams.services.textproc import truncate + from tabulate import tabulate as tabu + lst = [ + { + "Type": "Phaser", + "State": self.state, + "Processions": list(map(lambda f: (f.name_), self.processions)), + "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore + }, + ] + return str(tabu(lst, headers="keys")) + '\n' diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 256a0de..bebfff7 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -1,6 +1,7 @@ import heurams.kernel.particles as pt from heurams.services.logger import get_logger from transitions import Machine +from tabulate import tabulate as tabu from .states import PhaserState, ProcessionState @@ -10,19 +11,19 @@ logger = get_logger(__name__) class Procession(Machine): """队列: 标识单次记忆流程""" - def __init__(self, atoms: list, phase_state: PhaserState, name: str = ""): + def __init__(self, atoms: list, phase_state: PhaserState, name_: str = ""): logger.debug( "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", len(atoms), phase_state.value, - name, + name_, ) - + self.current_atom: pt.Atom | None self.atoms = atoms self.queue = atoms.copy() self.current_atom = atoms[0] if atoms else None self.cursor = 0 - self.name = name + self.name_ = name_ self.phase = phase_state states = [ @@ -61,9 +62,10 @@ class Procession(Machine): logger.debug("Procession 进入 FINISHED 状态") def forward(self, step=1): + """将记忆原子指针向前移动并依情况更新原子(返回 1)或完成队列(返回 0) + """ logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step - if self.cursor >= len(self.queue): if self.state != ProcessionState.FINISHED.value: self.finish() # 触发状态转换 @@ -78,10 +80,11 @@ class Procession(Machine): self.current_atom.ident if self.current_atom else "None", ) return 1 # 成功 - return 0 def append(self, atom=None): + """追加(回忆失败的)原子(默认为当前原子)到队列末端 + """ if atom is None: atom = self.current_atom logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") @@ -113,15 +116,16 @@ class Procession(Machine): logger.debug("Procession.is_empty: %s", empty) return empty - @property - def state(self): - """获取当前状态值""" - return self.get_model_state(self) - - @state.setter - def state(self, value): - """设置状态值""" - if value == ProcessionState.RUNNING.value: - self.restart() - elif value == ProcessionState.FINISHED.value: - self.finish() + def __repr__(self): + from heurams.services.textproc import truncate + dic = [ + { + "Type": "Procession", + "Name": self.name_, + "State": self.state, + "Progress": f"{self.cursor + 1} / {len(self.queue)}", + "Queue": list(map(lambda f: truncate(f.ident), self.queue)), + "Current Atom": self.current_atom.ident, # type: ignore + } + ] + return str(tabu(dic, headers="keys")) + '\n' diff --git a/src/heurams/kernel/reactor1/__init__.py b/src/heurams/kernel/reactor1/__init__.py deleted file mode 100644 index dc87681..0000000 --- a/src/heurams/kernel/reactor1/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from heurams.services.logger import get_logger - -from .fission import Fission -from .phaser import Phaser -from .procession import Procession -from .states import PhaserState, ProcessionState - -logger = get_logger(__name__) - -__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] - -logger.debug("反应堆模块已加载") diff --git a/src/heurams/kernel/reactor1/fission.py b/src/heurams/kernel/reactor1/fission.py deleted file mode 100644 index 01bfe6c..0000000 --- a/src/heurams/kernel/reactor1/fission.py +++ /dev/null @@ -1,45 +0,0 @@ -import random - -import heurams.kernel.evaluators as puz -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger - -from .states import PhaserState - - -class Fission: - """裂变器: 单原子调度展开器""" - - def __init__(self, atom: pt.Atom, phase=PhaserState.RECOGNITION): - self.logger = get_logger(__name__) - self.atom = atom - # print(f"{phase.value}") - self.orbital_schedule = atom.registry["orbital"]["schedule"][phase.value] # type: ignore - self.orbital_puzzles = atom.registry["orbital"]["puzzles"] - # print(self.orbital_schedule) - self.puzzles = list() - for item, possibility in self.orbital_schedule: # type: ignore - print(f"ad:{item}") - self.logger.debug(f"开始处理 orbital 项: {item}") - if not isinstance(possibility, float): - possibility = float(possibility) - while possibility > 1: - self.puzzles.append( - { - "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], - "alia": item, - } - ) - possibility -= 1 - if random.random() <= possibility: - self.puzzles.append( - { - "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], - "alia": item, - } - ) - print(f"ok:{item}") - self.logger.debug(f"orbital 项处理完成: {item}") - - def generate(self): - yield from self.puzzles diff --git a/src/heurams/kernel/reactor1/phaser.py b/src/heurams/kernel/reactor1/phaser.py deleted file mode 100644 index 250b450..0000000 --- a/src/heurams/kernel/reactor1/phaser.py +++ /dev/null @@ -1,51 +0,0 @@ -# 移相器类定义 - -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger - -from .procession import Procession -from .states import PhaserState, ProcessionState - -logger = get_logger(__name__) - - -class Phaser: - """全局调度阶段管理器""" - - def __init__(self, atoms: list[pt.Atom]) -> None: - logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) - new_atoms = list() - old_atoms = list() - self.state = PhaserState.UNSURE - for i in atoms: - if not i.registry["electron"].is_activated(): - new_atoms.append(i) - else: - old_atoms.append(i) - logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) - self.processions = list() - if len(old_atoms): - self.processions.append( - Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") - ) - logger.debug("创建初始复习 Procession") - if len(new_atoms): - self.processions.append( - Procession(new_atoms, PhaserState.RECOGNITION, "新记忆") - ) - logger.debug("创建新记忆 Procession") - self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) - logger.debug("创建总体复习 Procession") - logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) - - def current_procession(self): - logger.debug("Phaser.current_procession 被调用") - for i in self.processions: - i: Procession - if not i.state == ProcessionState.FINISHED: - self.state = i.phase - logger.debug("找到未完成的 Procession: phase=%s", i.phase) - return i - self.state = PhaserState.FINISHED - logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") - return 0 diff --git a/src/heurams/kernel/reactor1/procession.py b/src/heurams/kernel/reactor1/procession.py deleted file mode 100644 index 39811b6..0000000 --- a/src/heurams/kernel/reactor1/procession.py +++ /dev/null @@ -1,74 +0,0 @@ -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger - -from .states import PhaserState, ProcessionState - -logger = get_logger(__name__) - - -class Procession: - """队列: 标识单次记忆流程""" - - def __init__(self, atoms: list, phase: PhaserState, name: str = ""): - logger.debug( - "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", - len(atoms), - phase.value, - name, - ) - self.atoms = atoms - self.queue = atoms.copy() - self.current_atom = atoms[0] - self.cursor = 0 - self.name = name - self.phase = phase - self.state: ProcessionState = ProcessionState.RUNNING - logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) - - def forward(self, step=1): - logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) - self.cursor += step - if self.cursor == len(self.queue): - self.state = ProcessionState.FINISHED - logger.debug("Procession 已完成") - else: - self.state = ProcessionState.RUNNING - try: - logger.debug("cursor 更新为: %d", self.cursor) - self.current_atom = self.queue[self.cursor] - logger.debug("当前原子更新为: %s", self.current_atom.ident) - return 1 # 成功 - except IndexError as e: - logger.debug("IndexError: %s", e) - self.state = ProcessionState.FINISHED - logger.debug("Procession 因索引错误而完成") - return 0 - - def append(self, atom=None): - if atom == None: - atom = self.current_atom - logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") - if self.queue[len(self.queue) - 1] != atom or len(self) <= 1: - self.queue.append(atom) - logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) - else: - logger.debug("原子未追加(重复或队列长度<=1)") - - def __len__(self): - length = len(self.queue) - self.cursor - logger.debug("Procession.__len__: 剩余长度=%d", length) - return length - - def process(self): - logger.debug("Procession.process: cursor=%d", self.cursor) - return self.cursor - - def total_length(self): - total = len(self.queue) - logger.debug("Procession.total_length: %d", total) - return total - - def is_empty(self): - empty = len(self.queue) - logger.debug("Procession.is_empty: %d", empty) - return empty diff --git a/src/heurams/kernel/reactor1/states.py b/src/heurams/kernel/reactor1/states.py deleted file mode 100644 index 3e48a96..0000000 --- a/src/heurams/kernel/reactor1/states.py +++ /dev/null @@ -1,21 +0,0 @@ -from enum import Enum, auto - -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -class PhaserState(Enum): - UNSURE = "unsure" - QUICK_REVIEW = "quick_review" - RECOGNITION = "recognition" - FINAL_REVIEW = "final_review" - FINISHED = "finished" - - -class ProcessionState(Enum): - RUNNING = auto() - FINISHED = auto() - - -logger.debug("状态枚举定义已加载") diff --git a/src/heurams/services/textproc.py b/src/heurams/services/textproc.py new file mode 100644 index 0000000..729cc43 --- /dev/null +++ b/src/heurams/services/textproc.py @@ -0,0 +1,4 @@ +def truncate(text): + if len(text) <= 3: + return text + return text[:3] + ">" \ No newline at end of file diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index 446090e..6ad5e48 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -22,7 +22,7 @@ class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) self, initlist: list | None = None, initdict: dict | None = None, - forced_order=True, + forced_order=False, ): self.dicted_data = {} if initdict != None: From 5a825f6eb34257a36a218f5a030c72610b411c8e Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 4 Jan 2026 02:11:07 +0800 Subject: [PATCH 11/79] =?UTF-8?q?fix:=20=E9=83=A8=E5=88=86=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=87=8D=E6=9E=84=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=B7=AE=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/repo/test/manifest.toml | 2 +- data/repo/test/payload.toml | 6 - data/repo/test/typedef.toml | 6 +- examples/simplemem.py | 3 + examples/test_repo/typedef.toml | 6 +- src/heurams/interface/screens/memoqueue.py | 118 ++++--------- src/heurams/interface/screens/memoqueueold.py | 167 ++++++++++++++++++ src/heurams/interface/screens/preparation.py | 5 +- src/heurams/interface/shim.py | 29 +-- .../interface/widgets/recognition copy.py | 119 +++++++++++++ src/heurams/interface/widgets/recognition.py | 67 +------ src/heurams/kernel/particles/nucleon.py | 6 +- src/heurams/kernel/reactor/fission.py | 25 ++- src/heurams/kernel/reactor/procession.py | 4 + 14 files changed, 371 insertions(+), 192 deletions(-) create mode 100644 src/heurams/interface/screens/memoqueueold.py create mode 100644 src/heurams/interface/widgets/recognition copy.py diff --git a/data/repo/test/manifest.toml b/data/repo/test/manifest.toml index 5929408..6e5f567 100644 --- a/data/repo/test/manifest.toml +++ b/data/repo/test/manifest.toml @@ -1,3 +1,3 @@ -title = "测试单元 (过秦论)" +title = "测试单元: 过秦论" author = "__heurams__" desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/data/repo/test/payload.toml b/data/repo/test/payload.toml index d9a34db..314995e 100644 --- a/data/repo/test/payload.toml +++ b/data/repo/test/payload.toml @@ -9,9 +9,3 @@ note = [] content = "君臣/固守/以窥/周室,/" translation = "君臣牢固地守卫着,借以窥视周王室的权力," keyword_note = {"窥"="窥视"} - -["有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心."] -note = [] -content = "有/席卷/天下/, 包举/宇内/, 囊括/四海/之意/, 并吞/八荒/之心./" -translation = "有席卷天下,包办天宇之间,囊括四海的意图,并统天下的雄心。" -keyword_note = {"席卷"="像卷席子一样全部卷进去", "包举"="像打包一样全部拿走", "囊括"="像装口袋一样全部装进去", "八荒"="八方荒远之地"} \ No newline at end of file diff --git a/data/repo/test/typedef.toml b/data/repo/test/typedef.toml index 9a2b7d9..1d06672 100644 --- a/data/repo/test/typedef.toml +++ b/data/repo/test/typedef.toml @@ -6,12 +6,12 @@ delimiter = "分隔符" content = "内容" tts_text = "文本转语音文本" -["common"] +[common] delimiter = "/" tts_text = "eval:payload['content'].replace('/', '')" -["common.puzzles"] # 谜题定义, 也可以单独定义到 payload, common 不会对 payload 已有内容进行覆盖, 参见 nucleon.py 第16行 +[common.puzzles] # 谜题定义 # 我们称 "Recognition" 为 recognition 谜题的 alia "Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } "SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/examples/simplemem.py b/examples/simplemem.py index dc1f8c1..fa5e9a7 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -13,6 +13,8 @@ for i in repo.ident_index: e = pt.Electron.create_on_electonic_data( electronic_data=repo.electronic_data_lict.get_itemic_unit(i) ) + print(n) + input() a = pt.Atom(n, e, repo.orbitic_data) alist.append(a) #e.activate() @@ -20,6 +22,7 @@ for i in repo.ident_index: print(repr(a)) # print(repr(e)) print(repo) +input() import heurams.kernel.reactor as rt ph: rt.Phaser = rt.Phaser(alist) print(ph) diff --git a/examples/test_repo/typedef.toml b/examples/test_repo/typedef.toml index 5c1d99e..1d06672 100644 --- a/examples/test_repo/typedef.toml +++ b/examples/test_repo/typedef.toml @@ -6,12 +6,12 @@ delimiter = "分隔符" content = "内容" tts_text = "文本转语音文本" -["common"] +[common] delimiter = "/" tts_text = "eval:payload['content'].replace('/', '')" -["puzzles"] # 谜题定义 +[common.puzzles] # 谜题定义 # 我们称 "Recognition" 为 recognition 谜题的 alia "Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } "SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:metadata['formation']['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 7ab2b8c..6fdcfef 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -28,7 +28,7 @@ logger = get_logger(__name__) class MemScreen(Screen): BINDINGS = [ ("q", "pop_screen", "返回"), - # ("p", "prev", "复习上一个"), + #("p", "prev", "复习上一个"), ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("0,1,2,3", "app.push_screen('about')", ""), @@ -40,65 +40,61 @@ class MemScreen(Screen): def __init__( self, - atoms: list, - name: str | None = None, - id: str | None = None, - classes: str | None = None, + phaser: Phaser, + name = None, + id = None, + classes = None, ) -> None: super().__init__(name, id, classes) - self.atoms = atoms - self.phaser = Phaser(atoms) - # logger.debug(self.phaser.state) - self.procession: Procession = self.phaser.current_procession() # type: ignore - self.atom: pt.Atom = self.procession.current_atom - # logger.debug(self.phaser.state) - # self.procession.forward(1) - - def on_mount(self): - self.load_puzzle() - pass - - def puzzle_widget(self): - try: - logger.debug(self.phaser.state) - logger.debug(self.procession.cursor) - logger.debug(self.atom) - self.fission = Fission(self.atom, self.phaser.state) - puzzle_debug = next(self.fission.generate()) - # logger.debug(puzzle_debug) - return shim.puzzle2widget[puzzle_debug["puzzle"]]( - atom=self.atom, alia=puzzle_debug["alia"] - ) - except (KeyError, StopIteration, AttributeError) as e: - logger.debug(f"调度展开出错: {e}") - return Static("无法生成谜题") - # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) + self.phaser = phaser + self.update_state() def compose(self) -> ComposeResult: yield Header(show_clock=True) with ScrollableContainer(): yield Label(self._get_progress_text(), id="progress") - - # self.mount(self.current_widget()) # type: ignore yield ScrollableContainer(id="puzzle-container") - # yield Button("重新学习此单元", id="re-recognize", variant="warning") yield Footer() + def update_state(self): + """更新状态机""" + self.procession: Procession = self.phaser.current_procession() # type: ignore + self.atom: pt.Atom = self.procession.current_atom # type: ignore + + def on_mount(self): + self.mount_puzzle() + self.update_display() + + def puzzle_widget(self): + try: + self.fission = self.procession.get_fission() + puzzle = self.fission.get_current_puzzle() + # logger.debug(puzzle_debug) + return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore + atom=self.atom, alia=puzzle["alia"] # type: ignore + ) + except (KeyError, StopIteration, AttributeError) as e: + logger.debug(f"调度展开出错: {e}") + return Static(f"无法生成谜题 {e}") + # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) + def _get_progress_text(self): return f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" def update_display(self): + """更新进度显示""" progress_widget = self.query_one("#progress") progress_widget.update(self._get_progress_text()) # type: ignore - def load_puzzle(self): - self.atom: pt.Atom = self.procession.current_atom + def mount_puzzle(self): + """挂载当前谜题组件""" container = self.query_one("#puzzle-container") for i in container.children: i.remove() container.mount(self.puzzle_widget()) - def load_finished_widget(self): + def mount_finished_widget(self): + """挂载已完成组件""" container = self.query_one("#puzzle-container") for i in container.children: i.remove() @@ -109,39 +105,6 @@ class MemScreen(Screen): def on_button_pressed(self, event): event.stop() - def watch_rating(self, old_rating, new_rating) -> None: - if self.procession == 0: - return - if new_rating == -1: - return - forwards = 1 if new_rating >= 4 else 0 - self.rating = -1 - logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") - if forwards: - ret = self.procession.forward(1) - if ret == 0: # 若结束了此次队列 - self.procession = self.phaser.current_procession() # type: ignore - if self.procession == 0: # 若所有队列都结束了 - logger.debug(f"记忆进程结束") - for i in self.atoms: - i: pt.Atom - i.revise() - i.persist("electron") - self.load_finished_widget() - return - else: - logger.debug(f"建立新队列 {self.procession.phase}") - self.load_puzzle() - else: # 若不通过 - self.procession.append() - self.update_display() - - def action_quick_pass(self): - self.rating = 5 - self.atom.minimize(5) - self.atom.registry["electron"].activate() - self.atom.lock(1) - def action_play_voice(self): self.run_worker(self.play_voice, exclusive=True, thread=True) @@ -155,20 +118,13 @@ class MemScreen(Screen): path = Path(config_var.get()["paths"]["cache_dir"]) path = ( path - / f"{get_md5(self.atom.registry['nucleon'].metadata["formation"]["tts_text"])}.wav" + / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" ) if path.exists(): play_by_path(path) else: from heurams.services.tts_service import convertor - convertor( - self.atom.registry["nucleon"].metadata["formation"]["tts_text"], path + self.atom.registry["nucleon"]["tts_text"], path ) - play_by_path(path) - - def action_toggle_dark(self): - self.app.action_toggle_dark() - - def action_pop_screen(self): - self.app.pop_screen() + play_by_path(path) \ No newline at end of file diff --git a/src/heurams/interface/screens/memoqueueold.py b/src/heurams/interface/screens/memoqueueold.py new file mode 100644 index 0000000..4a3bfec --- /dev/null +++ b/src/heurams/interface/screens/memoqueueold.py @@ -0,0 +1,167 @@ +"""队列式记忆工作界面""" + +from enum import Enum, auto + +from textual.app import ComposeResult +from textual.containers import Center, ScrollableContainer +from textual.reactive import reactive +from textual.screen import Screen +from textual.widgets import Button, Footer, Header, Label, Static + +import heurams.kernel.evaluators as pz +import heurams.kernel.particles as pt +from heurams.context import config_var +from heurams.kernel.reactor import * +from heurams.services.logger import get_logger + +from .. import shim + + +class AtomState(Enum): + FAILED = auto() + NORMAL = auto() + + +logger = get_logger(__name__) + + +class MemScreen(Screen): + BINDINGS = [ + ("q", "pop_screen", "返回"), + #("p", "prev", "复习上一个"), + ("d", "toggle_dark", ""), + ("v", "play_voice", "朗读"), + ("0,1,2,3", "app.push_screen('about')", ""), + ] + + if config_var.get()["quick_pass"]: + BINDINGS.append(("k", "quick_pass", "跳过")) + rating = reactive(-1) + + def __init__( + self, + atoms: list, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + self.atoms = atoms + self.phaser = Phaser(atoms) + self.procession: Procession = self.phaser.current_procession() # type: ignore + self.atom: pt.Atom = self.procession.current_atom # type: ignore + + def on_mount(self): + self.load_puzzle() + pass + + def puzzle_widget(self): + try: + logger.debug(self.phaser.state) + logger.debug(self.procession.cursor) + logger.debug(self.atom) + self.fission = Fission(self.atom, self.phaser.state) + puzzle_debug = self.fission.get_puzzles() + # logger.debug(puzzle_debug) + return shim.puzzle2widget[puzzle_debug["puzzle"]]( + atom=self.atom, alia=puzzle_debug["alia"] + ) + except (KeyError, StopIteration, AttributeError) as e: + logger.debug(f"调度展开出错: {e}") + return Static("无法生成谜题") + # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) + + def compose(self) -> ComposeResult: + yield Header(show_clock=True) + with ScrollableContainer(): + yield Label(self._get_progress_text(), id="progress") + + # self.mount(self.current_widget()) # type: ignore + yield ScrollableContainer(id="puzzle-container") + # yield Button("重新学习此单元", id="re-recognize", variant="warning") + yield Footer() + + def _get_progress_text(self): + return f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + + def update_display(self): + progress_widget = self.query_one("#progress") + progress_widget.update(self._get_progress_text()) # type: ignore + + def load_puzzle(self): + self.atom: pt.Atom = self.procession.current_atom # type: ignore + container = self.query_one("#puzzle-container") + for i in container.children: + i.remove() + container.mount(self.puzzle_widget()) + + def load_finished_widget(self): + container = self.query_one("#puzzle-container") + for i in container.children: + i.remove() + from heurams.interface.widgets.finished import Finished + + container.mount(Finished()) + + def on_button_pressed(self, event): + event.stop() + + def watch_rating(self, old_rating, new_rating) -> None: + if self.procession == 0: + return + if new_rating == -1: + return + forwards = 1 if new_rating >= 4 else 0 + self.rating = -1 + logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") + if forwards: + ret = self.procession.forward(1) + if ret == 0: # 若结束了此次队列 + self.procession = self.phaser.current_procession() # type: ignore + if self.procession == 0: # 若所有队列都结束了 + logger.debug(f"记忆进程结束") + self.load_finished_widget() + return + else: + logger.debug(f"建立新队列 {self.procession.phase}") + self.load_puzzle() + else: # 若不通过 + self.procession.append() + self.update_display() + + def action_quick_pass(self): + self.rating = 5 + self.atom.minimize(5) + self.atom.registry["electron"].activate() + self.atom.lock(1) + + def action_play_voice(self): + self.run_worker(self.play_voice, exclusive=True, thread=True) + + def play_voice(self): + """朗读当前内容""" + from pathlib import Path + + from heurams.services.audio_service import play_by_path + from heurams.services.hasher import get_md5 + + path = Path(config_var.get()["paths"]["cache_dir"]) + path = ( + path + / f"{get_md5(self.atom.registry['nucleon'].metadata["formation"]["tts_text"])}.wav" + ) + if path.exists(): + play_by_path(path) + else: + from heurams.services.tts_service import convertor + + convertor( + self.atom.registry["nucleon"].metadata["formation"]["tts_text"], path + ) + play_by_path(path) + + def action_toggle_dark(self): + self.app.action_toggle_dark() + + def action_pop_screen(self): + self.app.pop_screen() diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index b563744..2fc1c77 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -127,8 +127,9 @@ class PreparationScreen(Screen): if left_new >= 0: atoms_to_provide.append(i) from .memoqueue import MemScreen - - memscreen = MemScreen(atoms_to_provide) + import heurams.kernel.reactor as rt + pheser = rt.Phaser(atoms_to_provide) + memscreen = MemScreen(pheser) self.app.push_screen(memscreen) elif event.button.id == "precache_button": diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 1868282..9268938 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -1,37 +1,10 @@ """Kernel 操作辅助函数库""" - -import random -from typing import TypedDict - import heurams.interface.widgets as pzw import heurams.kernel.evaluators as pz -import heurams.kernel.particles as pt - -staging = {} # 细粒度缓存区, 是 ident -> quality 的封装 - - -def report_to_staging(atom: pt.Atom, quality): - staging[atom.ident] = min(quality, staging[atom.ident]) - - -def clear(): - staging = dict() - - -def deploy_to_electron(): - for atom_ident, quality in staging.items(): - if pt.atom_registry[atom_ident].registry["electron"].is_activated: - pt.atom_registry[atom_ident].registry["electron"].revisor(quality=quality) - else: - pt.atom_registry[atom_ident].registry["electron"].revisor( - quality=quality, is_new_activation=True - ) - clear() - puzzle2widget = { pz.RecognitionPuzzle: pzw.Recognition, pz.ClozePuzzle: pzw.ClozePuzzle, pz.MCQPuzzle: pzw.MCQPuzzle, - pz.BasePuzzle: pzw.BasePuzzleWidget, + pz.BaseEvaluator: pzw.BasePuzzleWidget, } diff --git a/src/heurams/interface/widgets/recognition copy.py b/src/heurams/interface/widgets/recognition copy.py new file mode 100644 index 0000000..ca0389a --- /dev/null +++ b/src/heurams/interface/widgets/recognition copy.py @@ -0,0 +1,119 @@ +import re +from typing import Dict, List, TypedDict + +from textual.containers import Center +from textual.message import Message +from textual.reactive import reactive +from textual.widget import Widget +from textual.widgets import Button, Label, Markdown, Static + +import heurams.kernel.particles as pt +from heurams.services.logger import get_logger + +from .base_puzzle_widget import BasePuzzleWidget + +logger = get_logger(__name__) + + +class RecognitionConfig(TypedDict): + __origin__: str + __hint__: str + primary: str + secondary: List[str] + top_dim: List[str] + + +class Recognition(BasePuzzleWidget): + def __init__( + self, + *children: Widget, + atom: pt.Atom, + alia: str = "", + name: str | None = None, + id: str | None = None, + classes: str | None = None, + disabled: bool = False, + markup: bool = True, + ) -> None: + super().__init__( + *children, + atom=atom, + name=name, + id=id, + classes=classes, + disabled=disabled, + markup=markup, + ) + if alia == "": + alia = "Recognition" + self.alia = alia + + def compose(self): + from heurams.context import config_var + + autovoice = config_var.get()["interface"]["memorizor"]["autovoice"] + if autovoice: + self.screen.action_play_voice() # type: ignore + cfg: RecognitionConfig = self.atom.registry["orbital"]["puzzles"][self.alia] + delim = self.atom.registry["nucleon"]["delimiter"] + replace_dict = { + ", ": ",", + ". ": ".", + "; ": ";", + ": ": ":", + f"{delim},": ",", + f".{delim}": ".", + f"{delim};": ";", + f";{delim}": ";", + f":{delim}": ":", + } + + nucleon = self.atom.registry["nucleon"] + metadata = self.atom.registry["nucleon"].metadata + primary = cfg["primary"] + + with Center(): + for i in cfg["top_dim"]: + yield Static(f"[dim]{i}[/]") + yield Label("") + + for old, new in replace_dict.items(): + primary = primary.replace(old, new) + primary_splited = re.split(r"(?<=[,;:|])", cfg["primary"]) + for item in primary_splited: + with Center(): + yield Label( + f"[b][b]{item.replace(delim, ' ')}[/][/]", + id="sentence" + str(hash(item)), + ) + + for item in cfg["secondary"]: + if isinstance(item, list): + for j in item: + yield Markdown(f"### {metadata['annotation'][item]}: {j}") + continue + if isinstance(item, Dict): + total = "" + for j, k in item.items(): # type: ignore + total += f"> **{j}**: {k} \n" + yield Markdown(total) + if isinstance(item, str): + yield Markdown(item) + + with Center(): + yield Button("我已知晓", id="ok") + + def on_button_pressed(self, event: Button.Pressed) -> None: + if event.button.id == "ok": + self.screen.rating = 5 # type: ignore + self.handler(5) + + def handler(self, rating): + if not self.atom.registry["runtime"]["locked"]: + if not self.atom.registry["electron"].is_activated(): + self.atom.registry["electron"].activate() + logger.debug(f"激活原子 {self.atom}") + self.atom.lock(1) + self.atom.minimize(5) + else: + pass diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 7b4364c..1fbad13 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -49,71 +49,10 @@ class Recognition(BasePuzzleWidget): self.alia = alia def compose(self): - from heurams.context import config_var - - autovoice = config_var.get()["interface"]["memorizor"]["autovoice"] - if autovoice: - self.screen.action_play_voice() # type: ignore - cfg: RecognitionConfig = self.atom.registry["orbital"]["puzzles"][self.alia] - delim = self.atom.registry["nucleon"].metadata["formation"]["delimiter"] - replace_dict = { - ", ": ",", - ". ": ".", - "; ": ";", - ": ": ":", - f"{delim},": ",", - f".{delim}": ".", - f"{delim};": ";", - f";{delim}": ";", - f":{delim}": ":", - } - - nucleon = self.atom.registry["nucleon"] - metadata = self.atom.registry["nucleon"].metadata - primary = cfg["primary"] - - with Center(): - for i in cfg["top_dim"]: - yield Static(f"[dim]{i}[/]") - yield Label("") - - for old, new in replace_dict.items(): - primary = primary.replace(old, new) - primary_splited = re.split(r"(?<=[,;:|])", cfg["primary"]) - for item in primary_splited: - with Center(): - yield Label( - f"[b][b]{item.replace(delim, ' ')}[/][/]", - id="sentence" + str(hash(item)), - ) - - for item in cfg["secondary"]: - if isinstance(item, list): - for j in item: - yield Markdown(f"### {metadata['annotation'][item]}: {j}") - continue - if isinstance(item, Dict): - total = "" - for j, k in item.items(): # type: ignore - total += f"> **{j}**: {k} \n" - yield Markdown(total) - if isinstance(item, str): - yield Markdown(item) - - with Center(): - yield Button("我已知晓", id="ok") + yield Button("我已知晓", id="ok") def on_button_pressed(self, event: Button.Pressed) -> None: - if event.button.id == "ok": - self.screen.rating = 5 # type: ignore - self.handler(5) + pass def handler(self, rating): - if not self.atom.registry["runtime"]["locked"]: - if not self.atom.registry["electron"].is_activated(): - self.atom.registry["electron"].activate() - logger.debug(f"激活原子 {self.atom}") - self.atom.lock(1) - self.atom.minimize(5) - else: - pass + pass \ No newline at end of file diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 61e4d56..1a59732 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,7 +1,9 @@ from copy import deepcopy +from logging import config from heurams.services.logger import get_logger from heurams.utils.evalizor import Evalizer +from heurams.context import config_var logger = get_logger(__name__) @@ -11,7 +13,9 @@ class Nucleon: def __init__(self, ident, payload, common): self.ident = ident - env = {"payload": payload} + env = {"payload": payload, + "default": config_var.get()['puzzles'], + "nucleon": (payload | common)} self.evalizer = Evalizer(environment=env) self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index a7499a0..866265e 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -11,6 +11,7 @@ class Fission: """单原子调度展开器""" def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION): + self.cursor = 0 self.logger = get_logger(__name__) self.atom = atom @@ -19,7 +20,7 @@ class Fission: phase_state.value if isinstance(phase_state, PhaserState) else phase_state ) - self.orbital_schedule = atom.registry["phases"][phase_value] # type: ignore + self.orbital_schedule = atom.registry['orbital']["phases"][phase_value] # type: ignore self.orbital_puzzles = atom.registry["nucleon"]["puzzles"] self.puzzles = list() @@ -33,6 +34,7 @@ class Fission: { "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], "alia": item, + "finished": 0, } ) possibility -= 1 @@ -42,10 +44,27 @@ class Fission: { "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], "alia": item, + "finished": 0, } ) self.logger.debug(f"orbital 项处理完成: {item}") - def get_puzzles_list(self): - yield from self.puzzles + def get_puzzles(self): + return self.puzzles + + def get_current_puzzle(self, forward = 0): + if forward: + if len(self.puzzles) <= self.cursor + 1: + return 0 + self.cursor += 1 + return self.puzzles[self.cursor] + else: + return self.puzzles[self.cursor] + + + def check_passed(self): + for i in self.puzzles: + if i["finished"] == 0: + return 0 + return 1 \ No newline at end of file diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index bebfff7..e013a1f 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -3,6 +3,7 @@ from heurams.services.logger import get_logger from transitions import Machine from tabulate import tabulate as tabu +from .fission import Fission from .states import PhaserState, ProcessionState logger = get_logger(__name__) @@ -116,6 +117,9 @@ class Procession(Machine): logger.debug("Procession.is_empty: %s", empty) return empty + def get_fission(self): + return Fission(atom=self.current_atom, phase_state=self.phase) # type: ignore + def __repr__(self): from heurams.services.textproc import truncate dic = [ From 4d494546b88b6eacfff6c65c38da6440174700e7 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 4 Jan 2026 03:46:45 +0800 Subject: [PATCH 12/79] =?UTF-8?q?fix(interface):=20=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=B8=BB=E8=A6=81=E5=B1=8F=E5=B9=95=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/__init__.py | 6 +- src/heurams/interface/screens/dashboard.py | 7 +- src/heurams/interface/screens/memoqueue.py | 31 +++- src/heurams/interface/screens/memoqueueold.py | 167 ------------------ .../interface/widgets/recognition copy.py | 119 ------------- src/heurams/interface/widgets/recognition.py | 67 ++++++- src/heurams/utils/evalizor.py | 2 - 7 files changed, 98 insertions(+), 301 deletions(-) delete mode 100644 src/heurams/interface/screens/memoqueueold.py delete mode 100644 src/heurams/interface/widgets/recognition copy.py diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index f825008..16704b2 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -17,9 +17,9 @@ def environment_check(): from pathlib import Path logger.debug("检查环境路径") - - for i in config_var.get()["paths"].values(): - i = Path(i) + subdir = ['cache/voice', 'repo', 'global', 'config'] + for i in subdir: + i = Path(config_var.get()['paths']['data']) / i if not i.exists(): logger.info("创建目录: %s", i) print(f"创建 {i}") diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 3fb9aee..5a7d6c0 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -42,10 +42,9 @@ class DashboardScreen(Screen): yield Header(show_clock=True) yield ScrollableContainer( Label('欢迎使用 "潜进" 启发式辅助记忆调度器', classes="title-label"), - Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()}"), - Label(f'时区修正: UTC+{config_var.get()["timezone_offset"] / 3600}'), - Label(f"使用算法: {config_var.get()['algorithm']['default']}"), - Label("选择待学习或待修改的仓库:", classes="title-label"), + Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()["timezone_offset"] / 3600})"), + Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), + Label("选择待学习或待修改的项目:", classes="title-label"), ListView(id="repo-list", classes="repo-list-view"), Label(f'"潜进" 启发式辅助记忆调度器 | 版本 {version.ver} '), ) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 6fdcfef..01f7f56 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -28,7 +28,7 @@ logger = get_logger(__name__) class MemScreen(Screen): BINDINGS = [ ("q", "pop_screen", "返回"), - #("p", "prev", "复习上一个"), + ("p", "prev", "查看上一个"), ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("0,1,2,3", "app.push_screen('about')", ""), @@ -115,7 +115,7 @@ class MemScreen(Screen): from heurams.services.audio_service import play_by_path from heurams.services.hasher import get_md5 - path = Path(config_var.get()["paths"]["cache_dir"]) + path = Path(config_var.get()["paths"]['data']) / 'cache' / 'voice' path = ( path / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" @@ -127,4 +127,29 @@ class MemScreen(Screen): convertor( self.atom.registry["nucleon"]["tts_text"], path ) - play_by_path(path) \ No newline at end of file + play_by_path(path) + + def watch_rating(self, old_rating, new_rating) -> None: + self.update_state() # 刷新状态 + if self.procession == None: # 已经完成记忆 + return + if new_rating == -1: # 安全值 + return + forwards = 1 if new_rating >= 4 else 0 # 准许前进 + self.rating = -1 + logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") + if forwards: + ret = self.procession.forward(1) + if ret == 0: # 若结束了此次队列 + self.update_state() + if self.procession == 0: # 若所有队列都结束了 + logger.debug(f"记忆进程结束") + self.mount_finished_widget() + return + else: + logger.debug(f"建立新队列 {self.procession.phase}") + self.update_state() + self.mount_puzzle() + else: # 若不通过 + self.procession.append() + self.update_display() diff --git a/src/heurams/interface/screens/memoqueueold.py b/src/heurams/interface/screens/memoqueueold.py deleted file mode 100644 index 4a3bfec..0000000 --- a/src/heurams/interface/screens/memoqueueold.py +++ /dev/null @@ -1,167 +0,0 @@ -"""队列式记忆工作界面""" - -from enum import Enum, auto - -from textual.app import ComposeResult -from textual.containers import Center, ScrollableContainer -from textual.reactive import reactive -from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, Static - -import heurams.kernel.evaluators as pz -import heurams.kernel.particles as pt -from heurams.context import config_var -from heurams.kernel.reactor import * -from heurams.services.logger import get_logger - -from .. import shim - - -class AtomState(Enum): - FAILED = auto() - NORMAL = auto() - - -logger = get_logger(__name__) - - -class MemScreen(Screen): - BINDINGS = [ - ("q", "pop_screen", "返回"), - #("p", "prev", "复习上一个"), - ("d", "toggle_dark", ""), - ("v", "play_voice", "朗读"), - ("0,1,2,3", "app.push_screen('about')", ""), - ] - - if config_var.get()["quick_pass"]: - BINDINGS.append(("k", "quick_pass", "跳过")) - rating = reactive(-1) - - def __init__( - self, - atoms: list, - name: str | None = None, - id: str | None = None, - classes: str | None = None, - ) -> None: - super().__init__(name, id, classes) - self.atoms = atoms - self.phaser = Phaser(atoms) - self.procession: Procession = self.phaser.current_procession() # type: ignore - self.atom: pt.Atom = self.procession.current_atom # type: ignore - - def on_mount(self): - self.load_puzzle() - pass - - def puzzle_widget(self): - try: - logger.debug(self.phaser.state) - logger.debug(self.procession.cursor) - logger.debug(self.atom) - self.fission = Fission(self.atom, self.phaser.state) - puzzle_debug = self.fission.get_puzzles() - # logger.debug(puzzle_debug) - return shim.puzzle2widget[puzzle_debug["puzzle"]]( - atom=self.atom, alia=puzzle_debug["alia"] - ) - except (KeyError, StopIteration, AttributeError) as e: - logger.debug(f"调度展开出错: {e}") - return Static("无法生成谜题") - # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) - - def compose(self) -> ComposeResult: - yield Header(show_clock=True) - with ScrollableContainer(): - yield Label(self._get_progress_text(), id="progress") - - # self.mount(self.current_widget()) # type: ignore - yield ScrollableContainer(id="puzzle-container") - # yield Button("重新学习此单元", id="re-recognize", variant="warning") - yield Footer() - - def _get_progress_text(self): - return f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" - - def update_display(self): - progress_widget = self.query_one("#progress") - progress_widget.update(self._get_progress_text()) # type: ignore - - def load_puzzle(self): - self.atom: pt.Atom = self.procession.current_atom # type: ignore - container = self.query_one("#puzzle-container") - for i in container.children: - i.remove() - container.mount(self.puzzle_widget()) - - def load_finished_widget(self): - container = self.query_one("#puzzle-container") - for i in container.children: - i.remove() - from heurams.interface.widgets.finished import Finished - - container.mount(Finished()) - - def on_button_pressed(self, event): - event.stop() - - def watch_rating(self, old_rating, new_rating) -> None: - if self.procession == 0: - return - if new_rating == -1: - return - forwards = 1 if new_rating >= 4 else 0 - self.rating = -1 - logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") - if forwards: - ret = self.procession.forward(1) - if ret == 0: # 若结束了此次队列 - self.procession = self.phaser.current_procession() # type: ignore - if self.procession == 0: # 若所有队列都结束了 - logger.debug(f"记忆进程结束") - self.load_finished_widget() - return - else: - logger.debug(f"建立新队列 {self.procession.phase}") - self.load_puzzle() - else: # 若不通过 - self.procession.append() - self.update_display() - - def action_quick_pass(self): - self.rating = 5 - self.atom.minimize(5) - self.atom.registry["electron"].activate() - self.atom.lock(1) - - def action_play_voice(self): - self.run_worker(self.play_voice, exclusive=True, thread=True) - - def play_voice(self): - """朗读当前内容""" - from pathlib import Path - - from heurams.services.audio_service import play_by_path - from heurams.services.hasher import get_md5 - - path = Path(config_var.get()["paths"]["cache_dir"]) - path = ( - path - / f"{get_md5(self.atom.registry['nucleon'].metadata["formation"]["tts_text"])}.wav" - ) - if path.exists(): - play_by_path(path) - else: - from heurams.services.tts_service import convertor - - convertor( - self.atom.registry["nucleon"].metadata["formation"]["tts_text"], path - ) - play_by_path(path) - - def action_toggle_dark(self): - self.app.action_toggle_dark() - - def action_pop_screen(self): - self.app.pop_screen() diff --git a/src/heurams/interface/widgets/recognition copy.py b/src/heurams/interface/widgets/recognition copy.py deleted file mode 100644 index ca0389a..0000000 --- a/src/heurams/interface/widgets/recognition copy.py +++ /dev/null @@ -1,119 +0,0 @@ -import re -from typing import Dict, List, TypedDict - -from textual.containers import Center -from textual.message import Message -from textual.reactive import reactive -from textual.widget import Widget -from textual.widgets import Button, Label, Markdown, Static - -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger - -from .base_puzzle_widget import BasePuzzleWidget - -logger = get_logger(__name__) - - -class RecognitionConfig(TypedDict): - __origin__: str - __hint__: str - primary: str - secondary: List[str] - top_dim: List[str] - - -class Recognition(BasePuzzleWidget): - def __init__( - self, - *children: Widget, - atom: pt.Atom, - alia: str = "", - name: str | None = None, - id: str | None = None, - classes: str | None = None, - disabled: bool = False, - markup: bool = True, - ) -> None: - super().__init__( - *children, - atom=atom, - name=name, - id=id, - classes=classes, - disabled=disabled, - markup=markup, - ) - if alia == "": - alia = "Recognition" - self.alia = alia - - def compose(self): - from heurams.context import config_var - - autovoice = config_var.get()["interface"]["memorizor"]["autovoice"] - if autovoice: - self.screen.action_play_voice() # type: ignore - cfg: RecognitionConfig = self.atom.registry["orbital"]["puzzles"][self.alia] - delim = self.atom.registry["nucleon"]["delimiter"] - replace_dict = { - ", ": ",", - ". ": ".", - "; ": ";", - ": ": ":", - f"{delim},": ",", - f".{delim}": ".", - f"{delim};": ";", - f";{delim}": ";", - f":{delim}": ":", - } - - nucleon = self.atom.registry["nucleon"] - metadata = self.atom.registry["nucleon"].metadata - primary = cfg["primary"] - - with Center(): - for i in cfg["top_dim"]: - yield Static(f"[dim]{i}[/]") - yield Label("") - - for old, new in replace_dict.items(): - primary = primary.replace(old, new) - primary_splited = re.split(r"(?<=[,;:|])", cfg["primary"]) - for item in primary_splited: - with Center(): - yield Label( - f"[b][b]{item.replace(delim, ' ')}[/][/]", - id="sentence" + str(hash(item)), - ) - - for item in cfg["secondary"]: - if isinstance(item, list): - for j in item: - yield Markdown(f"### {metadata['annotation'][item]}: {j}") - continue - if isinstance(item, Dict): - total = "" - for j, k in item.items(): # type: ignore - total += f"> **{j}**: {k} \n" - yield Markdown(total) - if isinstance(item, str): - yield Markdown(item) - - with Center(): - yield Button("我已知晓", id="ok") - - def on_button_pressed(self, event: Button.Pressed) -> None: - if event.button.id == "ok": - self.screen.rating = 5 # type: ignore - self.handler(5) - - def handler(self, rating): - if not self.atom.registry["runtime"]["locked"]: - if not self.atom.registry["electron"].is_activated(): - self.atom.registry["electron"].activate() - logger.debug(f"激活原子 {self.atom}") - self.atom.lock(1) - self.atom.minimize(5) - else: - pass diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 1fbad13..5192940 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -49,10 +49,71 @@ class Recognition(BasePuzzleWidget): self.alia = alia def compose(self): - yield Button("我已知晓", id="ok") + from heurams.context import config_var + + autovoice = config_var.get()["interface"]["memorizor"]["autovoice"] + if autovoice: + self.screen.action_play_voice() # type: ignore + cfg: RecognitionConfig = self.atom.registry["nucleon"]["puzzles"][self.alia] + delim = self.atom.registry["nucleon"]["delimiter"] + replace_dict = { + ", ": ",", + ". ": ".", + "; ": ";", + ": ": ":", + f"{delim},": ",", + f".{delim}": ".", + f"{delim};": ";", + f";{delim}": ";", + f":{delim}": ":", + } + + nucleon = self.atom.registry["nucleon"] + metadata = self.atom.registry["nucleon"] + primary = cfg["primary"] + + with Center(): + for i in cfg["top_dim"]: + yield Static(f"[dim]{i}[/]") + yield Label("") + + for old, new in replace_dict.items(): + primary = primary.replace(old, new) + primary_splited = re.split(r"(?<=[,;:|])", cfg["primary"]) + for item in primary_splited: + with Center(): + yield Label( + f"[b][b]{item.replace(delim, ' ')}[/][/]", + id="sentence" + str(hash(item)), + ) + + for item in cfg["secondary"]: + if isinstance(item, list): + for j in item: + yield Markdown(f"### {metadata['annotation'][item]}: {j}") + continue + if isinstance(item, Dict): + total = "" + for j, k in item.items(): # type: ignore + total += f"> **{j}**: {k} \n" + yield Markdown(total) + if isinstance(item, str): + yield Markdown(item) + + with Center(): + yield Button("我已知晓", id="ok") def on_button_pressed(self, event: Button.Pressed) -> None: - pass + if event.button.id == "ok": + self.screen.rating = 5 # type: ignore + self.handler(5) def handler(self, rating): - pass \ No newline at end of file + if not self.atom.registry["runtime"]["locked"]: + if not self.atom.registry["electron"].is_activated(): + self.atom.registry["electron"].activate() + logger.debug(f"激活原子 {self.atom}") + self.atom.lock(1) + self.atom.minimize(5) + else: + pass diff --git a/src/heurams/utils/evalizor.py b/src/heurams/utils/evalizor.py index b58138e..b0a220c 100644 --- a/src/heurams/utils/evalizor.py +++ b/src/heurams/utils/evalizor.py @@ -30,6 +30,4 @@ class Evalizer: def eval_with_env(self, s: str): ret = eval(s, globals(), self.env) - if not isinstance(ret, str): - ret = str(ret) return ret From b8b1c5e0d71788640665a7ab7fc02adbd6466300 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 4 Jan 2026 04:14:57 +0800 Subject: [PATCH 13/79] =?UTF-8?q?fix(interface):=20=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/repo/test/schedule.toml | 6 ++- src/heurams/interface/screens/memoqueue.py | 6 ++- src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 6 +-- src/heurams/kernel/particles/placeholders.py | 41 +++++++++++++++++++ src/heurams/kernel/reactor/phaser.py | 3 +- 6 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/heurams/kernel/particles/placeholders.py diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml index d62ef1f..393b8d3 100644 --- a/data/repo/test/schedule.toml +++ b/data/repo/test/schedule.toml @@ -2,4 +2,8 @@ schedule = ["quick_review", "recognition", "final_review"] [phases] quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] recognition = [["Recognition", "1.0"]] -final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file +final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] +[annotation] +"quick_review" = "复习旧知" +"recognition" = "新知识" +"final_review" = "总复习" \ No newline at end of file diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 01f7f56..df5afe9 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -79,7 +79,9 @@ class MemScreen(Screen): # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) def _get_progress_text(self): - return f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + s = f"阶段: {self.procession.phase.name}\n" + s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + return s def update_display(self): """更新进度显示""" @@ -142,7 +144,7 @@ class MemScreen(Screen): ret = self.procession.forward(1) if ret == 0: # 若结束了此次队列 self.update_state() - if self.procession == 0: # 若所有队列都结束了 + if self.procession.phase == PhaserState.FINISHED: # 若所有队列都结束了 logger.debug(f"记忆进程结束") self.mount_finished_widget() return diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index e342116..5d71dc9 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -53,7 +53,7 @@ class ClozePuzzle(BasePuzzleWidget): self.hashmap = dict() def _load(self): - setting = self.atom.registry["orbital"]["puzzles"][self.alia] + setting = self.atom.registry["nucleon"]["puzzles"][self.alia] self.puzzle = pz.ClozePuzzle( text=setting["text"], delimiter=setting["delimiter"], diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 878b4e9..d08ccd5 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -61,11 +61,7 @@ class MCQPuzzle(BasePuzzleWidget): self.puzzle.refresh() def compose(self): - setting: Setting = self.atom.registry["nucleon"].metadata["orbital"]["puzzles"][ - self.alia - ] - logger.debug(f"Puzzle Setting: {setting}") - logger.debug(f"WIRED INDEX: {len(self.inputlist)}") + setting: Setting = self.atom.registry["nucleon"]["puzzles"][self.alia] if len(self.inputlist) > len(self.puzzle.options): logger.debug("ERR IDX") logger.debug(self.inputlist) diff --git a/src/heurams/kernel/particles/placeholders.py b/src/heurams/kernel/particles/placeholders.py new file mode 100644 index 0000000..6190d94 --- /dev/null +++ b/src/heurams/kernel/particles/placeholders.py @@ -0,0 +1,41 @@ +from heurams.kernel.particles import orbital +from .electron import Electron +from .nucleon import Nucleon +from .atom import Atom + +orbital_placeholder = { + "schedule": ["quick_review", "recognition", "final_review"], + "phases": { + "quick_review": [ + ["FillBlank", 1.0], + ["SelectMeaning", 0.5], + ["Recognition", 1.0], + ], + "recognition": [["Recognition", 1.0]], + "final_review": [ + ["FillBlank", 0.7], + ["SelectMeaning", 0.7], + ["Recognition", 1.0], + ], + }, +} + + +class NucleonPlaceholder(Nucleon): + def __init__(self): + super().__init__("__placeholder__", {}, {}) + + def __getitem__(self, key): + return f"__placeholder__ attempted {key}" + + +class ElectronPlaceholder(Electron): + def __init__(self): + super().__init__("__placeholder__", {"": {"": ""}}, "") + + +class AtomPlaceholder(Atom): + def __init__(self): + super().__init__( + NucleonPlaceholder(), ElectronPlaceholder(), orbital_placeholder + ) diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index e30885f..9fcbd75 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,4 +1,5 @@ import heurams.kernel.particles as pt +from heurams.kernel.particles.placeholders import AtomPlaceholder from heurams.services.logger import get_logger from transitions import Machine @@ -124,7 +125,7 @@ class Phaser(Machine): # 所有Procession都已完成 self.to_finished() logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") - return None + return Procession([AtomPlaceholder()], PhaserState.FINISHED) def __repr__(self): from heurams.services.textproc import truncate From 1d0c87b5f7f9390dc13686da26d5366bab19c326 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 4 Jan 2026 04:46:19 +0800 Subject: [PATCH 14/79] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/simplemem.py | 28 +- src/heurams/interface/__init__.py | 4 +- src/heurams/interface/screens/dashboard.py | 6 +- src/heurams/interface/screens/memoqueue.py | 36 +-- src/heurams/interface/screens/precache.py | 7 +- src/heurams/interface/screens/preparation.py | 1 + src/heurams/interface/shim.py | 1 + src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/kernel/algorithms/__init__.py | 6 - src/heurams/kernel/evaluators/__init__.py | 37 --- src/heurams/kernel/particles/__init__.py | 19 +- src/heurams/kernel/particles/nucleon.py | 8 +- src/heurams/kernel/reactor/__init__.py | 4 - src/heurams/kernel/reactor/fission.py | 9 +- src/heurams/kernel/reactor/phaser.py | 5 +- src/heurams/kernel/reactor/procession.py | 13 +- src/heurams/kernel/repolib/__init__.py | 4 +- src/heurams/kernel/repolib/aux.py | 5 - src/heurams/services/textproc.py | 2 +- src/heurams/utils/__init__.py | 5 + tests/interface/test_dashboard.py | 153 --------- tests/interface/test_synctool.py | 317 ------------------- tests/kernel/algorithms/__init__.py | 0 tests/kernel/algorithms/test_sm2.py | 186 ----------- tests/kernel/particles/__init__.py | 0 tests/kernel/particles/test_atom.py | 202 ------------ tests/kernel/particles/test_electron.py | 179 ----------- tests/kernel/particles/test_nucleon.py | 108 ------- tests/kernel/puzzles/__init__.py | 0 tests/kernel/puzzles/test_base.py | 23 -- tests/kernel/puzzles/test_cloze.py | 51 --- tests/kernel/puzzles/test_mcq.py | 122 ------- tests/kernel/reactor/__init__.py | 0 tests/kernel/reactor/test_phaser.py | 114 ------- 34 files changed, 87 insertions(+), 1570 deletions(-) delete mode 100644 src/heurams/kernel/repolib/aux.py delete mode 100644 tests/interface/test_dashboard.py delete mode 100644 tests/interface/test_synctool.py delete mode 100644 tests/kernel/algorithms/__init__.py delete mode 100644 tests/kernel/algorithms/test_sm2.py delete mode 100644 tests/kernel/particles/__init__.py delete mode 100644 tests/kernel/particles/test_atom.py delete mode 100644 tests/kernel/particles/test_electron.py delete mode 100644 tests/kernel/particles/test_nucleon.py delete mode 100644 tests/kernel/puzzles/__init__.py delete mode 100644 tests/kernel/puzzles/test_base.py delete mode 100644 tests/kernel/puzzles/test_cloze.py delete mode 100644 tests/kernel/puzzles/test_mcq.py delete mode 100644 tests/kernel/reactor/__init__.py delete mode 100644 tests/kernel/reactor/test_phaser.py diff --git a/examples/simplemem.py b/examples/simplemem.py index fa5e9a7..e33cbbc 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -3,6 +3,7 @@ import heurams.kernel.particles as pt from heurams.services.textproc import truncate from pathlib import Path import time + repo = repolib.Repo.create_from_repodir(Path("./test_repo")) alist = list() print(repo.ident_index) @@ -17,38 +18,39 @@ for i in repo.ident_index: input() a = pt.Atom(n, e, repo.orbitic_data) alist.append(a) - #e.activate() - #e.revisor(5, True) + # e.activate() + # e.revisor(5, True) print(repr(a)) # print(repr(e)) print(repo) input() import heurams.kernel.reactor as rt + ph: rt.Phaser = rt.Phaser(alist) print(ph) -pr: rt.Procession = ph.current_procession() # type: ignore +pr: rt.Procession = ph.current_procession() # type: ignore print(pr) pr.forward() print(pr) -pr.forward() # 如果过界了? -print(pr) # 静默设置状态 无报错 +pr.forward() # 如果过界了? +print(pr) # 静默设置状态 无报错 pr.forward() print(pr) -pr = ph.current_procession() # type: ignore # 下一个队列 +pr = ph.current_procession() # type: ignore # 下一个队列 print(pr) pr.forward() print(pr) -pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? print(pr) pr.forward() -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? +pr.append() # 如果记忆失败了? # 重复项目只会占据一个车尾 print(pr) pr.forward() print(pr) -pr = ph.current_procession() # type: ignore +pr = ph.current_procession() # type: ignore print(pr) diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 16704b2..f36099f 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -17,9 +17,9 @@ def environment_check(): from pathlib import Path logger.debug("检查环境路径") - subdir = ['cache/voice', 'repo', 'global', 'config'] + subdir = ["cache/voice", "repo", "global", "config"] for i in subdir: - i = Path(config_var.get()['paths']['data']) / i + i = Path(config_var.get()["paths"]["data"]) / i if not i.exists(): logger.info("创建目录: %s", i) print(f"创建 {i}") diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 5a7d6c0..34f8902 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -14,6 +14,8 @@ from heurams.kernel.particles import * from heurams.kernel.repolib import * from heurams.services.logger import get_logger +import heurams.kernel.particles as pt +from pathlib import Path from .about import AboutScreen from .preparation import PreparationScreen @@ -42,7 +44,9 @@ class DashboardScreen(Screen): yield Header(show_clock=True) yield ScrollableContainer( Label('欢迎使用 "潜进" 启发式辅助记忆调度器', classes="title-label"), - Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()["timezone_offset"] / 3600})"), + Label( + f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()["timezone_offset"] / 3600})" + ), Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), Label("选择待学习或待修改的项目:", classes="title-label"), ListView(id="repo-list", classes="repo-list-view"), diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index df5afe9..36bf9b3 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -41,9 +41,9 @@ class MemScreen(Screen): def __init__( self, phaser: Phaser, - name = None, - id = None, - classes = None, + name=None, + id=None, + classes=None, ) -> None: super().__init__(name, id, classes) self.phaser = phaser @@ -59,7 +59,7 @@ class MemScreen(Screen): def update_state(self): """更新状态机""" self.procession: Procession = self.phaser.current_procession() # type: ignore - self.atom: pt.Atom = self.procession.current_atom # type: ignore + self.atom: pt.Atom = self.procession.current_atom # type: ignore def on_mount(self): self.mount_puzzle() @@ -69,14 +69,12 @@ class MemScreen(Screen): try: self.fission = self.procession.get_fission() puzzle = self.fission.get_current_puzzle() - # logger.debug(puzzle_debug) - return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore - atom=self.atom, alia=puzzle["alia"] # type: ignore + return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore + atom=self.atom, alia=puzzle["alia"] # type: ignore ) except (KeyError, StopIteration, AttributeError) as e: logger.debug(f"调度展开出错: {e}") return Static(f"无法生成谜题 {e}") - # logger.debug(shim.puzzle2widget[puzzle_debug["puzzle"]]) def _get_progress_text(self): s = f"阶段: {self.procession.phase.name}\n" @@ -117,32 +115,28 @@ class MemScreen(Screen): from heurams.services.audio_service import play_by_path from heurams.services.hasher import get_md5 - path = Path(config_var.get()["paths"]['data']) / 'cache' / 'voice' - path = ( - path - / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" - ) + path = Path(config_var.get()["paths"]["data"]) / "cache" / "voice" + path = path / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" if path.exists(): play_by_path(path) else: from heurams.services.tts_service import convertor - convertor( - self.atom.registry["nucleon"]["tts_text"], path - ) + + convertor(self.atom.registry["nucleon"]["tts_text"], path) play_by_path(path) def watch_rating(self, old_rating, new_rating) -> None: - self.update_state() # 刷新状态 - if self.procession == None: # 已经完成记忆 + self.update_state() # 刷新状态 + if self.procession == None: # 已经完成记忆 return - if new_rating == -1: # 安全值 + if new_rating == -1: # 安全值 return - forwards = 1 if new_rating >= 4 else 0 # 准许前进 + forwards = 1 if new_rating >= 4 else 0 # 准许前进 self.rating = -1 logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") if forwards: ret = self.procession.forward(1) - if ret == 0: # 若结束了此次队列 + if ret == 0: # 若结束了此次队列 self.update_state() if self.procession.phase == PhaserState.FINISHED: # 若所有队列都结束了 logger.debug(f"记忆进程结束") diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index c716788..0bb54d5 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -12,7 +12,8 @@ import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * -cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" / 'voice' +cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" / "voice" + class PrecachingScreen(Screen): """预缓存音频文件屏幕 @@ -204,9 +205,7 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir - shutil.rmtree( - cache_dir, ignore_errors=True - ) + shutil.rmtree(cache_dir, ignore_errors=True) self.update_status("已清空", "音频缓存已清空", 0) except Exception as e: self.update_status("错误", f"清空缓存失败: {e}") diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 2fc1c77..17bd421 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -128,6 +128,7 @@ class PreparationScreen(Screen): atoms_to_provide.append(i) from .memoqueue import MemScreen import heurams.kernel.reactor as rt + pheser = rt.Phaser(atoms_to_provide) memscreen = MemScreen(pheser) self.app.push_screen(memscreen) diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 9268938..32aa73d 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -1,4 +1,5 @@ """Kernel 操作辅助函数库""" + import heurams.interface.widgets as pzw import heurams.kernel.evaluators as pz diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index d08ccd5..10d6780 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -54,7 +54,7 @@ class MCQPuzzle(BasePuzzleWidget): self._load() def _load(self): - cfg = self.atom.registry["orbital"]["puzzles"][self.alia] + cfg = self.atom.registry["nucleon"]["puzzles"][self.alia] self.puzzle = pz.MCQPuzzle( cfg["mapping"], cfg["jammer"], int(cfg["max_riddles_num"]), cfg["prefix"] ) diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index 1914f78..e0b7ae5 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -1,11 +1,7 @@ -from heurams.services.logger import get_logger - from .base import BaseAlgorithm from .sm2 import SM2Algorithm from .sm15m import SM15MAlgorithm -logger = get_logger(__name__) - __all__ = [ "SM2Algorithm", "BaseAlgorithm", @@ -17,5 +13,3 @@ algorithms = { "SM-15M": SM15MAlgorithm, "Base": BaseAlgorithm, } - -logger.debug("算法模块初始化完成, 注册的算法: %s", list(algorithms.keys())) diff --git a/src/heurams/kernel/evaluators/__init__.py b/src/heurams/kernel/evaluators/__init__.py index 8dd3a86..6bc5688 100644 --- a/src/heurams/kernel/evaluators/__init__.py +++ b/src/heurams/kernel/evaluators/__init__.py @@ -6,8 +6,6 @@ Evaluator 模块 - 生成评估模块 from heurams.services.logger import get_logger -logger = get_logger(__name__) - from .base import BaseEvaluator from .cloze import ClozePuzzle from .mcq import MCQPuzzle @@ -26,38 +24,3 @@ puzzles = { "recognition": RecognitionPuzzle, "base": BaseEvaluator, } - - -@staticmethod -def create_by_dict(config_dict: dict) -> BaseEvaluator: - """ - 根据配置字典创建谜题 - - Args: - config_dict: 配置字典, 包含谜题类型和参数 - - Returns: - BasePuzzle: 谜题实例 - - Raises: - ValueError: 当配置无效时抛出 - """ - logger.debug( - "puzzles.create_by_dict: config_dict keys=%s", list(config_dict.keys()) - ) - puzzle_type = config_dict.get("type") - - if puzzle_type == "cloze": - return puzzles["cloze"]( - text=config_dict["text"], - min_denominator=config_dict.get("min_denominator", 7), - ) - elif puzzle_type == "mcq": - return puzzles["mcq"]( - mapping=config_dict["mapping"], - jammer=config_dict.get("jammer", []), - max_riddles_num=config_dict.get("max_riddles_num", 2), - prefix=config_dict.get("prefix", ""), - ) - else: - raise ValueError(f"未知的谜题类型: {puzzle_type}") diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index 5714307..211e9d5 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -1,4 +1,21 @@ from .atom import Atom from .electron import Electron from .nucleon import Nucleon -#from .orbital import Orbital +from .placeholders import ( + AtomPlaceholder, + NucleonPlaceholder, + ElectronPlaceholder, + orbital_placeholder, +) + +# from .orbital import Orbital + +__all__ = [ + "Atom", + "Electron", + "Nucleon", + "AtomPlaceholder", + "NucleonPlaceholder", + "ElectronPlaceholder", + "orbital_placeholder", +] diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 1a59732..e34875f 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -13,9 +13,11 @@ class Nucleon: def __init__(self, ident, payload, common): self.ident = ident - env = {"payload": payload, - "default": config_var.get()['puzzles'], - "nucleon": (payload | common)} + env = { + "payload": payload, + "default": config_var.get()["puzzles"], + "nucleon": (payload | common), + } self.evalizer = Evalizer(environment=env) self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore diff --git a/src/heurams/kernel/reactor/__init__.py b/src/heurams/kernel/reactor/__init__.py index dc87681..f9242fa 100644 --- a/src/heurams/kernel/reactor/__init__.py +++ b/src/heurams/kernel/reactor/__init__.py @@ -5,8 +5,4 @@ from .phaser import Phaser from .procession import Procession from .states import PhaserState, ProcessionState -logger = get_logger(__name__) - __all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] - -logger.debug("反应堆模块已加载") diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 866265e..9b665cc 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -20,7 +20,7 @@ class Fission: phase_state.value if isinstance(phase_state, PhaserState) else phase_state ) - self.orbital_schedule = atom.registry['orbital']["phases"][phase_value] # type: ignore + self.orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore self.orbital_puzzles = atom.registry["nucleon"]["puzzles"] self.puzzles = list() @@ -34,7 +34,6 @@ class Fission: { "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], "alia": item, - "finished": 0, } ) possibility -= 1 @@ -44,7 +43,6 @@ class Fission: { "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], "alia": item, - "finished": 0, } ) @@ -53,7 +51,7 @@ class Fission: def get_puzzles(self): return self.puzzles - def get_current_puzzle(self, forward = 0): + def get_current_puzzle(self, forward=0): if forward: if len(self.puzzles) <= self.cursor + 1: return 0 @@ -61,10 +59,9 @@ class Fission: return self.puzzles[self.cursor] else: return self.puzzles[self.cursor] - def check_passed(self): for i in self.puzzles: if i["finished"] == 0: return 0 - return 1 \ No newline at end of file + return 1 diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 9fcbd75..03dcf75 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -130,12 +130,13 @@ class Phaser(Machine): def __repr__(self): from heurams.services.textproc import truncate from tabulate import tabulate as tabu + lst = [ { "Type": "Phaser", "State": self.state, "Processions": list(map(lambda f: (f.name_), self.processions)), - "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore + "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore }, ] - return str(tabu(lst, headers="keys")) + '\n' + return str(tabu(lst, headers="keys")) + "\n" diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index e013a1f..07daeb5 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -63,8 +63,7 @@ class Procession(Machine): logger.debug("Procession 进入 FINISHED 状态") def forward(self, step=1): - """将记忆原子指针向前移动并依情况更新原子(返回 1)或完成队列(返回 0) - """ + """将记忆原子指针向前移动并依情况更新原子(返回 1)或完成队列(返回 0)""" logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step if self.cursor >= len(self.queue): @@ -84,8 +83,7 @@ class Procession(Machine): return 0 def append(self, atom=None): - """追加(回忆失败的)原子(默认为当前原子)到队列末端 - """ + """追加(回忆失败的)原子(默认为当前原子)到队列末端""" if atom is None: atom = self.current_atom logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") @@ -118,10 +116,11 @@ class Procession(Machine): return empty def get_fission(self): - return Fission(atom=self.current_atom, phase_state=self.phase) # type: ignore + return Fission(atom=self.current_atom, phase_state=self.phase) # type: ignore def __repr__(self): from heurams.services.textproc import truncate + dic = [ { "Type": "Procession", @@ -129,7 +128,7 @@ class Procession(Machine): "State": self.state, "Progress": f"{self.cursor + 1} / {len(self.queue)}", "Queue": list(map(lambda f: truncate(f.ident), self.queue)), - "Current Atom": self.current_atom.ident, # type: ignore + "Current Atom": self.current_atom.ident, # type: ignore } ] - return str(tabu(dic, headers="keys")) + '\n' + return str(tabu(dic, headers="keys")) + "\n" diff --git a/src/heurams/kernel/repolib/__init__.py b/src/heurams/kernel/repolib/__init__.py index 7ecd655..ed5311c 100644 --- a/src/heurams/kernel/repolib/__init__.py +++ b/src/heurams/kernel/repolib/__init__.py @@ -1 +1,3 @@ -from .repo import * +from .repo import Repo, RepoManifest + +__all__ = ["Repo", "RepoManifest"] diff --git a/src/heurams/kernel/repolib/aux.py b/src/heurams/kernel/repolib/aux.py deleted file mode 100644 index 068231e..0000000 --- a/src/heurams/kernel/repolib/aux.py +++ /dev/null @@ -1,5 +0,0 @@ -from ...utils.lict import Lict - - -def merge(x: Lict, y: Lict): - return Lict(list(x.values()) + list(y.values())) diff --git a/src/heurams/services/textproc.py b/src/heurams/services/textproc.py index 729cc43..fd78134 100644 --- a/src/heurams/services/textproc.py +++ b/src/heurams/services/textproc.py @@ -1,4 +1,4 @@ def truncate(text): if len(text) <= 3: return text - return text[:3] + ">" \ No newline at end of file + return text[:3] + ">" diff --git a/src/heurams/utils/__init__.py b/src/heurams/utils/__init__.py index e69de29..2e09240 100644 --- a/src/heurams/utils/__init__.py +++ b/src/heurams/utils/__init__.py @@ -0,0 +1,5 @@ +from .evalizor import Evalizer +from .lict import Lict +from .refvar import RefVar + +__all__ = ["Evalizer", "Lict", "RefVar"] diff --git a/tests/interface/test_dashboard.py b/tests/interface/test_dashboard.py deleted file mode 100644 index 42ca79a..0000000 --- a/tests/interface/test_dashboard.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -""" -DashboardScreen 的测试, 包括单元测试和 pilot 测试. -""" -import pathlib -import tempfile -import time -import unittest -from unittest.mock import MagicMock, patch - -from textual.pilot import Pilot - -from heurams.context import ConfigContext -from heurams.interface.__main__ import HeurAMSApp -from heurams.interface.screens.dashboard import DashboardScreen -from heurams.services.config import ConfigFile - - -class TestDashboardScreenUnit(unittest.TestCase): - """DashboardScreen 的单元测试(不启动完整应用).""" - - def setUp(self): - """在每个测试之前运行, 设置临时目录和配置.""" - # 创建临时目录用于测试数据 - self.temp_dir = tempfile.TemporaryDirectory() - self.temp_path = pathlib.Path(self.temp_dir.name) - - # 创建默认配置, 并修改路径指向临时目录 - default_config_path = ( - pathlib.Path(__file__).parent.parent.parent - / "src/heurams/default/config/config.toml" - ) - self.config = ConfigFile(default_config_path) - # 更新配置中的路径 - config_data = self.config.data - config_data["paths"]["nucleon_dir"] = str(self.temp_path / "nucleon") - config_data["paths"]["electron_dir"] = str(self.temp_path / "electron") - config_data["paths"]["orbital_dir"] = str(self.temp_path / "orbital") - config_data["paths"]["cache_dir"] = str(self.temp_path / "cache") - # 禁用快速通过, 避免测试干扰 - config_data["quick_pass"] = 0 - # 禁用时间覆盖 - config_data["daystamp_override"] = -1 - config_data["timestamp_override"] = -1 - - # 创建目录 - for dir_key in ["nucleon_dir", "electron_dir", "orbital_dir", "cache_dir"]: - pathlib.Path(config_data["paths"][dir_key]).mkdir( - parents=True, exist_ok=True - ) - - # 使用 ConfigContext 设置配置 - self.config_ctx = ConfigContext(self.config) - self.config_ctx.__enter__() - - def tearDown(self): - """在每个测试之后清理.""" - self.config_ctx.__exit__(None, None, None) - self.temp_dir.cleanup() - - def test_compose(self): - """测试 compose 方法返回正确的部件.""" - screen = DashboardScreen() - # 手动调用 compose 并收集部件 - from textual.app import ComposeResult - - result = screen.compose() - widgets = list(result) - # 检查是否包含 Header 和 Footer - from textual.widgets import Footer, Header - - header_present = any(isinstance(w, Header) for w in widgets) - footer_present = any(isinstance(w, Footer) for w in widgets) - self.assertTrue(header_present) - self.assertTrue(footer_present) - # 检查是否有 ScrollableContainer - from textual.containers import ScrollableContainer - - container_present = any(isinstance(w, ScrollableContainer) for w in widgets) - self.assertTrue(container_present) - # 使用 query_one 查找 union-list, 即使屏幕未挂载也可能有效 - list_view = screen.query_one("#union-list") - self.assertIsNotNone(list_view) - self.assertEqual(list_view.id, "union-list") - self.assertEqual(list_view.__class__.__name__, "ListView") - - def test_item_desc_generator(self): - """测试 item_desc_generator 函数.""" - screen = DashboardScreen() - # 模拟一个文件名 - filename = "test.toml" - result = screen.analyser(filename) - self.assertIsInstance(result, dict) - self.assertIn(0, result) - self.assertIn(1, result) - # 检查内容 - self.assertIn("test.toml", result[0]) - # 由于 electron 文件不存在, 应显示“尚未激活” - self.assertIn("尚未激活", result[1]) - - -@unittest.skip("Pilot 测试需要进一步配置, 暂不运行") -class TestDashboardScreenPilot(unittest.TestCase): - """使用 Textual Pilot 的集成测试.""" - - def setUp(self): - """配置临时目录和配置.""" - self.temp_dir = tempfile.TemporaryDirectory() - self.temp_path = pathlib.Path(self.temp_dir.name) - - default_config_path = ( - pathlib.Path(__file__).parent.parent.parent - / "src/heurams/default/config/config.toml" - ) - self.config = ConfigFile(default_config_path) - config_data = self.config.data - config_data["paths"]["nucleon_dir"] = str(self.temp_path / "nucleon") - config_data["paths"]["electron_dir"] = str(self.temp_path / "electron") - config_data["paths"]["orbital_dir"] = str(self.temp_path / "orbital") - config_data["paths"]["cache_dir"] = str(self.temp_path / "cache") - config_data["quick_pass"] = 0 - config_data["daystamp_override"] = -1 - config_data["timestamp_override"] = -1 - - for dir_key in ["nucleon_dir", "electron_dir", "orbital_dir", "cache_dir"]: - pathlib.Path(config_data["paths"][dir_key]).mkdir( - parents=True, exist_ok=True - ) - - self.config_ctx = ConfigContext(self.config) - self.config_ctx.__enter__() - - def tearDown(self): - self.config_ctx.__exit__(None, None, None) - self.temp_dir.cleanup() - - def test_dashboard_loads_with_pilot(self): - """使用 Pilot 测试 DashboardScreen 加载.""" - with patch("heurams.interface.__main__.environment_check"): - app = HeurAMSApp() - # 注意: Pilot 在 Textual 6.9.0 中的用法可能不同 - # 以下为示例代码, 可能需要调整 - pilot = Pilot(app) - # 等待应用启动 - pilot.pause() - screen = app.screen - self.assertEqual(screen.__class__.__name__, "DashboardScreen") - union_list = app.query_one("#union-list") - self.assertIsNotNone(union_list) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/interface/test_synctool.py b/tests/interface/test_synctool.py deleted file mode 100644 index 096ac8a..0000000 --- a/tests/interface/test_synctool.py +++ /dev/null @@ -1,317 +0,0 @@ -#!/usr/bin/env python3 -""" -SyncScreen 和 SyncService 的测试. -""" -import pathlib -import tempfile -import time -import unittest -from unittest.mock import MagicMock, Mock, patch - -from heurams.context import ConfigContext -from heurams.services.config import ConfigFile -from heurams.services.sync_service import ( - ConflictStrategy, - SyncConfig, - SyncMode, - SyncService, -) - - -class TestSyncServiceUnit(unittest.TestCase): - """SyncService 的单元测试.""" - - def setUp(self): - """在每个测试之前运行, 设置临时目录和模拟客户端.""" - self.temp_dir = tempfile.TemporaryDirectory() - self.temp_path = pathlib.Path(self.temp_dir.name) - - # 创建测试文件 - self.test_file = self.temp_path / "test.txt" - self.test_file.write_text("测试内容") - - # 模拟 WebDAV 客户端 - self.mock_client = MagicMock() - - # 创建同步配置 - self.config = SyncConfig( - enabled=True, - url="https://example.com/dav/", - username="test", - password="test", - remote_path="/heurams/", - sync_mode=SyncMode.BIDIRECTIONAL, - conflict_strategy=ConflictStrategy.NEWER, - verify_ssl=True, - ) - - def tearDown(self): - """在每个测试之后清理.""" - self.temp_dir.cleanup() - - @patch("heurams.services.sync_service.Client") - def test_sync_service_initialization(self, mock_client_class): - """测试同步服务初始化.""" - mock_client_class.return_value = self.mock_client - - service = SyncService(self.config) - - # 验证客户端已创建 - mock_client_class.assert_called_once() - self.assertIsNotNone(service.client) - self.assertEqual(service.config, self.config) - - @patch("heurams.services.sync_service.Client") - def test_sync_service_disabled(self, mock_client_class): - """测试同步服务未启用.""" - config = SyncConfig(enabled=False) - service = SyncService(config) - - # 客户端不应初始化 - mock_client_class.assert_not_called() - self.assertIsNone(service.client) - - @patch("heurams.services.sync_service.Client") - def test_test_connection_success(self, mock_client_class): - """测试连接测试成功.""" - mock_client_class.return_value = self.mock_client - self.mock_client.list.return_value = [] - - service = SyncService(self.config) - result = service.test_connection() - - self.assertTrue(result) - self.mock_client.list.assert_called_once() - - @patch("heurams.services.sync_service.Client") - def test_test_connection_failure(self, mock_client_class): - """测试连接测试失败.""" - mock_client_class.return_value = self.mock_client - self.mock_client.list.side_effect = Exception("连接失败") - - service = SyncService(self.config) - result = service.test_connection() - - self.assertFalse(result) - self.mock_client.list.assert_called_once() - - @patch("heurams.services.sync_service.Client") - def test_upload_file(self, mock_client_class): - """测试上传单个文件.""" - mock_client_class.return_value = self.mock_client - - service = SyncService(self.config) - result = service.upload_file(self.test_file) - - self.assertTrue(result) - self.mock_client.upload_file.assert_called_once() - - @patch("heurams.services.sync_service.Client") - def test_download_file(self, mock_client_class): - """测试下载单个文件.""" - mock_client_class.return_value = self.mock_client - - service = SyncService(self.config) - remote_path = "/heurams/test.txt" - local_path = self.temp_path / "downloaded.txt" - - result = service.download_file(remote_path, local_path) - - self.assertTrue(result) - self.mock_client.download_file.assert_called_once() - self.assertTrue(local_path.parent.exists()) - - @patch("heurams.services.sync_service.Client") - def test_sync_directory_no_files(self, mock_client_class): - """测试同步空目录.""" - mock_client_class.return_value = self.mock_client - self.mock_client.list.return_value = [] - self.mock_client.mkdir.return_value = None - - service = SyncService(self.config) - result = service.sync_directory(self.temp_path) - - self.assertTrue(result["success"]) - self.assertEqual(result["uploaded"], 0) - self.assertEqual(result["downloaded"], 0) - self.mock_client.mkdir.assert_called_once() - - @patch("heurams.services.sync_service.Client") - def test_sync_directory_upload_only(self, mock_client_class): - """测试仅上传模式.""" - mock_client_class.return_value = self.mock_client - self.mock_client.list.return_value = [] - self.mock_client.mkdir.return_value = None - - config = SyncConfig( - enabled=True, - url="https://example.com/dav/", - username="test", - password="test", - remote_path="/heurams/", - sync_mode=SyncMode.UPLOAD_ONLY, - conflict_strategy=ConflictStrategy.NEWER, - ) - - service = SyncService(config) - result = service.sync_directory(self.temp_path) - - self.assertTrue(result["success"]) - self.mock_client.mkdir.assert_called_once() - - @patch("heurams.services.sync_service.Client") - def test_conflict_strategy_newer(self, mock_client_class): - """测试 NEWER 冲突策略.""" - mock_client_class.return_value = self.mock_client - - # 模拟远程文件存在 - self.mock_client.list.return_value = ["test.txt"] - self.mock_client.info.return_value = { - "size": 100, - "modified": "2023-01-01T00:00:00Z", - } - self.mock_client.mkdir.return_value = None - - service = SyncService(self.config) - result = service.sync_directory(self.temp_path) - - self.assertTrue(result["success"]) - # 应该有一个冲突 - self.assertGreaterEqual(result.get("conflicts", 0), 0) - - @patch("heurams.services.sync_service.Client") - def test_create_sync_service_from_config(self, mock_client_class): - """测试从配置文件创建同步服务.""" - mock_client_class.return_value = self.mock_client - - # 创建临时配置文件 - config_data = { - "sync": { - "webdav": { - "enabled": True, - "url": "https://example.com/dav/", - "username": "test", - "password": "test", - "remote_path": "/heurams/", - "sync_mode": "bidirectional", - "conflict_strategy": "newer", - "verify_ssl": True, - } - } - } - - # 模拟 config_var - with patch("heurams.services.sync_service.config_var") as mock_config_var: - mock_config = MagicMock() - mock_config.data = config_data - mock_config_var.get.return_value = mock_config - - from heurams.services.sync_service import create_sync_service_from_config - - service = create_sync_service_from_config() - - self.assertIsNotNone(service) - self.assertIsNotNone(service.client) - - -class TestSyncScreenUnit(unittest.TestCase): - """SyncScreen 的单元测试.""" - - def setUp(self): - """在每个测试之前运行.""" - self.temp_dir = tempfile.TemporaryDirectory() - self.temp_path = pathlib.Path(self.temp_dir.name) - - # 创建默认配置 - default_config_path = ( - pathlib.Path(__file__).parent.parent.parent - / "src/heurams/default/config/config.toml" - ) - self.config = ConfigFile(default_config_path) - - # 更新配置中的路径 - config_data = self.config.data - config_data["paths"]["nucleon_dir"] = str(self.temp_path / "nucleon") - config_data["paths"]["electron_dir"] = str(self.temp_path / "electron") - config_data["paths"]["orbital_dir"] = str(self.temp_path / "orbital") - config_data["paths"]["cache_dir"] = str(self.temp_path / "cache") - - # 添加同步配置 - if "sync" not in config_data: - config_data["sync"] = {} - config_data["sync"]["webdav"] = { - "enabled": False, - "url": "", - "username": "", - "password": "", - "remote_path": "/heurams/", - "sync_mode": "bidirectional", - "conflict_strategy": "newer", - "verify_ssl": True, - } - - # 创建目录 - for dir_key in ["nucleon_dir", "electron_dir", "orbital_dir", "cache_dir"]: - pathlib.Path(config_data["paths"][dir_key]).mkdir( - parents=True, exist_ok=True - ) - - # 使用 ConfigContext 设置配置 - self.config_ctx = ConfigContext(self.config) - self.config_ctx.__enter__() - - def tearDown(self): - """在每个测试之后清理.""" - self.config_ctx.__exit__(None, None, None) - self.temp_dir.cleanup() - - @patch("heurams.interface.screens.synctool.create_sync_service_from_config") - def test_sync_screen_compose(self, mock_create_service): - """测试 SyncScreen 的 compose 方法.""" - from heurams.interface.screens.synctool import SyncScreen - - # 模拟同步服务 - mock_service = MagicMock() - mock_service.client = MagicMock() - mock_create_service.return_value = mock_service - - screen = SyncScreen() - - # 测试 compose 方法 - from textual.app import ComposeResult - - result = screen.compose() - widgets = list(result) - - # 检查基本部件 - from textual.containers import ScrollableContainer - from textual.widgets import Button, Footer, Header, ProgressBar, Static - - header_present = any(isinstance(w, Header) for w in widgets) - footer_present = any(isinstance(w, Footer) for w in widgets) - self.assertTrue(header_present) - self.assertTrue(footer_present) - - # 检查容器 - container_present = any(isinstance(w, ScrollableContainer) for w in widgets) - self.assertTrue(container_present) - - @patch("heurams.interface.screens.synctool.create_sync_service_from_config") - def test_sync_screen_load_config(self, mock_create_service): - """测试 SyncScreen 加载配置.""" - from heurams.interface.screens.synctool import SyncScreen - - mock_service = MagicMock() - mock_service.client = MagicMock() - mock_create_service.return_value = mock_service - - screen = SyncScreen() - screen.load_config() - - # 验证配置已加载 - self.assertIsNotNone(screen.sync_config) - mock_create_service.assert_called_once() - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/algorithms/__init__.py b/tests/kernel/algorithms/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/kernel/algorithms/test_sm2.py b/tests/kernel/algorithms/test_sm2.py deleted file mode 100644 index ecc1a24..0000000 --- a/tests/kernel/algorithms/test_sm2.py +++ /dev/null @@ -1,186 +0,0 @@ -import unittest -from unittest.mock import MagicMock, patch - -from heurams.kernel.algorithms.sm2 import SM2Algorithm - - -class TestSM2Algorithm(unittest.TestCase): - """测试 SM2Algorithm 类""" - - def setUp(self): - # 模拟 timer 函数 - self.timestamp_patcher = patch( - "heurams.kernel.algorithms.sm2.timer.get_timestamp" - ) - self.daystamp_patcher = patch( - "heurams.kernel.algorithms.sm2.timer.get_daystamp" - ) - self.mock_get_timestamp = self.timestamp_patcher.start() - self.mock_get_daystamp = self.daystamp_patcher.start() - - # 设置固定返回值 - self.mock_get_timestamp.return_value = 1000.0 - self.mock_get_daystamp.return_value = 100 - - def tearDown(self): - self.timestamp_patcher.stop() - self.daystamp_patcher.stop() - - def test_defaults(self): - """测试默认值""" - defaults = SM2Algorithm.defaults - self.assertEqual(defaults["efactor"], 2.5) - self.assertEqual(defaults["real_rept"], 0) - self.assertEqual(defaults["rept"], 0) - self.assertEqual(defaults["interval"], 0) - self.assertEqual(defaults["last_date"], 0) - self.assertEqual(defaults["next_date"], 0) - self.assertEqual(defaults["is_activated"], 0) - # last_modify 是动态的, 仅检查存在性 - self.assertIn("last_modify", defaults) - - def test_revisor_feedback_minus_one(self): - """测试 feedback = -1 时跳过更新""" - algodata = {SM2Algorithm.algo_name: SM2Algorithm.defaults.copy()} - SM2Algorithm.revisor(algodata, feedback=-1) - # 数据应保持不变 - self.assertEqual(algodata[SM2Algorithm.algo_name]["efactor"], 2.5) - self.assertEqual(algodata[SM2Algorithm.algo_name]["rept"], 0) - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 0) - - def test_revisor_feedback_less_than_3(self): - """测试 feedback < 3 重置 rept 和 interval""" - algodata = { - SM2Algorithm.algo_name: { - "efactor": 2.5, - "rept": 5, - "interval": 10, - "real_rept": 3, - } - } - SM2Algorithm.revisor(algodata, feedback=2) - self.assertEqual(algodata[SM2Algorithm.algo_name]["rept"], 0) - # rept=0 导致 interval 被设置为 1 - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 1) - self.assertEqual(algodata[SM2Algorithm.algo_name]["real_rept"], 4) # 递增 - - def test_revisor_feedback_greater_equal_3(self): - """测试 feedback >= 3 递增 rept""" - algodata = { - SM2Algorithm.algo_name: { - "efactor": 2.5, - "rept": 2, - "interval": 6, - "real_rept": 2, - } - } - SM2Algorithm.revisor(algodata, feedback=4) - self.assertEqual(algodata[SM2Algorithm.algo_name]["rept"], 3) - self.assertEqual(algodata[SM2Algorithm.algo_name]["real_rept"], 3) - # interval 应根据 rept 和 efactor 重新计算 - # rept=3, interval = round(6 * 2.5) = 15 - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 15) - - def test_revisor_new_activation(self): - """测试 is_new_activation 重置 rept 和 efactor""" - algodata = { - SM2Algorithm.algo_name: { - "efactor": 3.0, - "rept": 5, - "interval": 20, - "real_rept": 5, - } - } - SM2Algorithm.revisor(algodata, feedback=5, is_new_activation=True) - self.assertEqual(algodata[SM2Algorithm.algo_name]["rept"], 0) - self.assertEqual(algodata[SM2Algorithm.algo_name]["efactor"], 2.5) - # interval 应为 1(因为 rept=0) - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 1) - - def test_revisor_efactor_calculation(self): - """测试 efactor 计算""" - algodata = { - SM2Algorithm.algo_name: { - "efactor": 2.5, - "rept": 1, - "interval": 6, - "real_rept": 1, - } - } - SM2Algorithm.revisor(algodata, feedback=5) - # efactor = 2.5 + (0.1 - (5-5)*(0.08 + (5-5)*0.02)) = 2.5 + 0.1 = 2.6 - self.assertAlmostEqual( - algodata[SM2Algorithm.algo_name]["efactor"], 2.6, places=6 - ) - - # 测试 efactor 下限为 1.3 - algodata[SM2Algorithm.algo_name]["efactor"] = 1.2 - SM2Algorithm.revisor(algodata, feedback=5) - self.assertEqual(algodata[SM2Algorithm.algo_name]["efactor"], 1.3) - - def test_revisor_interval_calculation(self): - """测试 interval 计算规则""" - algodata = { - SM2Algorithm.algo_name: { - "efactor": 2.5, - "rept": 0, - "interval": 0, - "real_rept": 0, - } - } - SM2Algorithm.revisor(algodata, feedback=4) - # rept 从 0 递增到 1, 因此 interval 应为 6 - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 6) - - # 现在 rept=1, 再次调用 revisor 递增到 2 - SM2Algorithm.revisor(algodata, feedback=4) - # rept=2, interval = round(6 * 2.5) = 15 - self.assertEqual(algodata[SM2Algorithm.algo_name]["interval"], 15) - - # 单独测试 rept=1 的情况 - algodata2 = { - SM2Algorithm.algo_name: { - "efactor": 2.5, - "rept": 1, - "interval": 0, - "real_rept": 0, - } - } - SM2Algorithm.revisor(algodata2, feedback=4) - # rept 递增到 2, interval = round(0 * 2.5) = 0 - self.assertEqual(algodata2[SM2Algorithm.algo_name]["interval"], 0) - - def test_revisor_updates_dates(self): - """测试更新日期字段""" - algodata = {SM2Algorithm.algo_name: SM2Algorithm.defaults.copy()} - self.mock_get_daystamp.return_value = 200 - SM2Algorithm.revisor(algodata, feedback=5) - self.assertEqual(algodata[SM2Algorithm.algo_name]["last_date"], 200) - self.assertEqual( - algodata[SM2Algorithm.algo_name]["next_date"], - 200 + algodata[SM2Algorithm.algo_name]["interval"], - ) - self.assertEqual(algodata[SM2Algorithm.algo_name]["last_modify"], 1000.0) - - def test_is_due(self): - """测试 is_due 方法""" - algodata = {SM2Algorithm.algo_name: {"next_date": 100}} - self.mock_get_daystamp.return_value = 150 - self.assertTrue(SM2Algorithm.is_due(algodata)) - - algodata[SM2Algorithm.algo_name]["next_date"] = 200 - self.assertFalse(SM2Algorithm.is_due(algodata)) - - def test_rate(self): - """测试 rate 方法""" - algodata = {SM2Algorithm.algo_name: {"efactor": 2.7}} - self.assertEqual(SM2Algorithm.get_rating(algodata), "2.7") - - def test_nextdate(self): - """测试 nextdate 方法""" - algodata = {SM2Algorithm.algo_name: {"next_date": 12345}} - self.assertEqual(SM2Algorithm.nextdate(algodata), 12345) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/particles/__init__.py b/tests/kernel/particles/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/kernel/particles/test_atom.py b/tests/kernel/particles/test_atom.py deleted file mode 100644 index 09371d5..0000000 --- a/tests/kernel/particles/test_atom.py +++ /dev/null @@ -1,202 +0,0 @@ -import json -import pathlib -import tempfile -import unittest -from unittest.mock import MagicMock, patch - -import toml - -from heurams.context import ConfigContext -from heurams.kernel.particles.atom import Atom, atom_registry -from heurams.kernel.particles.electron import Electron -from heurams.kernel.particles.nucleon import Nucleon -from heurams.kernel.particles.orbital import Orbital -from heurams.services.config import ConfigFile - - -class TestAtom(unittest.TestCase): - """测试 Atom 类""" - - def setUp(self): - """在每个测试之前运行""" - # 创建临时目录用于持久化测试 - self.temp_dir = tempfile.TemporaryDirectory() - self.temp_path = pathlib.Path(self.temp_dir.name) - - # 创建默认配置 - self.config = ConfigFile( - pathlib.Path(__file__).parent.parent.parent.parent - / "src/heurams/default/config/config.toml" - ) - - # 使用 ConfigContext 设置配置 - self.config_ctx = ConfigContext(self.config) - self.config_ctx.__enter__() - - # 清空全局注册表 - atom_registry.clear() - - def tearDown(self): - """在每个测试之后运行""" - self.config_ctx.__exit__(None, None, None) - self.temp_dir.cleanup() - atom_registry.clear() - - def test_init(self): - """测试 Atom 初始化""" - atom = Atom("test_atom") - self.assertEqual(atom.ident, "test_atom") - self.assertIn("test_atom", atom_registry) - self.assertEqual(atom_registry["test_atom"], atom) - - # 检查 registry 默认值 - self.assertIsNone(atom.registry["nucleon"]) - self.assertIsNone(atom.registry["electron"]) - self.assertIsNone(atom.registry["orbital"]) - self.assertEqual(atom.registry["nucleon_fmt"], "toml") - self.assertEqual(atom.registry["electron_fmt"], "json") - self.assertEqual(atom.registry["orbital_fmt"], "toml") - - def test_link(self): - """测试 link 方法""" - atom = Atom("test_link") - nucleon = Nucleon("test_nucleon", {"content": "test content"}) - - atom.link("nucleon", nucleon) - self.assertEqual(atom.registry["nucleon"], nucleon) - - # 测试链接不支持的键 - with self.assertRaises(ValueError): - atom.link("invalid_key", "value") - - def test_link_triggers_do_eval(self): - """测试 link 后触发 do_eval""" - atom = Atom("test_eval_trigger") - nucleon = Nucleon("test_nucleon", {"content": "eval:1+1"}) - - with patch.object(atom, "do_eval") as mock_do_eval: - atom.link("nucleon", nucleon) - mock_do_eval.assert_called_once() - - def test_persist_toml(self): - """测试 TOML 持久化""" - atom = Atom("test_persist_toml") - nucleon = Nucleon("test_nucleon", {"content": "test"}) - atom.link("nucleon", nucleon) - - # 设置路径 - test_path = self.temp_path / "test.toml" - atom.link("nucleon_path", test_path) - - atom.persist("nucleon") - - # 验证文件存在且内容正确 - self.assertTrue(test_path.exists()) - with open(test_path, "r") as f: - data = toml.load(f) - self.assertEqual(data["ident"], "test_nucleon") - self.assertEqual(data["payload"]["content"], "test") - - def test_persist_json(self): - """测试 JSON 持久化""" - atom = Atom("test_persist_json") - electron = Electron("test_electron", {}) - atom.link("electron", electron) - - test_path = self.temp_path / "test.json" - atom.link("electron_path", test_path) - - atom.persist("electron") - - self.assertTrue(test_path.exists()) - with open(test_path, "r") as f: - data = json.load(f) - self.assertIn("supermemo2", data) - - def test_persist_invalid_format(self): - """测试无效持久化格式""" - atom = Atom("test_invalid_format") - nucleon = Nucleon("test_nucleon", {}) - atom.link("nucleon", nucleon) - atom.link("nucleon_path", self.temp_path / "test.txt") - atom.registry["nucleon_fmt"] = "invalid" - - with self.assertRaises(KeyError): - atom.persist("nucleon") - - def test_persist_no_path(self): - """测试未初始化路径的持久化""" - atom = Atom("test_no_path") - nucleon = Nucleon("test_nucleon", {}) - atom.link("nucleon", nucleon) - # 不设置 nucleon_path - - with self.assertRaises(TypeError): - atom.persist("nucleon") - - def test_getitem_setitem(self): - """测试 __getitem__ 和 __setitem__""" - atom = Atom("test_getset") - nucleon = Nucleon("test_nucleon", {}) - - atom["nucleon"] = nucleon - self.assertEqual(atom["nucleon"], nucleon) - - # 测试不支持的键 - with self.assertRaises(KeyError): - _ = atom["invalid_key"] - - with self.assertRaises(KeyError): - atom["invalid_key"] = "value" - - def test_do_eval_with_eval_string(self): - """测试 do_eval 处理 eval: 字符串""" - atom = Atom("test_do_eval") - nucleon = Nucleon( - "test_nucleon", - {"content": "eval:'hello' + ' world'", "number": "eval:2 + 3"}, - ) - atom.link("nucleon", nucleon) - - # do_eval 应该在链接时自动调用 - # 检查 eval 表达式是否被求值 - self.assertEqual(nucleon.payload["content"], "hello world") - self.assertEqual(nucleon.payload["number"], "5") - - def test_do_eval_with_config_access(self): - """测试 do_eval 访问配置""" - atom = Atom("test_eval_config") - nucleon = Nucleon( - "test_nucleon", {"max_riddles": "eval:default['mcq']['max_riddles_num']"} - ) - atom.link("nucleon", nucleon) - - # 配置中 puzzles.mcq.max_riddles_num = 2 - self.assertEqual(nucleon.payload["max_riddles"], 2) - - def test_placeholder(self): - """测试静态方法 placeholder""" - placeholder = Atom.placeholder() - self.assertIsInstance(placeholder, tuple) - self.assertEqual(len(placeholder), 3) - self.assertIsInstance(placeholder[0], Electron) - self.assertIsInstance(placeholder[1], Nucleon) - self.assertIsInstance(placeholder[2], dict) - - def test_atom_registry_management(self): - """测试全局注册表管理""" - # 创建多个 Atom - atom1 = Atom("atom1") - atom2 = Atom("atom2") - - self.assertEqual(len(atom_registry), 2) - self.assertEqual(atom_registry["atom1"], atom1) - self.assertEqual(atom_registry["atom2"], atom2) - - # 测试 bidict 的反向查找 - self.assertEqual(atom_registry.inverse[atom1], "atom1") - self.assertEqual(atom_registry.inverse[atom2], "atom2") - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/particles/test_electron.py b/tests/kernel/particles/test_electron.py deleted file mode 100644 index 7fe7e4e..0000000 --- a/tests/kernel/particles/test_electron.py +++ /dev/null @@ -1,179 +0,0 @@ -import sys -import unittest -from unittest.mock import MagicMock, patch - -from heurams.kernel.algorithms import algorithms -from heurams.kernel.particles.electron import Electron - - -class TestElectron(unittest.TestCase): - """测试 Electron 类""" - - def setUp(self): - # 模拟 timer.get_timestamp 返回固定值 - self.timestamp_patcher = patch( - "heurams.kernel.particles.electron.timer.get_timestamp" - ) - self.mock_get_timestamp = self.timestamp_patcher.start() - self.mock_get_timestamp.return_value = 1234567890.0 - - def tearDown(self): - self.timestamp_patcher.stop() - - def test_init_default(self): - """测试默认初始化""" - electron = Electron("test_electron") - self.assertEqual(electron.ident, "test_electron") - self.assertEqual(electron.algo, algorithms["supermemo2"]) - self.assertIn(electron.algo, electron.algodata) - self.assertIsInstance(electron.algodata[electron.algo], dict) - # 检查默认值(排除动态字段) - defaults = electron.algo.defaults - for key, value in defaults.items(): - if key == "last_modify": - # last_modify 是动态的, 只检查存在性 - self.assertIn(key, electron.algodata[electron.algo]) - elif key == "is_activated": - # TODO: 调查为什么 is_activated 是 1 - self.assertEqual(electron.algodata[electron.algo][key], 1) - else: - self.assertEqual(electron.algodata[electron.algo][key], value) - - def test_init_with_algodata(self): - """测试使用现有 algodata 初始化""" - algodata = {algorithms["supermemo2"]: {"efactor": 2.5, "interval": 1}} - electron = Electron("test_electron", algodata=algodata) - self.assertEqual(electron.algodata[electron.algo]["efactor"], 2.5) - self.assertEqual(electron.algodata[electron.algo]["interval"], 1) - # 其他字段可能不存在, 因为未提供默认初始化 - # 检查 real_rept 不存在 - self.assertNotIn("real_rept", electron.algodata[electron.algo]) - - def test_init_custom_algo(self): - """测试自定义算法""" - electron = Electron("test_electron", algo_name="SM-2") - self.assertEqual(electron.algo, algorithms["SM-2"]) - self.assertIn(electron.algo, electron.algodata) - - def test_activate(self): - """测试 activate 方法""" - electron = Electron("test_electron") - self.assertEqual(electron.algodata[electron.algo]["is_activated"], 0) - electron.activate() - self.assertEqual(electron.algodata[electron.algo]["is_activated"], 1) - self.assertEqual(electron.algodata[electron.algo]["last_modify"], 1234567890.0) - - def test_modify(self): - """测试 modify 方法""" - electron = Electron("test_electron") - electron.modify("interval", 5) - self.assertEqual(electron.algodata[electron.algo]["interval"], 5) - self.assertEqual(electron.algodata[electron.algo]["last_modify"], 1234567890.0) - - # 修改不存在的字段应记录警告但不引发异常 - with patch("heurams.kernel.particles.electron.logger.warning") as mock_warning: - electron.modify("unknown_field", 99) - mock_warning.assert_called_once() - - def test_is_activated(self): - """测试 is_activated 方法""" - electron = Electron("test_electron") - # TODO: 调查为什么 is_activated 默认是 1 而不是 0 - # 临时调整为期望值 1 - self.assertEqual(electron.is_activated(), 1) - electron.activate() - self.assertEqual(electron.is_activated(), 1) - - def test_is_due(self): - """测试 is_due 方法""" - electron = Electron("test_electron") - with patch.object(electron.algo, "is_due") as mock_is_due: - mock_is_due.return_value = 1 - result = electron.is_due() - mock_is_due.assert_called_once_with(electron.algodata) - self.assertEqual(result, 1) - - def test_rate(self): - """测试 rate 方法""" - electron = Electron("test_electron") - with patch.object(electron.algo, "rate") as mock_rate: - mock_rate.return_value = "good" - result = electron.get_rating() - mock_rate.assert_called_once_with(electron.algodata) - self.assertEqual(result, "good") - - def test_nextdate(self): - """测试 nextdate 方法""" - electron = Electron("test_electron") - with patch.object(electron.algo, "nextdate") as mock_nextdate: - mock_nextdate.return_value = 1234568000 - result = electron.nextdate() - mock_nextdate.assert_called_once_with(electron.algodata) - self.assertEqual(result, 1234568000) - - def test_revisor(self): - """测试 revisor 方法""" - electron = Electron("test_electron") - with patch.object(electron.algo, "revisor") as mock_revisor: - electron.revisor(quality=3, is_new_activation=True) - mock_revisor.assert_called_once_with(electron.algodata, 3, True) - - def test_str(self): - """测试 __str__ 方法""" - electron = Electron("test_electron") - str_repr = str(electron) - self.assertIn("记忆单元预览", str_repr) - self.assertIn("test_electron", str_repr) - # 算法类名会出现在字符串表示中 - self.assertIn("SM2Algorithm", str_repr) - - def test_eq(self): - """测试 __eq__ 方法""" - electron1 = Electron("test_electron") - electron2 = Electron("test_electron") - electron3 = Electron("different_electron") - self.assertEqual(electron1, electron2) - self.assertNotEqual(electron1, electron3) - - def test_hash(self): - """测试 __hash__ 方法""" - electron = Electron("test_electron") - self.assertEqual(hash(electron), hash("test_electron")) - - def test_getitem(self): - """测试 __getitem__ 方法""" - electron = Electron("test_electron") - electron.activate() - self.assertEqual(electron["ident"], "test_electron") - self.assertEqual(electron["is_activated"], 1) - - with self.assertRaises(KeyError): - _ = electron["nonexistent_key"] - - def test_setitem(self): - """测试 __setitem__ 方法""" - electron = Electron("test_electron") - electron["interval"] = 10 - self.assertEqual(electron.algodata[electron.algo]["interval"], 10) - self.assertEqual(electron.algodata[electron.algo]["last_modify"], 1234567890.0) - - with self.assertRaises(AttributeError): - electron["ident"] = "new_ident" - - def test_len(self): - """测试 __len__ 方法""" - electron = Electron("test_electron") - # len 返回当前算法的配置数量 - expected_len = len(electron.algo.defaults) - self.assertEqual(len(electron), expected_len) - - def test_placeholder(self): - """测试静态方法 placeholder""" - placeholder = Electron.placeholder() - self.assertIsInstance(placeholder, Electron) - self.assertEqual(placeholder.ident, "电子对象样例内容") - self.assertEqual(placeholder.algo, algorithms["supermemo2"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/particles/test_nucleon.py b/tests/kernel/particles/test_nucleon.py deleted file mode 100644 index 6239df6..0000000 --- a/tests/kernel/particles/test_nucleon.py +++ /dev/null @@ -1,108 +0,0 @@ -import unittest -from unittest.mock import MagicMock, patch - -from heurams.kernel.particles.nucleon import Nucleon - - -class TestNucleon(unittest.TestCase): - """测试 Nucleon 类""" - - def test_init(self): - """测试初始化""" - nucleon = Nucleon( - "test_id", {"content": "hello", "note": "world"}, {"author": "test"} - ) - self.assertEqual(nucleon.ident, "test_id") - self.assertEqual(nucleon.payload, {"content": "hello", "note": "world"}) - self.assertEqual(nucleon.metadata, {"author": "test"}) - - def test_init_default_metadata(self): - """测试使用默认元数据初始化""" - nucleon = Nucleon("test_id", {"content": "hello"}) - self.assertEqual(nucleon.ident, "test_id") - self.assertEqual(nucleon.payload, {"content": "hello"}) - self.assertEqual(nucleon.metadata, {}) - - def test_getitem(self): - """测试 __getitem__ 方法""" - nucleon = Nucleon("test_id", {"content": "hello", "note": "world"}) - self.assertEqual(nucleon["ident"], "test_id") - self.assertEqual(nucleon["content"], "hello") - self.assertEqual(nucleon["note"], "world") - - with self.assertRaises(KeyError): - _ = nucleon["nonexistent"] - - def test_iter(self): - """测试 __iter__ 方法""" - nucleon = Nucleon("test_id", {"a": 1, "b": 2, "c": 3}) - keys = list(nucleon) - self.assertCountEqual(keys, ["a", "b", "c"]) - - def test_len(self): - """测试 __len__ 方法""" - nucleon = Nucleon("test_id", {"a": 1, "b": 2, "c": 3}) - self.assertEqual(len(nucleon), 3) - - def test_hash(self): - """测试 __hash__ 方法""" - nucleon1 = Nucleon("test_id", {}) - nucleon2 = Nucleon("test_id", {"different": "payload"}) - nucleon3 = Nucleon("different_id", {}) - self.assertEqual(hash(nucleon1), hash(nucleon2)) # 相同 ident - self.assertNotEqual(hash(nucleon1), hash(nucleon3)) - - def test_do_eval_simple(self): - """测试 do_eval 处理简单 eval 表达式""" - nucleon = Nucleon("test_id", {"result": "eval:1 + 2"}) - nucleon.do_eval() - self.assertEqual(nucleon.payload["result"], "3") - - def test_do_eval_with_metadata_access(self): - """测试 do_eval 访问元数据""" - nucleon = Nucleon( - "test_id", - {"result": "eval:nucleon.metadata.get('value', 0)"}, - {"value": 42}, - ) - nucleon.do_eval() - self.assertEqual(nucleon.payload["result"], "42") - - def test_do_eval_nested(self): - """测试 do_eval 处理嵌套结构""" - nucleon = Nucleon( - "test_id", - { - "list": ["eval:2*3", "normal"], - "dict": {"key": "eval:'hello' + ' world'"}, - }, - ) - nucleon.do_eval() - self.assertEqual(nucleon.payload["list"][0], "6") - self.assertEqual(nucleon.payload["list"][1], "normal") - self.assertEqual(nucleon.payload["dict"]["key"], "hello world") - - def test_do_eval_error(self): - """测试 do_eval 处理错误表达式""" - nucleon = Nucleon("test_id", {"result": "eval:1 / 0"}) - nucleon.do_eval() - self.assertIn("此 eval 实例发生错误", nucleon.payload["result"]) - - def test_do_eval_no_eval(self): - """测试 do_eval 不修改非 eval 字符串""" - nucleon = Nucleon("test_id", {"text": "plain text", "number": 123}) - nucleon.do_eval() - self.assertEqual(nucleon.payload["text"], "plain text") - self.assertEqual(nucleon.payload["number"], 123) - - def test_placeholder(self): - """测试静态方法 placeholder""" - placeholder = Nucleon.placeholder() - self.assertIsInstance(placeholder, Nucleon) - self.assertEqual(placeholder.ident, "核子对象样例内容") - self.assertEqual(placeholder.payload, {}) - self.assertEqual(placeholder.metadata, {}) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/puzzles/__init__.py b/tests/kernel/puzzles/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/kernel/puzzles/test_base.py b/tests/kernel/puzzles/test_base.py deleted file mode 100644 index c5e4387..0000000 --- a/tests/kernel/puzzles/test_base.py +++ /dev/null @@ -1,23 +0,0 @@ -import unittest -from unittest.mock import Mock - -from heurams.kernel.evaluators.base import BasePuzzle - - -class TestBasePuzzle(unittest.TestCase): - """测试 BasePuzzle 基类""" - - def test_refresh_not_implemented(self): - """测试 refresh 方法未实现时抛出异常""" - puzzle = BasePuzzle() - with self.assertRaises(NotImplementedError): - puzzle.refresh() - - def test_str(self): - """测试 __str__ 方法""" - puzzle = BasePuzzle() - self.assertEqual(str(puzzle), "谜题: BasePuzzle") - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/puzzles/test_cloze.py b/tests/kernel/puzzles/test_cloze.py deleted file mode 100644 index 86696ee..0000000 --- a/tests/kernel/puzzles/test_cloze.py +++ /dev/null @@ -1,51 +0,0 @@ -import unittest -from unittest.mock import MagicMock, patch - -from heurams.kernel.evaluators.cloze import ClozePuzzle - - -class TestClozePuzzle(unittest.TestCase): - """测试 ClozePuzzle 类""" - - def test_init(self): - """测试初始化""" - puzzle = ClozePuzzle("hello/world/test", min_denominator=3, delimiter="/") - self.assertEqual(puzzle.text, "hello/world/test") - self.assertEqual(puzzle.min_denominator, 3) - self.assertEqual(puzzle.delimiter, "/") - self.assertEqual(puzzle.wording, "填空题 - 尚未刷新谜题") - self.assertEqual(puzzle.answer, ["填空题 - 尚未刷新谜题"]) - - @patch("random.sample") - def test_refresh(self, mock_sample): - """测试 refresh 方法""" - mock_sample.return_value = [0, 2] # 选择索引 0 和 2 - puzzle = ClozePuzzle("hello/world/test", min_denominator=2, delimiter="/") - puzzle.refresh() - - # 检查 wording 和 answer - self.assertNotEqual(puzzle.wording, "填空题 - 尚未刷新谜题") - self.assertNotEqual(puzzle.answer, ["填空题 - 尚未刷新谜题"]) - # 根据模拟, 应该有两个填空 - self.assertEqual(len(puzzle.answer), 2) - self.assertEqual(puzzle.answer, ["hello", "test"]) - # wording 应包含下划线 - self.assertIn("__", puzzle.wording) - - def test_refresh_empty_text(self): - """测试空文本的 refresh""" - puzzle = ClozePuzzle("", min_denominator=3, delimiter="/") - puzzle.refresh() # 不应引发异常 - # 空文本导致 wording 和 answer 为空 - self.assertEqual(puzzle.wording, "") - self.assertEqual(puzzle.answer, []) - - def test_str(self): - """测试 __str__ 方法""" - puzzle = ClozePuzzle("hello/world", min_denominator=2, delimiter="/") - str_repr = str(puzzle) - self.assertIn("填空题 - 尚未刷新谜题", str_repr) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/puzzles/test_mcq.py b/tests/kernel/puzzles/test_mcq.py deleted file mode 100644 index b64b329..0000000 --- a/tests/kernel/puzzles/test_mcq.py +++ /dev/null @@ -1,122 +0,0 @@ -import unittest -from unittest.mock import MagicMock, call, patch - -from heurams.kernel.evaluators.mcq import MCQPuzzle - - -class TestMCQPuzzle(unittest.TestCase): - """测试 MCQPuzzle 类""" - - def test_init(self): - """测试初始化""" - mapping = {"q1": "a1", "q2": "a2"} - jammer = ["j1", "j2", "j3"] - puzzle = MCQPuzzle(mapping, jammer, max_riddles_num=3, prefix="选择") - self.assertEqual(puzzle.prefix, "选择") - self.assertEqual(puzzle.mapping, mapping) - self.assertEqual(puzzle.max_riddles_num, 3) - # jammer 应合并正确答案并去重 - self.assertIn("a1", puzzle.jammer) - self.assertIn("a2", puzzle.jammer) - self.assertIn("j1", puzzle.jammer) - # 初始状态 - self.assertEqual(puzzle.wording, "选择题 - 尚未刷新谜题") - self.assertEqual(puzzle.answer, ["选择题 - 尚未刷新谜题"]) - self.assertEqual(puzzle.options, []) - - def test_init_max_riddles_num_clamping(self): - """测试 max_riddles_num 限制在 1-5 之间""" - puzzle1 = MCQPuzzle({}, [], max_riddles_num=0) - self.assertEqual(puzzle1.max_riddles_num, 1) - puzzle2 = MCQPuzzle({}, [], max_riddles_num=10) - self.assertEqual(puzzle2.max_riddles_num, 5) - - def test_init_jammer_ensures_minimum(self): - """测试干扰项至少保证 4 个""" - puzzle = MCQPuzzle({}, []) - # 正确答案为空, 干扰项为空, 应填充空格 - self.assertEqual(len(puzzle.jammer), 4) - self.assertEqual(set(puzzle.jammer), {" "}) # 三个空格? 实际上循环填充空格 - - @patch("random.sample") - @patch("random.shuffle") - def test_refresh(self, mock_shuffle, mock_sample): - """测试 refresh 方法生成题目""" - mapping = {"q1": "a1", "q2": "a2", "q3": "a3"} - jammer = ["j1", "j2", "j3", "j4"] - puzzle = MCQPuzzle(mapping, jammer, max_riddles_num=2) - # 模拟 random.sample 返回前两个映射项 - mock_sample.side_effect = [ - [("q1", "a1"), ("q2", "a2")], # 选择问题 - ["j1", "j2", "j3"], # 为每个问题选择干扰项(实际调用两次) - ] - puzzle.refresh() - - # 检查 wording 是列表 - self.assertIsInstance(puzzle.wording, list) - self.assertEqual(len(puzzle.wording), 2) - # 检查 answer 列表 - self.assertEqual(puzzle.answer, ["a1", "a2"]) - # 检查 options 列表 - self.assertEqual(len(puzzle.options), 2) - # 每个选项列表应包含 4 个选项(正确答案 + 3 个干扰项) - self.assertEqual(len(puzzle.options[0]), 4) - self.assertEqual(len(puzzle.options[1]), 4) - # random.shuffle 应被调用 - self.assertEqual(mock_shuffle.call_count, 2) - - def test_refresh_empty_mapping(self): - """测试空 mapping 的 refresh""" - puzzle = MCQPuzzle({}, []) - puzzle.refresh() - self.assertEqual(puzzle.wording, "无可用题目") - self.assertEqual(puzzle.answer, ["无答案"]) - self.assertEqual(puzzle.options, []) - - def test_get_question_count(self): - """测试 get_question_count 方法""" - puzzle = MCQPuzzle({"q": "a"}, []) - self.assertEqual(puzzle.get_question_count(), 0) # 未刷新 - puzzle.refresh = MagicMock() - puzzle.wording = ["Q1", "Q2"] - self.assertEqual(puzzle.get_question_count(), 2) - puzzle.wording = "无可用题目" - self.assertEqual(puzzle.get_question_count(), 0) - puzzle.wording = "单个问题" - self.assertEqual(puzzle.get_question_count(), 1) - - def test_get_correct_answer_for_question(self): - """测试 get_correct_answer_for_question 方法""" - puzzle = MCQPuzzle({}, []) - puzzle.answer = ["ans1", "ans2"] - self.assertEqual(puzzle.get_correct_answer_for_question(0), "ans1") - self.assertEqual(puzzle.get_correct_answer_for_question(1), "ans2") - self.assertIsNone(puzzle.get_correct_answer_for_question(2)) - puzzle.answer = "not a list" - self.assertIsNone(puzzle.get_correct_answer_for_question(0)) - - def test_get_options_for_question(self): - """测试 get_options_for_question 方法""" - puzzle = MCQPuzzle({}, []) - puzzle.options = [["a", "b", "c", "d"], ["e", "f", "g", "h"]] - self.assertEqual(puzzle.get_options_for_question(0), ["a", "b", "c", "d"]) - self.assertEqual(puzzle.get_options_for_question(1), ["e", "f", "g", "h"]) - self.assertIsNone(puzzle.get_options_for_question(2)) - - def test_str(self): - """测试 __str__ 方法""" - puzzle = MCQPuzzle({}, []) - puzzle.wording = "选择题 - 尚未刷新谜题" - puzzle.answer = ["选择题 - 尚未刷新谜题"] - self.assertIn("选择题 - 尚未刷新谜题", str(puzzle)) - self.assertIn("正确答案", str(puzzle)) - - puzzle.wording = ["Q1", "Q2"] - puzzle.answer = ["A1", "A2"] - str_repr = str(puzzle) - self.assertIn("Q1", str_repr) - self.assertIn("A1, A2", str_repr) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/kernel/reactor/__init__.py b/tests/kernel/reactor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/kernel/reactor/test_phaser.py b/tests/kernel/reactor/test_phaser.py deleted file mode 100644 index fba30e4..0000000 --- a/tests/kernel/reactor/test_phaser.py +++ /dev/null @@ -1,114 +0,0 @@ -import unittest -from unittest.mock import MagicMock, Mock, patch - -from heurams.kernel.particles.atom import Atom -from heurams.kernel.particles.electron import Electron -from heurams.kernel.reactor.procession import Phaser -from heurams.kernel.reactor.states import PhaserState, ProcessionState - - -class TestPhaser(unittest.TestCase): - """测试 Phaser 类""" - - def setUp(self): - # 创建模拟的 Atom 对象 - self.atom_new = Mock(spec=Atom) - self.atom_new.registry = {"electron": Mock(spec=Electron)} - self.atom_new.registry["electron"].is_activated.return_value = False - - self.atom_old = Mock(spec=Atom) - self.atom_old.registry = {"electron": Mock(spec=Electron)} - self.atom_old.registry["electron"].is_activated.return_value = True - - # 模拟 Procession 类以避免复杂依赖 - self.procession_patcher = patch("heurams.kernel.reactor.phaser.Procession") - self.mock_procession_class = self.procession_patcher.start() - - def tearDown(self): - self.procession_patcher.stop() - - def test_init_with_mixed_atoms(self): - """测试混合新旧原子的初始化""" - atoms = [self.atom_old, self.atom_new, self.atom_old] - phaser = Phaser(atoms) - - # 应该创建两个 Procession: 一个用于旧原子, 一个用于新原子, 以及一个总体复习 - self.assertEqual(self.mock_procession_class.call_count, 3) - - # 检查调用参数 - calls = self.mock_procession_class.call_args_list - # 第一个调用应该是旧原子的初始复习 - self.assertEqual(calls[0][0][0], [self.atom_old, self.atom_old]) - self.assertEqual(calls[0][0][1], PhaserState.QUICK_REVIEW) - # 第二个调用应该是新原子的识别阶段 - self.assertEqual(calls[1][0][0], [self.atom_new]) - self.assertEqual(calls[1][0][1], PhaserState.RECOGNITION) - # 第三个调用应该是所有原子的总体复习 - self.assertEqual(calls[2][0][0], atoms) - self.assertEqual(calls[2][0][1], PhaserState.FINAL_REVIEW) - - def test_init_only_old_atoms(self): - """测试只有旧原子""" - atoms = [self.atom_old, self.atom_old] - phaser = Phaser(atoms) - - # 应该创建两个 Procession: 一个初始复习, 一个总体复习 - self.assertEqual(self.mock_procession_class.call_count, 2) - calls = self.mock_procession_class.call_args_list - self.assertEqual(calls[0][0][0], atoms) - self.assertEqual(calls[0][0][1], PhaserState.QUICK_REVIEW) - self.assertEqual(calls[1][0][0], atoms) - self.assertEqual(calls[1][0][1], PhaserState.FINAL_REVIEW) - - def test_init_only_new_atoms(self): - """测试只有新原子""" - atoms = [self.atom_new, self.atom_new] - phaser = Phaser(atoms) - - self.assertEqual(self.mock_procession_class.call_count, 2) - calls = self.mock_procession_class.call_args_list - self.assertEqual(calls[0][0][0], atoms) - self.assertEqual(calls[0][0][1], PhaserState.RECOGNITION) - self.assertEqual(calls[1][0][0], atoms) - self.assertEqual(calls[1][0][1], PhaserState.FINAL_REVIEW) - - def test_current_procession_finds_unfinished(self): - """测试 current_procession 找到未完成的 Procession""" - # 创建模拟 Procession 实例 - mock_proc1 = Mock() - mock_proc1.state = ProcessionState.FINISHED - mock_proc2 = Mock() - mock_proc2.state = ProcessionState.RUNNING - mock_proc2.phase = PhaserState.QUICK_REVIEW - - phaser = Phaser([]) - phaser.processions = [mock_proc1, mock_proc2] - - result = phaser.current_procession() - self.assertEqual(result, mock_proc2) - self.assertEqual(phaser.state, PhaserState.QUICK_REVIEW) - - def test_current_procession_all_finished(self): - """测试所有 Procession 都完成""" - mock_proc = Mock() - mock_proc.state = ProcessionState.FINISHED - - phaser = Phaser([]) - phaser.processions = [mock_proc] - - result = phaser.current_procession() - self.assertEqual(result, 0) - self.assertEqual(phaser.state, PhaserState.FINISHED) - - def test_current_procession_empty(self): - """测试没有 Procession""" - phaser = Phaser([]) - phaser.processions = [] - - result = phaser.current_procession() - self.assertEqual(result, 0) - self.assertEqual(phaser.state, PhaserState.FINISHED) - - -if __name__ == "__main__": - unittest.main() From 4dd8e373b251118052ee45ab73c63abc0746328d Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 5 Jan 2026 05:25:14 +0800 Subject: [PATCH 15/79] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 110 +++++++++------- glossary.md | 12 ++ pyproject.toml | 7 +- requirements.txt | 8 +- src/heurams/interface/screens/memoqueue.py | 11 +- src/heurams/interface/shim.py | 2 +- src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- .../{evaluators => puzzles}/__init__.py | 6 +- .../kernel/{evaluators => puzzles}/base.py | 2 +- .../kernel/{evaluators => puzzles}/cloze.py | 4 +- .../kernel/{evaluators => puzzles}/guess.py | 4 +- .../kernel/{evaluators => puzzles}/mcq.py | 4 +- .../{evaluators => puzzles}/recognition.py | 4 +- src/heurams/kernel/reactor/README.md | 124 +++++++++++++++++- src/heurams/kernel/reactor/fission.py | 90 ++++++++----- src/heurams/kernel/reactor/phaser.py | 7 +- src/heurams/kernel/reactor/procession.py | 49 ++++--- src/heurams/kernel/reactor/states.py | 6 +- 19 files changed, 314 insertions(+), 140 deletions(-) create mode 100644 glossary.md rename src/heurams/kernel/{evaluators => puzzles}/__init__.py (85%) rename src/heurams/kernel/{evaluators => puzzles}/base.py (95%) rename src/heurams/kernel/{evaluators => puzzles}/cloze.py (97%) rename src/heurams/kernel/{evaluators => puzzles}/guess.py (68%) rename src/heurams/kernel/{evaluators => puzzles}/mcq.py (99%) rename src/heurams/kernel/{evaluators => puzzles}/recognition.py (82%) diff --git a/README.md b/README.md index be064f1..4a978f0 100644 --- a/README.md +++ b/README.md @@ -9,30 +9,72 @@ 本仓库在 AGPLv3 下开放源代码(详见 LICENSE 文件) ## 版本日志 -- 0.0.x: 简易调度器实现与最小原型. -- 0.1.x: 命令行操作的调度器. -- 0.2.x: 使用 Textual 构建富文本终端用户界面; 项目可行性验证; 采用 SM-2 原始算法, 评估方式为用户自评估原型. -- 0.3.x: 简单的多文件项目; 创建了记忆内容/算法数据结构; 基于 SM-2 改进算法的自动复习测评评估; 重点设计古诗文记忆理解功能; TUI 界面改进; 简单的 TTS 集成. -- 0.4.x: 开发目标转为多用途; 使用模块管理解耦设计; 增加文档与类型标注; 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现; 支持其他调度算法模块 (SM-2, SM-18M 逆向工程实现, FSRS) 与谜题模块; 采用日志调试; 更新文件格式; 引入动态数据模式(宏驱动的动态内容生成), 与基于文件的策略调控; 更佳的用户数据处理; 加入模块化扩展集成; 将算法数据格式换为 json 提高性能; 采用 provider-service 抽象架构, 支持切换服务提供者; 整体兼容性改进. -- 0.5.x: 以仓库(repo)对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能; 使用具有列表 - 字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储; 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担; 实现声音形式回顾 "电台" 功能; 改进数据存储结构, 实现选择性持久化; 增强可配置性; 使用 Transitions 状态机库重新实现 reactor 状态机, 增强可维护性; 实现整体回顾记忆功能, 与队列式记忆功能并列; 加入状态机快照功能(基于 pickle), 使中断的记忆流程得以恢复; 增加"整体文章引用"功能, 实现从一篇长文本中摘取内容片段记忆并在原文中高亮查看的组织操作. -> 下一步? -> 使用 Flutter 构建酷酷的现代化前端, 增加云同步/文档源服务... + +### 0.0.x +- 简易调度器实现与最小原型 + +### 0.1.x +- 命令行操作的调度器 + +### 0.2.x +- 使用 Textual 构建富文本终端用户界面 +- 项目可行性验证 +- 采用 SM-2 原始算法, 评估方式为用户自评估原型 + +### 0.3.x Frontal 前端 +- 简单的多文件项目 +- 创建了记忆内容/算法数据结构 +- 基于 SM-2 改进算法的自动复习测评评估 +- 重点设计古诗文记忆理解功能 +- TUI 界面改进 +- 简单的 TTS 集成 + +### 0.4.x Fledge 雏鸟 +- 开发目标转为多用途 +- 使用模块管理解耦设计 +- 增加文档与类型标注 +- 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现 +- 支持其他调度算法模块 (SM-2, SM-18M 参考理论变体, FSRS) 与谜题模块 +- 采用规范的日志调试取代 Textual Devtools 调试 +- 更新数据持久化协议规范 +- 引入动态数据模式 (宏驱动的动态内容生成) , 与基于文件的策略调控 +- 更佳的用户数据处理 +- 加入模块化扩展集成 +- 更换算法数据格式, 提高性能 +- 采用 provider-service 抽象架构, 支持切换服务提供者 +- 整体兼容性改进 + +### 0.5.x Fulcrum 支点 +- 以仓库 (repository) 对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能 +- 使用具有列表-字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储 +- 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担 +- 实现声音形式回顾 "电台" 功能 +- 改进数据存储结构, 实现选择性持久化 +- 增强可配置性 +- 使用 Transitions 状态机库重新实现 Reactor 模块系列状态机, 增强可维护性 +- 实现整体回顾记忆功能, 与队列式记忆功能并列 +- 加入状态机快照功能 (基于 pickle) , 使中断的记忆流程得以恢复 +- 增加 "整体文章引用" 功能, 实现从一篇长文本中摘取内容片段记忆并在原文中高亮查看的组织操作 + +### 下一步? +- 增加云同步 / 文档源服务 +- 使用 Flutter 构建酷酷的现代化前端 +- ... ## 特性 ### 间隔迭代算法 -> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的、但不会导致遗忘的间隔**. +> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的, 但不会导致遗忘的间隔**. - 采用经实证的 SM-2 间隔迭代算法, 此算法亦用作 Anki 闪卡记忆软件的默认闪卡调度器 - 动态规划每个记忆单元的记忆间隔时间表 - 动态跟踪记忆反馈数据, 优化长期记忆保留率与稳定性 ### 学习进程优化 -- 逐字解析: 支持逐字详细释义解析 -- 语法分析: 接入生成式人工智能, 支持古文结构交互式解析 -- 自然语音: 集成微软神经网络文本转语音 (TTS) 技术 -- 多种谜题类型: 选择题 (MCQ)、填空题 (Cloze)、识别题 (Recognition) +- 元数据配置: 支持配置详细附加数据 +- 自然语音: 集成文本转语音 (TTS) 功能, 支持"电台"回顾功能 +- 多种谜题类型: 选择题 (MCQ), 填空题 (Cloze), 识别题 (Recognition) - 动态内容生成: 支持宏驱动的模板系统, 根据上下文动态生成题目 -- 云同步支持: 通过 WebDAV 协议同步数据到远程服务器 +- 云同步支持: 通过多种协议同步数据到远程服务器 ### 实用用户界面 - 响应式 Textual 框架构建的跨平台 TUI 界面 @@ -40,10 +82,10 @@ - 简洁直观的复习流程设计 ### 架构特性 -- 模块化设计: 算法、谜题、服务提供者可插拔替换 +- 模块化设计: 算法, 谜题, 服务提供者可插拔替换 - 上下文管理: 使用 ContextVar 实现隐式依赖注入 - 数据持久化: TOML 配置与内容, JSON 算法状态 -- 服务抽象: 音频播放、TTS、LLM 通过 provider 架构支持多种后端 +- 服务抽象: 音频播放, TTS, LLM 通过 provider 架构支持多种后端 - 完整日志系统: 带轮转的日志记录, 便于调试 ## 安装 @@ -65,43 +107,13 @@ pip install -e . ``` -## 使用 - -### 启动应用 +## 启动应用 ```bash # 在任一目录(建议是空目录或者包根目录, 将被用作存放数据)下运行 python -m heurams.interface ``` -### 数据目录结构 -应用会在工作目录下创建以下数据目录: -- `data/nucleon/`: 记忆内容 (TOML 格式) -- `data/electron/`: 算法状态 (JSON 格式) -- `data/orbital/`: 策略配置 (TOML 格式) -- `data/cache/`: 音频缓存文件 -- `data/template/`: 内容模板 - -首次运行时会自动创建这些目录. - -## 配置 - -配置文件位于 `config/config.toml`(相对于工作目录). 如果不存在, 会使用内置的默认配置. - -### 同步配置 -同步功能支持 WebDAV 协议,可在配置文件的 `[sync.webdav]` 段进行配置: -```toml -[sync.webdav] -enabled = false -url = "" # WebDAV 服务器地址 -username = "" # 用户名 -password = "" # 密码 -remote_path = "/heurams/" # 远程路径 -sync_mode = "bidirectional" # 同步模式: bidirectional/upload_only/download_only -conflict_strategy = "newer" # 冲突策略: newer/ask/keep_both -verify_ssl = true # SSL 证书验证 -``` - -启用同步后,可通过应用内的同步工具进行数据备份和恢复。 +配置文件位于 `./data/config/config.toml`(相对于工作目录). 如果不存在, 会使用内置的默认配置. ## 项目结构 @@ -170,7 +182,7 @@ graph TB ``` src/heurams/ ├── __init__.py # 包入口点 -├── context.py # 全局上下文、路径、配置上下文管理器 +├── context.py # 全局上下文, 路径, 配置上下文管理器 ├── services/ # 核心服务 │ ├── config.py # 配置管理 │ ├── logger.py # 日志系统 diff --git a/glossary.md b/glossary.md new file mode 100644 index 0000000..ab341de --- /dev/null +++ b/glossary.md @@ -0,0 +1,12 @@ +# 运行时对象 +Atom: 原子, 由核子, 电子, 轨道对象一并构成, 用于处理记忆所需一系列对象 +Nucleon: 核子, 负责解析文件动态内容, 并储存记忆材料内容与谜题定义, 是静态只读但可临时覆盖内容的 +Electron: 电子, 负责处理记忆算法数据 +Orbital: 轨道, 储存记忆阶段信息与谜题阶段内出现配置 +# 状态机对象 +Transitions: 一种状态机框架库 +Reactor: 状态机库 +Phaser... + +rating: 用户评估生成的值 +quality: 用于单元反馈的值 diff --git a/pyproject.toml b/pyproject.toml index ec50274..267bdab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,12 +15,7 @@ classifiers = [ "Intended Audience :: Education", ] keywords = ["spaced-repetition", "memory", "learning", "tui", "textual", "flashcards", "education"] -dependencies = [ - "bidict==0.23.1", - "playsound==1.2.2", - "textual==5.3.0", - "toml==0.10.2", -] + readme = "README.md" [tool.setuptools.packages.find] diff --git a/requirements.txt b/requirements.txt index 20c66f5..e7e51e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,8 @@ -bidict==0.23.1 +edge-tts==7.0.2 +fsspec==2025.12.0 +jieba==0.42.1 playsound==1.2.2 +tabulate==0.9.0 textual==5.3.0 toml==0.10.2 -requests>=2.31.0 -webdavclient3>=3.0.0 +transitions==0.9.3 \ No newline at end of file diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 36bf9b3..3393778 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -8,7 +8,7 @@ from textual.reactive import reactive from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static -import heurams.kernel.evaluators as pz +import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt from heurams.context import config_var from heurams.kernel.reactor import * @@ -126,12 +126,15 @@ class MemScreen(Screen): play_by_path(path) def watch_rating(self, old_rating, new_rating) -> None: + if new_rating == -1: # 安全值 + return + self.fission.report(new_rating) + + def forward(self, rating): self.update_state() # 刷新状态 if self.procession == None: # 已经完成记忆 return - if new_rating == -1: # 安全值 - return - forwards = 1 if new_rating >= 4 else 0 # 准许前进 + forwards = 1 if rating >= 4 else 0 # 准许前进 self.rating = -1 logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") if forwards: diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 32aa73d..dc219e6 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -1,7 +1,7 @@ """Kernel 操作辅助函数库""" import heurams.interface.widgets as pzw -import heurams.kernel.evaluators as pz +import heurams.kernel.puzzles as pz puzzle2widget = { pz.RecognitionPuzzle: pzw.Recognition, diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 5d71dc9..a669418 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -7,7 +7,7 @@ from textual.message import Message from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.evaluators as pz +import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt from heurams.services.logger import get_logger diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 10d6780..9cdb832 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -5,7 +5,7 @@ from textual.containers import Container, ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.evaluators as pz +import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt from heurams.services.hasher import hash from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/evaluators/__init__.py b/src/heurams/kernel/puzzles/__init__.py similarity index 85% rename from src/heurams/kernel/evaluators/__init__.py rename to src/heurams/kernel/puzzles/__init__.py index 6bc5688..40bc1fd 100644 --- a/src/heurams/kernel/evaluators/__init__.py +++ b/src/heurams/kernel/puzzles/__init__.py @@ -6,13 +6,13 @@ Evaluator 模块 - 生成评估模块 from heurams.services.logger import get_logger -from .base import BaseEvaluator +from .base import BasePuzzle from .cloze import ClozePuzzle from .mcq import MCQPuzzle from .recognition import RecognitionPuzzle __all__ = [ - "BaseEvaluator", + "BasePuzzle", "ClozePuzzle", "MCQPuzzle", "RecognitionPuzzle", @@ -22,5 +22,5 @@ puzzles = { "mcq": MCQPuzzle, "cloze": ClozePuzzle, "recognition": RecognitionPuzzle, - "base": BaseEvaluator, + "base": BasePuzzle, } diff --git a/src/heurams/kernel/evaluators/base.py b/src/heurams/kernel/puzzles/base.py similarity index 95% rename from src/heurams/kernel/evaluators/base.py rename to src/heurams/kernel/puzzles/base.py index cbae148..688d7c8 100644 --- a/src/heurams/kernel/evaluators/base.py +++ b/src/heurams/kernel/puzzles/base.py @@ -4,7 +4,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -class BaseEvaluator: +class BasePuzzle: """谜题基类""" def refresh(self): diff --git a/src/heurams/kernel/evaluators/cloze.py b/src/heurams/kernel/puzzles/cloze.py similarity index 97% rename from src/heurams/kernel/evaluators/cloze.py rename to src/heurams/kernel/puzzles/cloze.py index 549a91f..3522aaa 100644 --- a/src/heurams/kernel/evaluators/cloze.py +++ b/src/heurams/kernel/puzzles/cloze.py @@ -2,12 +2,12 @@ import random from heurams.services.logger import get_logger -from .base import BaseEvaluator +from .base import BasePuzzle logger = get_logger(__name__) -class ClozePuzzle(BaseEvaluator): +class ClozePuzzle(BasePuzzle): """填空题谜题生成器 Args: diff --git a/src/heurams/kernel/evaluators/guess.py b/src/heurams/kernel/puzzles/guess.py similarity index 68% rename from src/heurams/kernel/evaluators/guess.py rename to src/heurams/kernel/puzzles/guess.py index c9945f6..9398b4e 100644 --- a/src/heurams/kernel/evaluators/guess.py +++ b/src/heurams/kernel/puzzles/guess.py @@ -2,11 +2,11 @@ import random from heurams.services.logger import get_logger -from .base import BaseEvaluator +from .base import BasePuzzle logger = get_logger(__name__) -class GuessEvaluator(BaseEvaluator): +class GuessPuzzle(BasePuzzle): def __init__(self): super().__init__() diff --git a/src/heurams/kernel/evaluators/mcq.py b/src/heurams/kernel/puzzles/mcq.py similarity index 99% rename from src/heurams/kernel/evaluators/mcq.py rename to src/heurams/kernel/puzzles/mcq.py index e17db67..1246a19 100644 --- a/src/heurams/kernel/evaluators/mcq.py +++ b/src/heurams/kernel/puzzles/mcq.py @@ -4,12 +4,12 @@ from typing import Dict, List, Optional, Union from heurams.services.logger import get_logger -from .base import BaseEvaluator +from .base import BasePuzzle logger = get_logger(__name__) -class MCQPuzzle(BaseEvaluator): +class MCQPuzzle(BasePuzzle): """选择题谜题生成器 该类用于生成和管理选择题谜题, 支持多个题目同时生成, diff --git a/src/heurams/kernel/evaluators/recognition.py b/src/heurams/kernel/puzzles/recognition.py similarity index 82% rename from src/heurams/kernel/evaluators/recognition.py rename to src/heurams/kernel/puzzles/recognition.py index 81712b0..964db3f 100644 --- a/src/heurams/kernel/evaluators/recognition.py +++ b/src/heurams/kernel/puzzles/recognition.py @@ -3,12 +3,12 @@ import random from heurams.services.logger import get_logger -from .base import BaseEvaluator +from .base import BasePuzzle logger = get_logger(__name__) -class RecognitionPuzzle(BaseEvaluator): +class RecognitionPuzzle(BasePuzzle): """识别占位符""" def __init__(self) -> None: diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index 4c6bfa4..8aaaaa3 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -1 +1,123 @@ -# Reactor - 记忆过程状态机模块 \ No newline at end of file +# Reactor - 记忆流程状态机模块 +Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配. +得益于 Pickle, 状态机模块支持快照! +## Phaser - 全局阶段控制器 +在一次队列记忆流程中, Phaser 代表记忆流程本身. +### 属性 +#### 状态属性 +其有状态属性: +- unsure - 用于初始化 +- *quick_review - 复习逾期的单元 +- *recognition - 辨识新单元 +- *final_review - 复习所有逾期的和新辨认的单元 +- finished - 表示完成 +> 逾期的: 指 SM-2 算法间隔显示应该复习的单元 + +带 * 的属性表示实际的记忆阶段, 由 repo 中 schedule.toml 中 schedule 列表显式声明, 运行过程中可以选择性执行, "空的" Procession 会被直接跳过. + +在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程. + +你可以用 state 属性获取 Phaser 的当前状态. +#### Procession 属性 +储存一个顺序列表, 保存所有构造的 Procession. +顺序与 repo 中 schedule.toml 中 schedule 列表中的顺序完全相同 + +### 初始化 +Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料 +在内部, 根据是否激活将其分为 new_atoms 与 old_atoms. +因此, 如果你传入的列表中有算法上"无所事事"的 Atom, 流程会对其进行"加强复习" +由此创建 Procession. + +### 直接输出呈现形式 +Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. +其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown. +示例: +```text +| Type | State | Processions | Current Procession | +|:-------|:--------|:-----------------------|:---------------------| +| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | +``` +| Type | State | Processions | Current Procession | +|:-------|:--------|:-----------------------|:---------------------| +| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | + +### 方法 +作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. +除此之外, 它也拥有一些其他方法. +#### current_procession(self) +用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态. +返回一个 Procession 对象, 是当前阶段的 Procession. +内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性 +若所有 Procession 都已完成, 将返回一个"阶段状态"为 finished 的 Procession 占位符对象(它不在 procession 属性中), 并更新自身状态为 finished. + +## Procession - 阶段管理器 +### 属性 +#### 状态属性 +其有状态属性: +- active - 标识未完成, 初始化的默认属性 +- finished - 完成了 +#### 其他属性 +- current_atom: 当前记忆原子的引用 +- atoms: 队列中所有原子列表 +- cursor: 指针, 是当前原子在 atoms 列表中的索引 +- phase: "阶段属性" +> 注意区分 "Phaser" 和 "Phase", 其中 "Phase" 表示 "Phaser State". +- name_: 阶段的命名 +- state: 当前状态属性 +### 初始化 +接受一个 atoms 列表与 phase_state (PhaserState Enum 类型)对象 +### 直接输出呈现形式 +同 Phaser, 但显示数据有所不同 +与 Phaser 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) +```text +| Type | Name | State | Progress | Queue | Current Atom | +|:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +``` +| Type | Name | State | Progress | Queue | Current Atom | +|:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +### 方法 +作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. +除此之外, 它也拥有一些其他方法. +#### forward(self, step=1) +移动 cursor 并依情况更新 current_atom 和状态属性 +无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启". + +#### append(self, atom=None) +追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端 +如果这个原子已经处于队列末端, 不会重复追加, 除非队列只剩下这个原子还没完成(此时最多重复两个) + +#### process(self) +返回 cursor 值 + +#### __len__(self) +返回剩余原子量(而不是原子总量) +可以使用 len 函数调用 +获取原子总量请用 len(obj.atoms), 或者 total_length(self) 方法 + +#### total_length(self) +返回队列原子总量 + +#### is_empty(self) +判断是否为空队列(传入原子列表对象是空列表的队列) + +#### get_fission(self) +获取当前原子的 Fission 对象, 用于单原子调度展开 + +## Fission - 单原子调度控制器 +### 属性 +#### 状态属性 +- exammode: 测试模式(默认) +- retronly: 仅回顾模式 +#### 其他属性 +- cursor +- atom +- current_puzzle +- orbital_schedule +- orbital_puzzles +- puzzles +### 初始化 +接受 atom 对象和 phase 参数 +### 方法 +#### get_puzzles(self) \ No newline at end of file diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 9b665cc..2f5d86a 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -1,30 +1,30 @@ +from functools import reduce import random -import heurams.kernel.evaluators as puz +import heurams.kernel.puzzles as puz import heurams.kernel.particles as pt from heurams.services.logger import get_logger -from .states import PhaserState +from transitions import Machine +from .states import FissionState, PhaserState +logger = get_logger(__name__) -class Fission: +class Fission(Machine): """单原子调度展开器""" - def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION): + def __init__(self, atom: pt.Atom, phase=PhaserState.RECOGNITION): + self.phase = phase self.cursor = 0 - self.logger = get_logger(__name__) self.atom = atom - - # NOTE: phase 为 PhaserState 枚举实例,需要获取其value - phase_value = ( - phase_state.value if isinstance(phase_state, PhaserState) else phase_state - ) - - self.orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore - self.orbital_puzzles = atom.registry["nucleon"]["puzzles"] - + self.current_puzzle: puz.BasePuzzle + # phase 为 PhaserState 枚举实例, 需要获取其value + phase_value = phase.value + orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore + orbital_puzzles = atom.registry["nucleon"]["puzzles"] self.puzzles = list() - for item, possibility in self.orbital_schedule: # type: ignore + self.min_ratings = [] + for item, possibility in orbital_schedule: # type: ignore self.logger.debug(f"开始处理: {item}") if not isinstance(possibility, float): possibility = float(possibility) @@ -32,7 +32,7 @@ class Fission: while possibility > 1: self.puzzles.append( { - "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], + "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], "alia": item, } ) @@ -41,27 +41,55 @@ class Fission: if random.random() <= possibility: self.puzzles.append( { - "puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]], + "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], "alia": item, } ) + + states = [ + {"name": FissionState.EXAMMODE.value, "on_enter": "on_exammode"}, + {"name": FissionState.RETRONLY.value, "on_enter": "on_retronly"}, + ] - self.logger.debug(f"orbital 项处理完成: {item}") + transitions = [ + { + "trigger": "finish", + "source": FissionState.EXAMMODE.value, + "dest": FissionState.RETRONLY.value, + }, + ] + + Machine.__init__( + self, + states=states, + transitions=transitions, + initial="Evaluator_0", + ) def get_puzzles(self): + if self.state == 'retronly': + return [puz.puzzles['recognition']] return self.puzzles - def get_current_puzzle(self, forward=0): - if forward: - if len(self.puzzles) <= self.cursor + 1: - return 0 - self.cursor += 1 - return self.puzzles[self.cursor] - else: - return self.puzzles[self.cursor] + def get_current_puzzle(self): + if self.state == 'retronly': + return puz.puzzles['recognition'] + return self.current_puzzle + + def report(self, rating): + self.min_ratings[self.cursor] = min(rating, self.min_ratings[self.cursor]) + + def get_quality(self): + if self.is_state("exammode", self): + return reduce(lambda x,y: min(x, y), self.min_ratings) + return -1 - def check_passed(self): - for i in self.puzzles: - if i["finished"] == 0: - return 0 - return 1 + def forward(self, step=1): + """将谜题指针向前移动并依情况更新或完成""" + logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) + self.cursor += step + if self.cursor >= len(self.puzzles): + if self.state != 'retronly': + self.finish() + else: + self.current_puzzle = self.puzzles[self.cursor] \ No newline at end of file diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 03dcf75..b062a01 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,3 +1,4 @@ +from click import style import heurams.kernel.particles as pt from heurams.kernel.particles.placeholders import AtomPlaceholder from heurams.services.logger import get_logger @@ -27,7 +28,7 @@ class Phaser(Machine): logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) self.processions = list() - # TODO: 改进为基于配置文件的可变复习阶段管理 + # TODO: 改进为基于配置文件的可选复习阶段 if len(old_atoms): self.processions.append( Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") @@ -111,7 +112,7 @@ class Phaser(Machine): for i in self.processions: i: Procession if i.state != ProcessionState.FINISHED.value: - # 根据当前procession的phase更新Phaser状态 + #if i.phase == PhaserState.UNSURE: 此判断是不必要的 因为没有这种 Procession if i.phase == PhaserState.QUICK_REVIEW: self.to_quick_review() elif i.phase == PhaserState.RECOGNITION: @@ -139,4 +140,4 @@ class Phaser(Machine): "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore }, ] - return str(tabu(lst, headers="keys")) + "\n" + return str(tabu(tabular_data=lst, headers="keys", tablefmt="pipe")) + "\n" diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 07daeb5..db323f5 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -21,27 +21,26 @@ class Procession(Machine): ) self.current_atom: pt.Atom | None self.atoms = atoms - self.queue = atoms.copy() self.current_atom = atoms[0] if atoms else None self.cursor = 0 self.name_ = name_ self.phase = phase_state states = [ - {"name": ProcessionState.RUNNING.value, "on_enter": "on_running"}, + {"name": ProcessionState.ACTIVE.value, "on_enter": "on_active"}, {"name": ProcessionState.FINISHED.value, "on_enter": "on_finished"}, ] transitions = [ { "trigger": "finish", - "source": ProcessionState.RUNNING.value, + "source": ProcessionState.ACTIVE.value, "dest": ProcessionState.FINISHED.value, }, { "trigger": "restart", "source": ProcessionState.FINISHED.value, - "dest": ProcessionState.RUNNING.value, + "dest": ProcessionState.ACTIVE.value, }, ] @@ -49,14 +48,14 @@ class Procession(Machine): self, states=states, transitions=transitions, - initial=ProcessionState.RUNNING.value, + initial=ProcessionState.ACTIVE.value, ) - logger.debug("Procession 初始化完成, 队列长度=%d", len(self.queue)) + logger.debug("Procession 初始化完成, 队列长度=%d", len(self.atoms)) - def on_running(self): - """进入RUNNING状态时的回调""" - logger.debug("Procession 进入 RUNNING 状态") + def on_active(self): + """进入active状态时的回调""" + logger.debug("Procession 进入 active 状态") def on_finished(self): """进入FINISHED状态时的回调""" @@ -66,21 +65,19 @@ class Procession(Machine): """将记忆原子指针向前移动并依情况更新原子(返回 1)或完成队列(返回 0)""" logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step - if self.cursor >= len(self.queue): + if self.cursor >= len(self.atoms): if self.state != ProcessionState.FINISHED.value: self.finish() # 触发状态转换 logger.debug("Procession 已完成") else: - if self.state != ProcessionState.RUNNING.value: - self.restart() # 确保在RUNNING状态 - self.current_atom = self.queue[self.cursor] + if self.state != ProcessionState.ACTIVE.value: + self.restart() # 确保在active状态 + self.current_atom = self.atoms[self.cursor] logger.debug("cursor 更新为: %d", self.cursor) logger.debug( "当前原子更新为: %s", self.current_atom.ident if self.current_atom else "None", ) - return 1 # 成功 - return 0 def append(self, atom=None): """追加(回忆失败的)原子(默认为当前原子)到队列末端""" @@ -88,16 +85,16 @@ class Procession(Machine): atom = self.current_atom logger.debug("Procession.append: atom=%s", atom.ident if atom else "None") - if not self.queue or self.queue[-1] != atom or len(self) <= 1: - self.queue.append(atom) - logger.debug("原子已追加到队列, 新队列长度=%d", len(self.queue)) + if not self.atoms or self.atoms[-1] != atom or len(self) <= 1: + self.atoms.append(atom) + logger.debug("原子已追加到队列, 新队列长度=%d", len(self.atoms)) else: logger.debug("原子未追加(重复或队列长度<=1)") def __len__(self): - if not self.queue: + if not self.atoms: return 0 - length = len(self.queue) - self.cursor + length = len(self.atoms) - self.cursor logger.debug("Procession.__len__: 剩余长度=%d", length) return length @@ -106,17 +103,17 @@ class Procession(Machine): return self.cursor def total_length(self): - total = len(self.queue) + total = len(self.atoms) logger.debug("Procession.total_length: %d", total) return total def is_empty(self): - empty = len(self.queue) == 0 + empty = len(self.atoms) == 0 logger.debug("Procession.is_empty: %s", empty) return empty def get_fission(self): - return Fission(atom=self.current_atom, phase_state=self.phase) # type: ignore + return Fission(atom=self.current_atom, phase=self.phase) # type: ignore def __repr__(self): from heurams.services.textproc import truncate @@ -126,9 +123,9 @@ class Procession(Machine): "Type": "Procession", "Name": self.name_, "State": self.state, - "Progress": f"{self.cursor + 1} / {len(self.queue)}", - "Queue": list(map(lambda f: truncate(f.ident), self.queue)), + "Progress": f"{self.cursor + 1} / {len(self.atoms)}", + "Queue": list(map(lambda f: truncate(f.ident), self.atoms)), "Current Atom": self.current_atom.ident, # type: ignore } ] - return str(tabu(dic, headers="keys")) + "\n" + return str(tabu(dic, headers="keys", tablefmt='pipe')) + "\n" diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py index ae4a8db..9a25a55 100644 --- a/src/heurams/kernel/reactor/states.py +++ b/src/heurams/kernel/reactor/states.py @@ -12,10 +12,12 @@ class PhaserState(Enum): FINAL_REVIEW = "final_review" FINISHED = "finished" - class ProcessionState(Enum): - RUNNING = "running" + ACTIVE = "active" FINISHED = "finished" +class FissionState(Enum): + EXAMMODE = "exammode" + RETRONLY = "retronly" logger.debug("状态枚举定义已加载") From 3266eda44d557795498cc45bac91069c745382f6 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 6 Jan 2026 18:28:57 +0800 Subject: [PATCH 16/79] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/repo/test/schedule.toml | 4 +- src/heurams/interface/screens/memoqueue.py | 86 +++++++++++++++------- src/heurams/interface/shim.py | 2 +- src/heurams/kernel/particles/orbital.py | 2 +- src/heurams/kernel/puzzles/__init__.py | 2 +- src/heurams/kernel/reactor/fission.py | 58 ++++++++++----- src/heurams/kernel/reactor/phaser.py | 4 +- src/heurams/kernel/reactor/procession.py | 5 +- 8 files changed, 109 insertions(+), 54 deletions(-) diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml index 393b8d3..e92741d 100644 --- a/data/repo/test/schedule.toml +++ b/data/repo/test/schedule.toml @@ -1,8 +1,10 @@ schedule = ["quick_review", "recognition", "final_review"] + [phases] quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] recognition = [["Recognition", "1.0"]] -final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] +final_review = [["FillBlank", "1.0"], ["SelectMeaning", "1.0"], ["Recognition", "1.0"]] + [annotation] "quick_review" = "复习旧知" "recognition" = "新知识" diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 3393778..b21b8cc 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -27,7 +27,7 @@ logger = get_logger(__name__) class MemScreen(Screen): BINDINGS = [ - ("q", "pop_screen", "返回"), + ("q", "go_back", "返回"), ("p", "prev", "查看上一个"), ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), @@ -35,7 +35,8 @@ class MemScreen(Screen): ] if config_var.get()["quick_pass"]: - BINDINGS.append(("k", "quick_pass", "跳过")) + BINDINGS.append(("k", "quick_pass", "正确应答")) + BINDINGS.append(("f", "quick_fail", "错误应答")) rating = reactive(-1) def __init__( @@ -48,6 +49,7 @@ class MemScreen(Screen): super().__init__(name, id, classes) self.phaser = phaser self.update_state() + self.fission: Fission def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -62,23 +64,43 @@ class MemScreen(Screen): self.atom: pt.Atom = self.procession.current_atom # type: ignore def on_mount(self): + self.fission = self.procession.get_fission() self.mount_puzzle() self.update_display() def puzzle_widget(self): try: - self.fission = self.procession.get_fission() - puzzle = self.fission.get_current_puzzle() + puzzle = self.fission.get_current_puzzle_inf() return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore atom=self.atom, alia=puzzle["alia"] # type: ignore ) - except (KeyError, StopIteration, AttributeError) as e: + except Exception as e: logger.debug(f"调度展开出错: {e}") return Static(f"无法生成谜题 {e}") def _get_progress_text(self): s = f"阶段: {self.procession.phase.name}\n" - s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + try: + alia = self.fission.get_current_puzzle_inf()['alia'] # type: ignore + s += f"谜题: {alia}\n" + except: + pass + try: + stat = self.phaser.__repr__('simple', '') + s += f"{stat}\n" + except: + pass + try: + stat = self.procession.__repr__('simple', '') + s += f"{stat}\n" + except: + pass + try: + stat = self.fission.__repr__('simple', '') + s += f"{stat}\n" + except Exception as e: + s = str(e) + #s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s def update_display(self): @@ -129,26 +151,38 @@ class MemScreen(Screen): if new_rating == -1: # 安全值 return self.fission.report(new_rating) + self.forward(new_rating) + self.rating = -1 def forward(self, rating): - self.update_state() # 刷新状态 - if self.procession == None: # 已经完成记忆 - return - forwards = 1 if rating >= 4 else 0 # 准许前进 - self.rating = -1 - logger.debug(f"试图前进: {"允许" if forwards else "禁止"}") - if forwards: - ret = self.procession.forward(1) - if ret == 0: # 若结束了此次队列 - self.update_state() - if self.procession.phase == PhaserState.FINISHED: # 若所有队列都结束了 - logger.debug(f"记忆进程结束") - self.mount_finished_widget() - return - else: - logger.debug(f"建立新队列 {self.procession.phase}") - self.update_state() - self.mount_puzzle() - else: # 若不通过 - self.procession.append() + self.update_state() + allow_forward = 1 if rating >= 4 else 0 + if allow_forward: + self.fission.forward() + if self.fission.state == 'retronly': + self.forward_atom(self.fission.get_quality()) + self.update_state() + self.mount_puzzle() self.update_display() + + def forward_atom(self, quality): + logger.debug(f"Quality: {quality}") + if quality <= 3: + self.procession.append() + self.update_state() # 刷新状态 + self.procession.forward(1) + self.update_state() # 刷新状态 + if self.procession.phase == PhaserState.FINISHED: # 若所有队列都结束了 + logger.debug(f"记忆进程结束") + self.mount_finished_widget() + return + self.fission = self.procession.get_fission() + + def action_go_back(self): + self.app.pop_screen() + + def action_quick_pass(self): + self.rating = 5 + + def action_quick_fail(self): + self.rating = 3 diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index dc219e6..336412c 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -7,5 +7,5 @@ puzzle2widget = { pz.RecognitionPuzzle: pzw.Recognition, pz.ClozePuzzle: pzw.ClozePuzzle, pz.MCQPuzzle: pzw.MCQPuzzle, - pz.BaseEvaluator: pzw.BasePuzzleWidget, + pz.BasePuzzle: pzw.BasePuzzleWidget, } diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py index 8d76364..f957761 100644 --- a/src/heurams/kernel/particles/orbital.py +++ b/src/heurams/kernel/particles/orbital.py @@ -9,7 +9,7 @@ orbital, 即轨道, 是定义队列式复习阶段流程的数据结构, 其实 orbital_example = { "schedule": [列表 存储阶段(phases)名称] "phases":{ - 阶段名称 = [["谜题(puzzle 现称 evaluator 评估器)名称", "概率系数 可大于1(整数部分为重复次数) 注意使用字符串包裹(toml 规范)"], ...], + 阶段名称 = [["谜题(puzzle 现称 Puzzles 评估器)名称", "概率系数 可大于1(整数部分为重复次数) 注意使用字符串包裹(toml 规范)"], ...], ... } } diff --git a/src/heurams/kernel/puzzles/__init__.py b/src/heurams/kernel/puzzles/__init__.py index 40bc1fd..3bfd38b 100644 --- a/src/heurams/kernel/puzzles/__init__.py +++ b/src/heurams/kernel/puzzles/__init__.py @@ -1,5 +1,5 @@ """ -Evaluator 模块 - 生成评估模块 +Puzzles 模块 - 生成评估模块 提供多种类型的辅助评估生成器, 支持从字符串、字典等数据源导入题目 """ diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 2f5d86a..dddad50 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -5,6 +5,7 @@ import heurams.kernel.puzzles as puz import heurams.kernel.particles as pt from heurams.services.logger import get_logger +from tabulate import tabulate as tabu from transitions import Machine from .states import FissionState, PhaserState @@ -17,20 +18,20 @@ class Fission(Machine): self.phase = phase self.cursor = 0 self.atom = atom - self.current_puzzle: puz.BasePuzzle + self.current_puzzle_inf: dict # phase 为 PhaserState 枚举实例, 需要获取其value phase_value = phase.value orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore orbital_puzzles = atom.registry["nucleon"]["puzzles"] - self.puzzles = list() + self.puzzles_inf = list() self.min_ratings = [] for item, possibility in orbital_schedule: # type: ignore - self.logger.debug(f"开始处理: {item}") + logger.debug(f"开始处理: {item}") if not isinstance(possibility, float): possibility = float(possibility) while possibility > 1: - self.puzzles.append( + self.puzzles_inf.append( { "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], "alia": item, @@ -39,16 +40,16 @@ class Fission(Machine): possibility -= 1 if random.random() <= possibility: - self.puzzles.append( + self.puzzles_inf.append( { "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], "alia": item, } ) - + self.current_puzzle_inf = self.puzzles_inf[0] states = [ - {"name": FissionState.EXAMMODE.value, "on_enter": "on_exammode"}, - {"name": FissionState.RETRONLY.value, "on_enter": "on_retronly"}, + {"name": FissionState.EXAMMODE.value}, + {"name": FissionState.RETRONLY.value}, ] transitions = [ @@ -59,37 +60,56 @@ class Fission(Machine): }, ] + for i in range(len(self.puzzles_inf)): + self.min_ratings.append(0x3f3f3f3f) + Machine.__init__( self, states=states, transitions=transitions, - initial="Evaluator_0", + initial=FissionState.EXAMMODE.value, ) - def get_puzzles(self): + def get_puzzles_inf(self): if self.state == 'retronly': - return [puz.puzzles['recognition']] - return self.puzzles + return [{"puzzle": puz.puzzles['recognition'], "alia": "Recognition"}] + return self.puzzles_inf - def get_current_puzzle(self): + def get_current_puzzle_inf(self): if self.state == 'retronly': - return puz.puzzles['recognition'] - return self.current_puzzle + return {"puzzle": puz.puzzles['recognition'], "alia": "Recognition"} + return self.current_puzzle_inf def report(self, rating): self.min_ratings[self.cursor] = min(rating, self.min_ratings[self.cursor]) def get_quality(self): - if self.is_state("exammode", self): + logger.debug(f"CState: {self.state}") + if self.is_state("retronly", self): return reduce(lambda x,y: min(x, y), self.min_ratings) - return -1 + raise IndexError def forward(self, step=1): """将谜题指针向前移动并依情况更新或完成""" logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step - if self.cursor >= len(self.puzzles): + if self.cursor >= len(self.puzzles_inf): if self.state != 'retronly': self.finish() else: - self.current_puzzle = self.puzzles[self.cursor] \ No newline at end of file + self.current_puzzle_inf = self.puzzles_inf[self.cursor] + + def __repr__(self, style="pipe", ends = "\n") -> str: + from heurams.services.textproc import truncate + + dic = [ + { + "Type": "Fission", + "Atom": truncate(self.atom.ident), + "State": self.state, + "Progress": f"{self.cursor + 1} / {len(self.puzzles_inf)}", + "Queue": list(map(lambda f: truncate(f['alia']), self.puzzles_inf)), + "Current Puzzle": f"{self.current_puzzle_inf['alia']}@{self.current_puzzle_inf['puzzle'].__name__}", # type: ignore + } + ] + return str(tabu(dic, headers="keys", tablefmt=style)) + ends diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index b062a01..83eb4d1 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -128,7 +128,7 @@ class Phaser(Machine): logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") return Procession([AtomPlaceholder()], PhaserState.FINISHED) - def __repr__(self): + def __repr__(self, style="pipe", ends = "\n"): from heurams.services.textproc import truncate from tabulate import tabulate as tabu @@ -140,4 +140,4 @@ class Phaser(Machine): "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore }, ] - return str(tabu(tabular_data=lst, headers="keys", tablefmt="pipe")) + "\n" + return str(tabu(tabular_data=lst, headers="keys", tablefmt=style)) + ends diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index db323f5..ac402de 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -8,7 +8,6 @@ from .states import PhaserState, ProcessionState logger = get_logger(__name__) - class Procession(Machine): """队列: 标识单次记忆流程""" @@ -115,7 +114,7 @@ class Procession(Machine): def get_fission(self): return Fission(atom=self.current_atom, phase=self.phase) # type: ignore - def __repr__(self): + def __repr__(self, style="pipe", ends = "\n"): from heurams.services.textproc import truncate dic = [ @@ -128,4 +127,4 @@ class Procession(Machine): "Current Atom": self.current_atom.ident, # type: ignore } ] - return str(tabu(dic, headers="keys", tablefmt='pipe')) + "\n" + return str(tabu(dic, headers="keys", tablefmt=style)) + ends From 9d9858788c7fdf1009e8eb321667919774a5b19a Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 6 Jan 2026 19:58:46 +0800 Subject: [PATCH 17/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=B1=8F=E5=B9=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/repo.ipynb | 303 ++++++++++++--------- src/heurams/interface/screens/memoqueue.py | 60 ++-- src/heurams/kernel/reactor/fission.py | 59 ++-- src/heurams/kernel/reactor/phaser.py | 4 +- src/heurams/kernel/reactor/procession.py | 3 +- src/heurams/kernel/reactor/states.py | 3 + 6 files changed, 246 insertions(+), 186 deletions(-) diff --git a/examples/repo.ipynb b/examples/repo.ipynb index c6bbeed..ccd57ed 100644 --- a/examples/repo.ipynb +++ b/examples/repo.ipynb @@ -6,7 +6,8 @@ "metadata": {}, "source": [ "# 演练场\n", - "此笔记本将带你了解 repomgr 与 particles 对象相关操作" + "此笔记本将带你了解 repomgr 与 particles 对象相关操作 \n", + "此笔记本内含的系统命令默认仅存在于 Linux 操作系统, 如果你使用 Windows, 请在安装 busybox 或 cygwin 或 WSL 的环境下执行此笔记本" ] }, { @@ -21,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 29, "id": "a5ed9864", "metadata": {}, "outputs": [ @@ -30,7 +31,12 @@ "output_type": "stream", "text": [ "\u001b[01;34m.\u001b[0m\n", + "├── \u001b[01;34mdata\u001b[0m\n", + "│   └── \u001b[01;34mconfig\u001b[0m\n", + "│   └── \u001b[00mconfig.toml\u001b[0m\n", + "├── \u001b[00mjiebatest.py\u001b[0m\n", "├── \u001b[00mrepo.ipynb\u001b[0m\n", + "├── \u001b[00msimplemem.py\u001b[0m\n", "└── \u001b[01;34mtest_repo\u001b[0m\n", " ├── \u001b[00malgodata.json\u001b[0m\n", " ├── \u001b[00mmanifest.toml\u001b[0m\n", @@ -38,7 +44,7 @@ " ├── \u001b[00mschedule.toml\u001b[0m\n", " └── \u001b[00mtypedef.toml\u001b[0m\n", "\n", - "2 directories, 6 files\n" + "4 directories, 9 files\n" ] } ], @@ -56,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 30, "id": "9777730e", "metadata": {}, "outputs": [ @@ -85,21 +91,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 31, "id": "bf1b00c8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "欢迎使用 HeurAMS 及其组件!\n", - "rootdir: /mnt/data/Devel/HeurAMS/HeurAMS/src/heurams\n", - "workdir: /mnt/data/Devel/HeurAMS/HeurAMS/examples\n", - "未能加载自定义用户配置\n" - ] - } - ], + "outputs": [], "source": [ "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", @@ -120,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 32, "id": "897b62d7", "metadata": {}, "outputs": [ @@ -148,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 33, "id": "708ae7e4", "metadata": {}, "outputs": [], @@ -169,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 34, "id": "a11115fb", "metadata": {}, "outputs": [ @@ -177,20 +172,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'algodata': [('君臣固守以窥周室,', {}), ('秦孝公据崤函之固, 拥雍州之地,', {})],\n", + "{'algodata': [('秦孝公据崤函之固, 拥雍州之地,', {}), ('君臣固守以窥周室,', {})],\n", " 'manifest': {'author': '__heurams__',\n", " 'desc': '高考古诗文: 过秦论',\n", " 'title': '测试单元: 过秦论'},\n", - " 'payload': [('君臣固守以窥周室,',\n", - " {'content': '君臣/固守/以窥/周室,/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'}),\n", - " ('秦孝公据崤函之固, 拥雍州之地,',\n", + " 'payload': [('秦孝公据崤函之固, 拥雍州之地,',\n", " {'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", " 'note': [],\n", - " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'})],\n", + " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'}),\n", + " ('君臣固守以窥周室,',\n", + " {'content': '君臣/固守/以窥/周室,/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'})],\n", " 'schedule': {'phases': {'final_review': [['FillBlank', '0.7'],\n", " ['SelectMeaning', '0.7'],\n", " ['Recognition', '1.0']],\n", @@ -207,26 +202,26 @@ " 'translation': '语句翻译',\n", " 'tts_text': '文本转语音文本'},\n", " 'common': {'delimiter': '/',\n", - " 'tts_text': \"eval:payload['content'].replace('/', '')\"},\n", - " 'puzzles': {'FillBlank': {'__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': \"eval:metadata['formation']['delimiter']\",\n", - " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", - " 'text': \"eval:payload['content']\"},\n", - " 'Recognition': {'__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': \"eval:payload['content']\",\n", - " 'secondary': [\"eval:payload['keyword_note']\",\n", - " \"eval:payload['note']\"],\n", - " 'top_dim': [\"eval:payload['translation']\"]},\n", - " 'SelectMeaning': {'__hint__': \"eval:payload['content']\",\n", - " '__origin__': 'mcq',\n", - " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", - " 'mapping': \"eval:payload['keyword_note']\",\n", - " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': \"eval:payload['content']\"}},\n", - " '古文句': {}}}\n" + " 'puzzles': {'FillBlank': {'__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': \"eval:nucleon['delimiter']\",\n", + " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", + " 'text': \"eval:payload['content']\"},\n", + " 'Recognition': {'__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': \"eval:payload['content']\",\n", + " 'secondary': [\"eval:payload['keyword_note']\",\n", + " \"eval:payload['note']\"],\n", + " 'top_dim': [\"eval:payload['translation']\"]},\n", + " 'SelectMeaning': {'__hint__': \"eval:payload['content']\",\n", + " '__origin__': 'mcq',\n", + " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", + " 'mapping': \"eval:payload['keyword_note']\",\n", + " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': \"eval:payload['content']\"}},\n", + " 'tts_text': \"eval:payload['content'].replace('/', \"\n", + " \"'')\"}}}\n" ] } ], @@ -255,13 +250,13 @@ "- save_list: 默认为 [\"algodata\"], 是要持久化的数据.\n", "- source: 默认为原目录, 你也可以手动指定为其他文件夹(通过 Path)\n", "\n", - "现在做一些演练, 我们将创建一个位于 test_new_repo 的\"克隆\", 此时我们!\n", + "现在做一些演练, 我们将创建一个位于 test_new_repo 的\"克隆\". \n", "除非文件夹已经存在, Repo 对象将会为你自动创建新文件夹." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 35, "id": "05eeaacc", "metadata": {}, "outputs": [ @@ -270,8 +265,12 @@ "output_type": "stream", "text": [ "\u001b[01;34m.\u001b[0m\n", - "├── \u001b[00mheurams.log\u001b[0m\n", + "├── \u001b[01;34mdata\u001b[0m\n", + "│   └── \u001b[01;34mconfig\u001b[0m\n", + "│   └── \u001b[00mconfig.toml\u001b[0m\n", + "├── \u001b[00mjiebatest.py\u001b[0m\n", "├── \u001b[00mrepo.ipynb\u001b[0m\n", + "├── \u001b[00msimplemem.py\u001b[0m\n", "├── \u001b[01;34mtest_new_repo\u001b[0m\n", "│   ├── \u001b[00malgodata.json\u001b[0m\n", "│   ├── \u001b[00mmanifest.toml\u001b[0m\n", @@ -285,7 +284,7 @@ " ├── \u001b[00mschedule.toml\u001b[0m\n", " └── \u001b[00mtypedef.toml\u001b[0m\n", "\n", - "3 directories, 12 files\n" + "5 directories, 14 files\n" ] } ], @@ -327,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 36, "id": "7e88bd7c", "metadata": {}, "outputs": [ @@ -335,8 +334,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n", - "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n" + "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n", + "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n" ] } ], @@ -356,13 +355,13 @@ "metadata": {}, "source": [ "### 输出形式\n", - "lct 的\"官方\"输出形式是列表形式\n", + "Lict 的\"官方\"输出形式是列表形式\n", "你也可以选择输出字典形式" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 37, "id": "248f6cba", "metadata": {}, "outputs": [ @@ -392,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 38, "id": "a0eb07a7", "metadata": {}, "outputs": [ @@ -400,9 +399,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[('age', 12), ('enemy', 'jerry'), ('name', 'tom')]\n", - "[('age', 12), ('enemy', 'jerry'), ('name', 'tom'), ('type', 'cat')]\n", - "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n" + "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n", + "[('name', 'tom'), ('age', 12), ('enemy', 'jerry'), ('type', 'cat')]\n", + "[('name', 'tom'), ('age', 12), ('enemy', 'jerry'), ('type', 'cat'), ('is_human', False)]\n" ] } ], @@ -437,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "0ab442d4", "metadata": {}, "outputs": [ @@ -445,12 +444,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'}\n" + "{'name': 'tom', 'age': 12, 'enemy': 'jerry', 'type': 'cat', 'is_human': False, 'enemy_2': 'spike'}\n" ] } ], "source": [ - "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", + "# 由于 Jupyter 的环境处理(环境状态会累积), 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", "\n", "# 唯一推荐方式\n", "lct.append((\"enemy_2\", \"spike\"))\n", @@ -470,7 +469,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 40, "id": "f3ca752f", "metadata": {}, "outputs": [ @@ -478,23 +477,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n", + "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat'), ('enemy_2', 'spike')]\n", "{'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'}\n", "------\n", "('age', 12)\n", "('enemy', 'jerry')\n", - "('enemy_2', 'spike')\n", "('is_human', False)\n", "('name', 'tom')\n", "('type', 'cat')\n", + "('enemy_2', 'spike')\n", "6\n", - "('type', 'cat')\n", - "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False), ('name', 'tom')]\n", - "('name', 'tom')\n", - "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike'), ('is_human', False)]\n", - "('is_human', False)\n", - "[('age', 12), ('enemy', 'jerry'), ('enemy_2', 'spike')]\n", "('enemy_2', 'spike')\n", + "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n", + "('type', 'cat')\n", + "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom')]\n", + "('name', 'tom')\n", + "[('age', 12), ('enemy', 'jerry'), ('is_human', False)]\n", + "('is_human', False)\n", "[('age', 12), ('enemy', 'jerry')]\n", "('enemy', 'jerry')\n", "[('age', 12)]\n", @@ -508,7 +507,7 @@ "Ellipsis" ] }, - "execution_count": 12, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -556,10 +555,18 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 41, "id": "773bf99c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zsh:1: no matches found: heurams.log*\n" + ] + } + ], "source": [ "!rm -rf test_new_repo\n", "!rm -rf heurams.log*" @@ -567,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 42, "id": "8645c5a2", "metadata": {}, "outputs": [ @@ -575,67 +582,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "{ 'content': '君臣/固守/以窥/周室,/',\n", - " 'delimiter': '/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,',\n", - " 'tts_text': '君臣固守以窥周室,'}\n", - "{ 'SM-2': { 'efactor': 2.5,\n", - " 'interval': 1,\n", - " 'is_activated': 1,\n", - " 'last_date': 20454,\n", - " 'last_modify': 1767274438.752494,\n", - " 'next_date': 20455,\n", - " 'real_rept': 1,\n", - " 'rept': 0}}\n", "{ 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", " 'delimiter': '/',\n", " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", " 'note': [],\n", + " 'puzzles': { 'FillBlank': { '__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': '/',\n", + " 'min_denominator': 3,\n", + " 'text': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/'},\n", + " 'Recognition': { '__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", + " 'secondary': [ { '崤函': '崤山和函谷关',\n", + " '据': '占据',\n", + " '雍州': '古代九州之一'},\n", + " []],\n", + " 'top_dim': [ '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,']},\n", + " 'SelectMeaning': { '__hint__': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", + " '__origin__': 'mcq',\n", + " 'jammer': ['占据', '崤山和函谷关', '古代九州之一'],\n", + " 'mapping': { '崤函': '崤山和函谷关',\n", + " '据': '占据',\n", + " '雍州': '古代九州之一'},\n", + " 'max_riddles_num': 2,\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/'}},\n", " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,',\n", " 'tts_text': '秦孝公据崤函之固, 拥雍州之地,'}\n", "{ 'SM-2': { 'efactor': 2.5,\n", " 'interval': 1,\n", " 'is_activated': 1,\n", - " 'last_date': 20454,\n", - " 'last_modify': 1767274438.7534873,\n", - " 'next_date': 20455,\n", + " 'last_date': 20459,\n", + " 'last_modify': 1767700296.4950516,\n", + " 'next_date': 20460,\n", " 'real_rept': 1,\n", " 'rept': 0}}\n", - "{ 'algodata': [ ( '君臣固守以窥周室,',\n", + "{ 'content': '君臣/固守/以窥/周室,/',\n", + " 'delimiter': '/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'puzzles': { 'FillBlank': { '__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': '/',\n", + " 'min_denominator': 3,\n", + " 'text': '君臣/固守/以窥/周室,/'},\n", + " 'Recognition': { '__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': '君臣/固守/以窥/周室,/',\n", + " 'secondary': [{'窥': '窥视'}, []],\n", + " 'top_dim': ['君臣牢固地守卫着,借以窥视周王室的权力,']},\n", + " 'SelectMeaning': { '__hint__': '君臣/固守/以窥/周室,/',\n", + " '__origin__': 'mcq',\n", + " 'jammer': ['窥视'],\n", + " 'mapping': {'窥': '窥视'},\n", + " 'max_riddles_num': 2,\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': '君臣/固守/以窥/周室,/'}},\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,',\n", + " 'tts_text': '君臣固守以窥周室,'}\n", + "{ 'SM-2': { 'efactor': 2.5,\n", + " 'interval': 1,\n", + " 'is_activated': 1,\n", + " 'last_date': 20459,\n", + " 'last_modify': 1767700296.4968777,\n", + " 'next_date': 20460,\n", + " 'real_rept': 1,\n", + " 'rept': 0}}\n", + "{ 'algodata': [ ( '秦孝公据崤函之固, 拥雍州之地,',\n", " { 'SM-2': { 'efactor': 2.5,\n", " 'interval': 1,\n", " 'is_activated': 1,\n", - " 'last_date': 20454,\n", - " 'last_modify': 1767274438.752494,\n", - " 'next_date': 20455,\n", + " 'last_date': 20459,\n", + " 'last_modify': 1767700296.4950516,\n", + " 'next_date': 20460,\n", " 'real_rept': 1,\n", " 'rept': 0}}),\n", - " ( '秦孝公据崤函之固, 拥雍州之地,',\n", + " ( '君臣固守以窥周室,',\n", " { 'SM-2': { 'efactor': 2.5,\n", " 'interval': 1,\n", " 'is_activated': 1,\n", - " 'last_date': 20454,\n", - " 'last_modify': 1767274438.7534873,\n", - " 'next_date': 20455,\n", + " 'last_date': 20459,\n", + " 'last_modify': 1767700296.4968777,\n", + " 'next_date': 20460,\n", " 'real_rept': 1,\n", " 'rept': 0}})],\n", " 'manifest': { 'author': '__heurams__',\n", " 'desc': '高考古诗文: 过秦论',\n", " 'title': '测试单元: 过秦论'},\n", - " 'payload': [ ( '君臣固守以窥周室,',\n", - " { 'content': '君臣/固守/以窥/周室,/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'}),\n", - " ( '秦孝公据崤函之固, 拥雍州之地,',\n", + " 'payload': [ ( '秦孝公据崤函之固, 拥雍州之地,',\n", " { 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", " 'keyword_note': { '崤函': '崤山和函谷关',\n", " '据': '占据',\n", " '雍州': '古代九州之一'},\n", " 'note': [],\n", - " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'})],\n", + " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'}),\n", + " ( '君臣固守以窥周室,',\n", + " { 'content': '君臣/固守/以窥/周室,/',\n", + " 'keyword_note': {'窥': '窥视'},\n", + " 'note': [],\n", + " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'})],\n", " 'schedule': { 'phases': { 'final_review': [ ['FillBlank', '0.7'],\n", " ['SelectMeaning', '0.7'],\n", " ['Recognition', '1.0']],\n", @@ -654,27 +700,26 @@ " 'translation': '语句翻译',\n", " 'tts_text': '文本转语音文本'},\n", " 'common': { 'delimiter': '/',\n", + " 'puzzles': { 'FillBlank': { '__hint__': '',\n", + " '__origin__': 'cloze',\n", + " 'delimiter': \"eval:nucleon['delimiter']\",\n", + " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", + " 'text': \"eval:payload['content']\"},\n", + " 'Recognition': { '__hint__': '',\n", + " '__origin__': 'recognition',\n", + " 'primary': \"eval:payload['content']\",\n", + " 'secondary': [ \"eval:payload['keyword_note']\",\n", + " \"eval:payload['note']\"],\n", + " 'top_dim': [ \"eval:payload['translation']\"]},\n", + " 'SelectMeaning': { '__hint__': \"eval:payload['content']\",\n", + " '__origin__': 'mcq',\n", + " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", + " 'mapping': \"eval:payload['keyword_note']\",\n", + " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", + " 'prefix': '选择正确项: ',\n", + " 'primary': \"eval:payload['content']\"}},\n", " 'tts_text': \"eval:payload['content'].replace('/', \"\n", - " \"'')\"},\n", - " 'puzzles': { 'FillBlank': { '__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': \"eval:metadata['formation']['delimiter']\",\n", - " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", - " 'text': \"eval:payload['content']\"},\n", - " 'Recognition': { '__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': \"eval:payload['content']\",\n", - " 'secondary': [ \"eval:payload['keyword_note']\",\n", - " \"eval:payload['note']\"],\n", - " 'top_dim': [ \"eval:payload['translation']\"]},\n", - " 'SelectMeaning': { '__hint__': \"eval:payload['content']\",\n", - " '__origin__': 'mcq',\n", - " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", - " 'mapping': \"eval:payload['keyword_note']\",\n", - " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': \"eval:payload['content']\"}},\n", - " '古文句': {}}}\n" + " \"'')\"}}}\n" ] } ], diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index b21b8cc..148c873 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -80,27 +80,28 @@ class MemScreen(Screen): def _get_progress_text(self): s = f"阶段: {self.procession.phase.name}\n" - try: - alia = self.fission.get_current_puzzle_inf()['alia'] # type: ignore - s += f"谜题: {alia}\n" - except: - pass - try: - stat = self.phaser.__repr__('simple', '') - s += f"{stat}\n" - except: - pass - try: - stat = self.procession.__repr__('simple', '') - s += f"{stat}\n" - except: - pass - try: - stat = self.fission.__repr__('simple', '') - s += f"{stat}\n" - except Exception as e: - s = str(e) - #s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + if config_var.get().get("debug_topline", 0): + try: + alia = self.fission.get_current_puzzle_inf()["alia"] # type: ignore + s += f"谜题: {alia}\n" + except: + pass + try: + stat = self.phaser.__repr__("simple", "") + s += f"{stat}\n" + except: + pass + try: + stat = self.procession.__repr__("simple", "") + s += f"{stat}\n" + except: + pass + try: + stat = self.fission.__repr__("simple", "") + s += f"{stat}\n" + except Exception as e: + s = str(e) + # s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s def update_display(self): @@ -110,6 +111,9 @@ class MemScreen(Screen): def mount_puzzle(self): """挂载当前谜题组件""" + if self.procession.phase == PhaserState.FINISHED: + self.mount_finished_widget() + return container = self.query_one("#puzzle-container") for i in container.children: i.remove() @@ -150,16 +154,20 @@ class MemScreen(Screen): def watch_rating(self, old_rating, new_rating) -> None: if new_rating == -1: # 安全值 return + self.update_state() + if self.procession.phase == PhaserState.FINISHED: + rating = -1 + return self.fission.report(new_rating) self.forward(new_rating) self.rating = -1 - + def forward(self, rating): self.update_state() allow_forward = 1 if rating >= 4 else 0 if allow_forward: self.fission.forward() - if self.fission.state == 'retronly': + if self.fission.state == "retronly": self.forward_atom(self.fission.get_quality()) self.update_state() self.mount_puzzle() @@ -172,15 +180,11 @@ class MemScreen(Screen): self.update_state() # 刷新状态 self.procession.forward(1) self.update_state() # 刷新状态 - if self.procession.phase == PhaserState.FINISHED: # 若所有队列都结束了 - logger.debug(f"记忆进程结束") - self.mount_finished_widget() - return self.fission = self.procession.get_fission() def action_go_back(self): self.app.pop_screen() - + def action_quick_pass(self): self.rating = 5 diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index dddad50..4f23ccb 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -11,6 +11,7 @@ from .states import FissionState, PhaserState logger = get_logger(__name__) + class Fission(Machine): """单原子调度展开器""" @@ -21,6 +22,26 @@ class Fission(Machine): self.current_puzzle_inf: dict # phase 为 PhaserState 枚举实例, 需要获取其value phase_value = phase.value + states = [ + {"name": FissionState.EXAMMODE.value}, + {"name": FissionState.RETRONLY.value}, + ] + + transitions = [ + { + "trigger": "finish", + "source": FissionState.EXAMMODE.value, + "dest": FissionState.RETRONLY.value, + }, + ] + if phase == PhaserState.FINISHED: + Machine.__init__( + self, + states=states, + transitions=transitions, + initial=FissionState.EXAMMODE.value, + ) + return orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore orbital_puzzles = atom.registry["nucleon"]["puzzles"] self.puzzles_inf = list() @@ -47,21 +68,9 @@ class Fission(Machine): } ) self.current_puzzle_inf = self.puzzles_inf[0] - states = [ - {"name": FissionState.EXAMMODE.value}, - {"name": FissionState.RETRONLY.value}, - ] - - transitions = [ - { - "trigger": "finish", - "source": FissionState.EXAMMODE.value, - "dest": FissionState.RETRONLY.value, - }, - ] for i in range(len(self.puzzles_inf)): - self.min_ratings.append(0x3f3f3f3f) + self.min_ratings.append(0x3F3F3F3F) Machine.__init__( self, @@ -71,35 +80,33 @@ class Fission(Machine): ) def get_puzzles_inf(self): - if self.state == 'retronly': - return [{"puzzle": puz.puzzles['recognition'], "alia": "Recognition"}] + if self.state == "retronly": + return [{"puzzle": puz.puzzles["recognition"], "alia": "Recognition"}] return self.puzzles_inf def get_current_puzzle_inf(self): - if self.state == 'retronly': - return {"puzzle": puz.puzzles['recognition'], "alia": "Recognition"} + if self.state == "retronly": + return {"puzzle": puz.puzzles["recognition"], "alia": "Recognition"} return self.current_puzzle_inf - + def report(self, rating): self.min_ratings[self.cursor] = min(rating, self.min_ratings[self.cursor]) - + def get_quality(self): - logger.debug(f"CState: {self.state}") if self.is_state("retronly", self): - return reduce(lambda x,y: min(x, y), self.min_ratings) + return reduce(lambda x, y: min(x, y), self.min_ratings) raise IndexError def forward(self, step=1): """将谜题指针向前移动并依情况更新或完成""" - logger.debug("Procession.forward: step=%d, 当前 cursor=%d", step, self.cursor) self.cursor += step if self.cursor >= len(self.puzzles_inf): - if self.state != 'retronly': + if self.state != "retronly": self.finish() else: self.current_puzzle_inf = self.puzzles_inf[self.cursor] - - def __repr__(self, style="pipe", ends = "\n") -> str: + + def __repr__(self, style="pipe", ends="\n") -> str: from heurams.services.textproc import truncate dic = [ @@ -108,7 +115,7 @@ class Fission(Machine): "Atom": truncate(self.atom.ident), "State": self.state, "Progress": f"{self.cursor + 1} / {len(self.puzzles_inf)}", - "Queue": list(map(lambda f: truncate(f['alia']), self.puzzles_inf)), + "Queue": list(map(lambda f: truncate(f["alia"]), self.puzzles_inf)), "Current Puzzle": f"{self.current_puzzle_inf['alia']}@{self.current_puzzle_inf['puzzle'].__name__}", # type: ignore } ] diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 83eb4d1..a903bc8 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -112,7 +112,7 @@ class Phaser(Machine): for i in self.processions: i: Procession if i.state != ProcessionState.FINISHED.value: - #if i.phase == PhaserState.UNSURE: 此判断是不必要的 因为没有这种 Procession + # if i.phase == PhaserState.UNSURE: 此判断是不必要的 因为没有这种 Procession if i.phase == PhaserState.QUICK_REVIEW: self.to_quick_review() elif i.phase == PhaserState.RECOGNITION: @@ -128,7 +128,7 @@ class Phaser(Machine): logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") return Procession([AtomPlaceholder()], PhaserState.FINISHED) - def __repr__(self, style="pipe", ends = "\n"): + def __repr__(self, style="pipe", ends="\n"): from heurams.services.textproc import truncate from tabulate import tabulate as tabu diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index ac402de..29d7fca 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -8,6 +8,7 @@ from .states import PhaserState, ProcessionState logger = get_logger(__name__) + class Procession(Machine): """队列: 标识单次记忆流程""" @@ -114,7 +115,7 @@ class Procession(Machine): def get_fission(self): return Fission(atom=self.current_atom, phase=self.phase) # type: ignore - def __repr__(self, style="pipe", ends = "\n"): + def __repr__(self, style="pipe", ends="\n"): from heurams.services.textproc import truncate dic = [ diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py index 9a25a55..ad895c9 100644 --- a/src/heurams/kernel/reactor/states.py +++ b/src/heurams/kernel/reactor/states.py @@ -12,12 +12,15 @@ class PhaserState(Enum): FINAL_REVIEW = "final_review" FINISHED = "finished" + class ProcessionState(Enum): ACTIVE = "active" FINISHED = "finished" + class FissionState(Enum): EXAMMODE = "exammode" RETRONLY = "retronly" + logger.debug("状态枚举定义已加载") From d3dadced85be367830bba2c51d9b78f2461db899 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 6 Jan 2026 20:32:27 +0800 Subject: [PATCH 18/79] =?UTF-8?q?feat(interface):=20=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=BC=8F=E8=AE=B0=E5=BF=86=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/screens/memoqueue.py | 22 ++++++++++++++++++-- src/heurams/interface/screens/preparation.py | 4 +++- src/heurams/interface/widgets/finished.py | 3 +++ src/heurams/interface/widgets/recognition.py | 10 --------- src/heurams/kernel/reactor/phaser.py | 4 ++++ src/heurams/kernel/repolib/repo.py | 4 ++-- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 148c873..9ec5a38 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,6 +1,7 @@ """队列式记忆工作界面""" from enum import Enum, auto +from typing import Callable from textual.app import ComposeResult from textual.containers import Center, ScrollableContainer @@ -42,14 +43,17 @@ class MemScreen(Screen): def __init__( self, phaser: Phaser, + save_func: Callable, name=None, id=None, classes=None, ) -> None: super().__init__(name, id, classes) self.phaser = phaser + self.save_func = save_func self.update_state() self.fission: Fission + def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -125,8 +129,9 @@ class MemScreen(Screen): for i in container.children: i.remove() from heurams.interface.widgets.finished import Finished - - container.mount(Finished()) + if config_var.get().get("persist_to_file", 0): + self.save_func() + container.mount(Finished(is_saved=config_var.get().get("persist_to_file", 0))) def on_button_pressed(self, event): event.stop() @@ -173,8 +178,21 @@ class MemScreen(Screen): self.mount_puzzle() self.update_display() + def atom_reporter(self, quality): + if not self.atom.registry["runtime"]["locked"]: + if not self.atom.registry["electron"].is_activated(): + self.atom.registry["electron"].activate() + logger.debug(f"激活原子 {self.atom}") + self.atom.lock(1) + self.atom.minimize(5) + else: + self.atom.minimize(quality) + else: + pass + def forward_atom(self, quality): logger.debug(f"Quality: {quality}") + self.atom_reporter(quality) if quality <= 3: self.procession.append() self.update_state() # 刷新状态 diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 17bd421..ee36806 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -130,8 +130,10 @@ class PreparationScreen(Screen): import heurams.kernel.reactor as rt pheser = rt.Phaser(atoms_to_provide) - memscreen = MemScreen(pheser) + save_func = self.repo.persist_to_repodir + memscreen = MemScreen(pheser, save_func) self.app.push_screen(memscreen) + elif event.button.id == "precache_button": self.action_precache() diff --git a/src/heurams/interface/widgets/finished.py b/src/heurams/interface/widgets/finished.py index 1110f6a..bb25739 100644 --- a/src/heurams/interface/widgets/finished.py +++ b/src/heurams/interface/widgets/finished.py @@ -7,6 +7,7 @@ class Finished(Widget): self, *children: Widget, alia="", + is_saved = 0, name: str | None = None, id: str | None = None, classes: str | None = None, @@ -14,6 +15,7 @@ class Finished(Widget): markup: bool = True ) -> None: self.alia = alia + self.is_saved = is_saved super().__init__( *children, name=name, @@ -25,6 +27,7 @@ class Finished(Widget): def compose(self): yield Label("本次记忆进程结束", id="finished_msg") + yield Label(f"算法数据{'已保存' if self.is_saved else "未能保存"}") yield Button("返回上一级", id="back-to-menu") def on_button_pressed(self, event): diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 5192940..233dc80 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -107,13 +107,3 @@ class Recognition(BasePuzzleWidget): if event.button.id == "ok": self.screen.rating = 5 # type: ignore self.handler(5) - - def handler(self, rating): - if not self.atom.registry["runtime"]["locked"]: - if not self.atom.registry["electron"].is_activated(): - self.atom.registry["electron"].activate() - logger.debug(f"激活原子 {self.atom}") - self.atom.lock(1) - self.atom.minimize(5) - else: - pass diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index a903bc8..9afdccd 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -16,6 +16,7 @@ class Phaser(Machine): def __init__(self, atoms: list[pt.Atom]) -> None: logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) + self.atoms = atoms new_atoms = list() old_atoms = list() @@ -105,6 +106,9 @@ class Phaser(Machine): def on_finished(self): """进入FINISHED状态时的回调""" + for i in self.atoms: + i.lock(1) + i.revise() logger.debug("Phaser 进入 FINISHED 状态") def current_procession(self): diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index d492d67..ec5cbbc 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -101,7 +101,7 @@ class Repo: source = self.source if source == None: raise FileNotFoundError("不存在仓库到文件的映射") - source.mkdir(parents=True, exist_ok=False) + source.mkdir(parents=True, exist_ok=True) for keyname in save_list: filename = self.file_mapping[keyname] with open(source / filename, "w") as f: @@ -112,7 +112,7 @@ class Repo: if filename.endswith("toml"): toml.dump(dict_data, f) elif filename.endswith("json"): - json.dump(dict_data, f) + json.dump(dict_data, f, ensure_ascii=False, indent=4) else: raise ValueError(f"不支持的文件类型: {filename}") From 6d60f95d6a199f7ef3af725caf69b4c30b6fcf5c Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 8 Jan 2026 00:05:00 +0800 Subject: [PATCH 19/79] =?UTF-8?q?feat:=20=E4=B8=80=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + data/config/config.toml | 4 +- examples/repo.ipynb | 2 +- examples/simplemem.py | 9 +- package-lock.json | 6 + requirements.txt | 5 +- src/heurams/context.py | 2 +- src/heurams/interface/__init__.py | 29 +- src/heurams/interface/css/main.tcss | 64 ++++ src/heurams/interface/screens/about.py | 9 +- src/heurams/interface/screens/dashboard.py | 28 +- src/heurams/interface/screens/favmgr.py | 204 +++++++++++ src/heurams/interface/screens/intelinote.py | 1 - src/heurams/interface/screens/llmchat.py | 333 ++++++++++++++++++ src/heurams/interface/screens/memoqueue.py | 50 ++- src/heurams/interface/screens/navigator.py | 93 +++++ src/heurams/interface/screens/precache.py | 118 ++++++- src/heurams/interface/screens/preparation.py | 13 +- src/heurams/interface/screens/radio.py | 217 ++++++++++++ src/heurams/interface/screens/repocreator.py | 2 +- src/heurams/interface/screens/repoeditor.py | 267 ++++++++++++++ src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/finished.py | 6 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/interface/widgets/recognition.py | 2 +- .../{utils => kernel/auxiliary}/__init__.py | 0 .../{utils => kernel/auxiliary}/evalizor.py | 0 .../{utils => kernel/auxiliary}/lict.py | 0 .../{utils => kernel/auxiliary}/refvar.py | 0 src/heurams/kernel/particles/__init__.py | 2 +- src/heurams/kernel/particles/atom.py | 1 - src/heurams/kernel/particles/electron.py | 8 + src/heurams/kernel/particles/nucleon.py | 4 +- src/heurams/kernel/particles/placeholders.py | 3 +- src/heurams/kernel/reactor/fission.py | 11 +- src/heurams/kernel/reactor/phaser.py | 6 +- src/heurams/kernel/reactor/procession.py | 5 +- src/heurams/kernel/repolib/repo.py | 4 +- src/heurams/providers/audio/protocol.py | 13 - src/heurams/providers/llm/__init__.py | 15 +- src/heurams/providers/llm/base.py | 52 ++- src/heurams/providers/llm/openai.py | 93 ++++- src/heurams/services/favorite_service.py | 163 +++++++++ src/heurams/services/llm_service.py | 228 ++++++++++++ 44 files changed, 1984 insertions(+), 93 deletions(-) create mode 100644 package-lock.json create mode 100644 src/heurams/interface/screens/favmgr.py delete mode 100644 src/heurams/interface/screens/intelinote.py create mode 100644 src/heurams/interface/screens/llmchat.py create mode 100644 src/heurams/interface/screens/navigator.py create mode 100644 src/heurams/interface/screens/repoeditor.py rename src/heurams/{utils => kernel/auxiliary}/__init__.py (100%) rename src/heurams/{utils => kernel/auxiliary}/evalizor.py (100%) rename src/heurams/{utils => kernel/auxiliary}/lict.py (100%) rename src/heurams/{utils => kernel/auxiliary}/refvar.py (100%) delete mode 100644 src/heurams/providers/audio/protocol.py create mode 100644 src/heurams/services/favorite_service.py create mode 100644 src/heurams/services/llm_service.py diff --git a/.gitignore b/.gitignore index ff7e71c..c863a00 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ __pycache__/ .idea/ cache/ +data/repo/cngk #nucleon/test.toml electron/test.toml *.egg-info/ diff --git a/data/config/config.toml b/data/config/config.toml index eb225ae..6479ca1 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -9,7 +9,7 @@ timestamp_override = -1 quick_pass = 1 # 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 +scheduled_num = 999 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 timezone_offset = +28800 # 中国标准时间 (UTC+8) @@ -17,7 +17,7 @@ timezone_offset = +28800 # 中国标准时间 (UTC+8) [interface] [interface.memorizor] -autovoice = true # 自动语音播放, 仅限于 recognition 组件 +autovoice = 0 # 自动语音播放, 仅限于 recognition 组件 [algorithm] default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS diff --git a/examples/repo.ipynb b/examples/repo.ipynb index ccd57ed..db08ff7 100644 --- a/examples/repo.ipynb +++ b/examples/repo.ipynb @@ -340,7 +340,7 @@ } ], "source": [ - "from heurams.utils.lict import Lict\n", + "from heurams.kernel.auxiliary.lict import Lict\n", "\n", "lct = Lict() # 空的\n", "lct = Lict(initlist=[(\"name\", \"tom\"), (\"age\", 12), (\"enemy\", \"jerry\")]) # 基于列表\n", diff --git a/examples/simplemem.py b/examples/simplemem.py index e33cbbc..55c0a9f 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -1,8 +1,9 @@ -import heurams.kernel.repolib as repolib -import heurams.kernel.particles as pt -from heurams.services.textproc import truncate -from pathlib import Path import time +from pathlib import Path + +import heurams.kernel.particles as pt +import heurams.kernel.repolib as repolib +from heurams.services.textproc import truncate repo = repolib.Repo.create_from_repodir(Path("./test_repo")) alist = list() diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..87ab9ea --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "HeurAMS", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/requirements.txt b/requirements.txt index e7e51e9..f4b26f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,9 @@ edge-tts==7.0.2 fsspec==2025.12.0 jieba==0.42.1 +openai>=1.0.0 playsound==1.2.2 tabulate==0.9.0 -textual==5.3.0 +textual==7.0.0 toml==0.10.2 -transitions==0.9.3 \ No newline at end of file +transitions==0.9.3 diff --git a/src/heurams/context.py b/src/heurams/context.py index 439640a..b9ea142 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -4,8 +4,8 @@ """ import pathlib -from contextvars import ContextVar import shutil +from contextvars import ContextVar from heurams.services.config import ConfigFile from heurams.services.logger import get_logger diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index f36099f..5142d97 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -1,4 +1,7 @@ +from typing import Type + from textual.app import App +from textual.driver import Driver from textual.widgets import Button from heurams.context import config_var @@ -6,8 +9,12 @@ from heurams.services.logger import get_logger from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen +from .screens.llmchat import LLMChatScreen +from .screens.navigator import NavigatorScreen from .screens.precache import PrecachingScreen +from .screens.radio import RadioScreen from .screens.repocreator import RepoCreatorScreen +from .screens.repoeditor import RepoEditorScreen from .screens.synctool import SyncScreen logger = get_logger(__name__) @@ -35,13 +42,10 @@ class HeurAMSApp(App): CSS_PATH = "css/main.tcss" SUB_TITLE = "启发式辅助记忆调度器" BINDINGS = [ - ("q", "quit", "退出"), - ("d", "toggle_dark", "切换色调"), - ("1", "app.push_screen('dashboard')", "仪表盘"), - ("2", "app.push_screen('precache_all')", "缓存管理器"), - ("3", "app.push_screen('repo_creator')", "创建新仓库"), - # ("4", "app.push_screen('synctool')", "同步工具"), - ("0", "app.push_screen('about')", "版本信息"), + ("q", "go_back", "退出"), + ("d", "toggle_dark", "主题"), + ("n", "app.push_screen('navigator')", "导航"), + ("z", "app.push_screen('about')", "关于"), ] SCREENS = { "dashboard": DashboardScreen, @@ -49,6 +53,10 @@ class HeurAMSApp(App): "precache_all": PrecachingScreen, "synctool": SyncScreen, "about": AboutScreen, + "navigator": NavigatorScreen, + "radio": RadioScreen, + "repo_editor": RepoEditorScreen, + "llmchat": LLMChatScreen, } def on_mount(self) -> None: @@ -56,8 +64,11 @@ class HeurAMSApp(App): self.push_screen("dashboard") def on_button_pressed(self, event: Button.Pressed) -> None: - self.exit(event.button.id) + pass + # self.exit(event.button.id) + + def action_go_back(self) -> None: + quit() def action_do_nothing(self): - print("DO NOTHING") self.refresh() diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index e69de29..f060ddd 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -0,0 +1,64 @@ +NavigatorScreen { + align: center middle; +} + +#dialog { + grid-size: 2; + grid-gutter: 1 1; + grid-rows: 1fr 3; + padding: 0 1; + width: 46; + height: 12; + border: thick $background 80%; + background: $surface; +} + +/* LLM 聊天界面样式 */ +LLMChatScreen { + background: $surface; +} + +#chat-container { + height: 100%; + padding: 1; +} + +#toolbar { + height: 3; + margin-bottom: 1; + align: center middle; +} + +#toolbar Button { + margin: 0 1; +} + +#chat-log { + height: 1fr; + border: solid $primary; + padding: 1; + background: $surface; +} + +#input-container { + height: 3; + margin-top: 1; + align: center middle; +} + +#message-input { + width: 1fr; + margin-right: 1; +} + +#status-bar { + height: 1; + margin-top: 1; + text-style: italic; + color: $text-muted; +} + +.session-label { + color: $primary; + text-style: bold; +} diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 1bf0e1e..e25cc4d 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -10,6 +10,9 @@ from heurams.context import * class AboutScreen(Screen): + BINDINGS = [ + ("q", "go_back", "返回"), + ] def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -22,10 +25,14 @@ class AboutScreen(Screen): 开发代号: {version.codename.capitalize()} {version.codename_cn} -一个基于启发式算法的开放源代码记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. +一个基于启发式算法的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. 以 AGPL-3.0 开放源代码 +您可在项目主页 https://ams.imwangzhiyu.xyz 获取用户指南, 开发文档与软件更新 + +如果您觉得这个软件有用, 请给它添加一个星标 :) + 开发人员: - Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 项目作者 diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 34f8902..0d510b9 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -1,12 +1,14 @@ """仪表盘界面""" import pathlib +from pathlib import Path from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static +import heurams.kernel.particles as pt import heurams.services.timer as timer import heurams.services.version as version from heurams.context import * @@ -14,10 +16,10 @@ from heurams.kernel.particles import * from heurams.kernel.repolib import * from heurams.services.logger import get_logger -import heurams.kernel.particles as pt -from pathlib import Path from .about import AboutScreen +from .navigator import NavigatorScreen from .preparation import PreparationScreen +from .radio import RadioScreen logger = get_logger(__name__) @@ -26,6 +28,9 @@ class DashboardScreen(Screen): """主仪表盘屏幕""" SUB_TITLE = "仪表盘" + BINDINGS = [ + ("q", "go_back", "返回"), + ] def __init__( self, @@ -50,12 +55,12 @@ class DashboardScreen(Screen): Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), Label("选择待学习或待修改的项目:", classes="title-label"), ListView(id="repo-list", classes="repo-list-view"), - Label(f'"潜进" 启发式辅助记忆调度器 | 版本 {version.ver} '), + Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} '), ) yield Footer() def _load_data(self): - self.repo_dirs = Repo.probe_vaild_repos_in_dir( + self.repo_dirs = Repo.probe_valid_repos_in_dir( Path(config_var.get()["paths"]["data"]) / "repo" ) for repo_dir in self.repo_dirs: @@ -69,7 +74,6 @@ class DashboardScreen(Screen): unit_sum = len(repo) activated_sum = 0 nextdate = 0x3F3F3F3F - is_unfinished = unit_sum > activated_sum for i in repo.ident_index: nucleon = pt.Nucleon.create_on_nucleonic_data( nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) @@ -82,10 +86,11 @@ class DashboardScreen(Screen): if electron.is_due(): is_due = 1 nextdate = min(nextdate, electron.nextdate()) + is_unfinished = unit_sum > activated_sum if is_unfinished: nextdate = min(nextdate, timer.get_daystamp()) need_to_study = is_due or is_unfinished - prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum}\n {"需要学习" if need_to_study else "无需操作"}" + prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum} ({round(activated_sum/unit_sum*100)}%)\n {"需要学习" if need_to_study else "无需操作"}" stat = { "is_due": is_due, "unit_sum": unit_sum, @@ -139,7 +144,7 @@ class DashboardScreen(Screen): return selected_label = event.item.query_one(Label) - label_text = str(selected_label.renderable) + label_text = str(selected_label.render()) if "未找到任何仓库" in label_text: return @@ -158,3 +163,12 @@ class DashboardScreen(Screen): def action_quit_app(self) -> None: """退出应用程序""" self.app.exit() + + def action_open_navigator(self) -> None: + """打开导航器""" + self.app.push_screen(NavigatorScreen()) + + def on_button_pressed(self, event: Button.Pressed) -> None: + """处理按钮点击事件""" + if event.button.id == "navigator-button": + self.action_open_navigator() diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py new file mode 100644 index 0000000..b90a957 --- /dev/null +++ b/src/heurams/interface/screens/favmgr.py @@ -0,0 +1,204 @@ +"""收藏夹管理器界面""" + +import base64 +from pathlib import Path +from typing import List, Optional + +from textual.app import ComposeResult +from textual.containers import ScrollableContainer +from textual.screen import Screen +from textual.widgets import ( + Button, + Footer, + Header, + Label, + ListItem, + ListView, + Markdown, + Static, +) + +from heurams.context import config_var +from heurams.kernel.repolib import Repo +from heurams.services.favorite_service import FavoriteItem, favorite_manager +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +class FavoriteManagerScreen(Screen): + """收藏夹管理器屏幕""" + + SUB_TITLE = "收藏夹" + + BINDINGS = [ + ("q", "go_back", "返回"), + ("d", "toggle_dark", ""), + ] + + def __init__( + self, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + self.favorites: List[FavoriteItem] = [] + self._load_favorites() + + def _load_favorites(self) -> None: + """加载收藏列表""" + self.favorites = favorite_manager.get_all() + logger.debug("加载 %d 个收藏项", len(self.favorites)) + + def compose(self) -> ComposeResult: + """组合界面组件""" + yield Header(show_clock=True) + with ScrollableContainer(id="favorites-container"): + if not self.favorites: + yield Label("暂无收藏", classes="empty-label") + yield Static("使用 * 键在记忆界面中添加收藏.") + else: + yield Label(f"共 {len(self.favorites)} 个收藏项", classes="count-label") + yield ListView(id="favorites-list") + yield Footer() + + def on_mount(self) -> None: + """挂载后填充列表""" + if self.favorites: + list_view = self.query_one("#favorites-list") + for fav in self.favorites: + list_view.append(self._create_favorite_item(fav)) # type: ignore + + def _encode_favorite_key(self, repo_path: str, ident: str) -> str: + """编码仓库路径和标识符为安全的按钮 ID 部分""" + # 使用 \x00 分隔两部分,然后进行 base64 编码 + combined = f"{repo_path}\x00{ident}" + encoded = base64.urlsafe_b64encode(combined.encode()).decode() + # 去掉填充的等号 + return encoded.rstrip("=") + + def _decode_favorite_key(self, key: str) -> tuple[str, str]: + """解码按钮 ID 部分为仓库路径和标识符""" + # 补全等号以使长度是4的倍数 + padded = key + "=" * ((4 - len(key) % 4) % 4) + decoded = base64.urlsafe_b64decode(padded.encode()).decode() + repo_path, ident = decoded.split("\x00", 1) + return repo_path, ident + + def _create_favorite_item(self, fav: FavoriteItem) -> ListItem: + """创建收藏项列表项""" + # 尝试获取仓库信息 + repo_info = self._get_repo_info(fav.repo_path, fav) + title = repo_info.get("title", fav.repo_path) if repo_info else fav.repo_path + content_preview = repo_info.get("content_preview", "") if repo_info else "" + added_time = self._format_time(fav.added) + + # 构建显示文本 + display_text = f"[b]{title}[/b] ({fav.ident})\n" + if content_preview: + display_text += f"{content_preview}\n" + display_text += f"添加于: {added_time}" + if fav.tags: + display_text += f" 标签: {', '.join(fav.tags)}" + + # 创建安全的按钮 ID + button_key = self._encode_favorite_key(fav.repo_path, fav.ident) + # 创建列表项,包含移除按钮 + container = ScrollableContainer( + Markdown(display_text, classes="favorite-content"), + Button("移除", id=f"remove-{button_key}", variant="error"), + classes="favorite-item", + ) + return ListItem(container) + + def _get_repo_info(self, repo_path: str, fav: FavoriteItem) -> Optional[dict]: + """获取仓库信息(标题、原子内容预览)""" + try: + data_repo = Path(config_var.get()["paths"]["data"]) / "repo" + repo_dir = data_repo / repo_path + if not repo_dir.exists(): + logger.warning("仓库目录不存在: %s", repo_dir) + return None + repo = Repo.create_from_repodir(repo_dir) + # 获取原子内容预览 + content_preview = "" + payload = repo.payload + # 查找对应 ident 的 payload 条目 + for ident_key, content in payload: + if ident_key == fav.ident: + # 截断过长的内容 + if isinstance(content, dict) and "content" in content: + text = content["content"] + else: + text = str(content) + if len(text) > 100: + content_preview = text[:100] + "..." + else: + content_preview = text + break + return { + "title": repo.manifest["title"], + "content_preview": content_preview, + } + except Exception as e: + logger.error("获取仓库信息失败: %s", e) + return None + + def _format_time(self, timestamp: int) -> str: + """格式化时间戳""" + from datetime import datetime + + dt = datetime.fromtimestamp(timestamp) + return dt.strftime("%Y-%m-%d %H:%M") + + def on_button_pressed(self, event: Button.Pressed) -> None: + """处理按钮点击事件""" + button_id = event.button.id + if button_id and button_id.startswith("remove-"): + # 提取编码后的键 + key = button_id[7:] # 去掉 "remove-" 前缀 + try: + repo_path, ident = self._decode_favorite_key(key) + self._remove_favorite(repo_path, ident) + except Exception as e: + logger.error("解析按钮 ID 失败: %s", e) + self.app.notify("操作失败: 无效的按钮标识", severity="error") + + def _remove_favorite(self, repo_path: str, ident: str) -> None: + """移除收藏项""" + if favorite_manager.remove(repo_path, ident): + self.app.notify(f"已移除收藏: {ident}", severity="information") + # 重新加载列表 + self._load_favorites() + # 刷新界面 + self._refresh_list() + else: + self.app.notify(f"移除失败: {ident}", severity="error") + + def _refresh_list(self) -> None: + """刷新列表显示""" + container = self.query_one("#favorites-container") + # 清空容器 + for child in container.children: + child.remove() + # 重新组合 + if not self.favorites: + container.mount(Label("暂无收藏", classes="empty-label")) + container.mount(Static("使用 * 键在记忆界面中添加收藏。")) + else: + container.mount( + Label(f"共 {len(self.favorites)} 个收藏项", classes="count-label") + ) + list_view = ListView(id="favorites-list") + container.mount(list_view) + for fav in self.favorites: + list_view.append(self._create_favorite_item(fav)) + + def action_go_back(self) -> None: + """返回上一屏幕""" + self.app.pop_screen() + + def action_toggle_dark(self) -> None: + """切换暗黑模式""" + self.app.dark = not self.app.dark # type: ignore diff --git a/src/heurams/interface/screens/intelinote.py b/src/heurams/interface/screens/intelinote.py deleted file mode 100644 index 4a489df..0000000 --- a/src/heurams/interface/screens/intelinote.py +++ /dev/null @@ -1 +0,0 @@ -"""笔记界面""" diff --git a/src/heurams/interface/screens/llmchat.py b/src/heurams/interface/screens/llmchat.py new file mode 100644 index 0000000..b444de7 --- /dev/null +++ b/src/heurams/interface/screens/llmchat.py @@ -0,0 +1,333 @@ +"""LLM 聊天界面""" + +import asyncio +from pathlib import Path +from typing import Optional + +from textual.app import ComposeResult +from textual.containers import Container, Horizontal +from textual.screen import Screen +from textual.widgets import Button, Footer, Header, Input, Label, RichLog, Static + +from heurams.context import * +from heurams.services.llm_service import ChatSession, get_chat_manager +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +class LLMChatScreen(Screen): + """LLM 聊天屏幕""" + + SUB_TITLE = "AI 聊天" + BINDINGS = [ + ("q", "go_back", "返回"), + ("ctrl+s", "save_session", "保存会话"), + ("ctrl+l", "load_session", "加载会话"), + ("ctrl+n", "new_session", "新建会话"), + ("ctrl+c", "clear_history", "清空历史"), + ("escape", "focus_input", "聚焦输入"), + ] + + def __init__( + self, + session_id: Optional[str] = None, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + self.session_id = session_id + self.chat_manager = get_chat_manager() + self.current_session: Optional[ChatSession] = None + self.is_streaming = False + + def compose(self) -> ComposeResult: + """组合界面组件""" + yield Header(show_clock=True) + + with Container(id="chat-container"): + # 顶部工具栏 + with Horizontal(id="toolbar"): + yield Button("新建会话", id="new-session", variant="primary") + yield Button("保存会话", id="save-session", variant="default") + yield Button("加载会话", id="load-session", variant="default") + yield Button("清空历史", id="clear-history", variant="default") + yield Button("设置系统提示", id="set-system-prompt", variant="default") + yield Static(" | ", classes="separator") + yield Label("当前会话:", classes="label") + yield Static(id="current-session-label", classes="session-label") + + # 聊天记录显示区域 + yield RichLog( + id="chat-log", + wrap=True, + highlight=True, + markup=True, + classes="chat-log", + ) + + # 输入区域 + with Horizontal(id="input-container"): + yield Input( + id="message-input", + placeholder="输入消息... (按 Ctrl+Enter 发送, Esc 聚焦)", + classes="message-input", + ) + yield Button( + "发送", id="send-button", variant="primary", classes="send-button" + ) + + # 状态栏 + yield Static(id="status-bar", classes="status-bar") + + yield Footer() + + def on_mount(self) -> None: + """挂载组件时初始化""" + # 获取或创建会话 + self.current_session = self.chat_manager.get_session(self.session_id) + if self.current_session is None: + self.notify("无法创建 LLM 会话,请检查配置", severity="error") + return + + # 更新会话标签 + self.query_one("#current-session-label", Static).update( + f"{self.current_session.session_id}" + ) + + # 加载历史消息到聊天记录 + self._display_history() + + # 聚焦输入框 + self.query_one("#message-input", Input).focus() + + # 检查配置 + self._check_config() + + def _check_config(self): + """检查 LLM 配置""" + config = config_var.get() + provider_name = config["services"]["llm"] + provider_config = config["providers"]["llm"][provider_name] + + if provider_name == "openai": + if not provider_config.get("key") and not provider_config.get("url"): + self.notify( + "未配置 OpenAI API key 或 URL,请在 config.toml 中配置 [providers.llm.openai]", + severity="warning", + ) + + def _display_history(self): + """显示当前会话的历史消息""" + if not self.current_session: + return + + chat_log = self.query_one("#chat-log", RichLog) + chat_log.clear() + + for msg in self.current_session.get_history(): + role = msg["role"] + content = msg["content"] + + if role == "user": + chat_log.write(f"[bold cyan]你:[/bold cyan] {content}") + elif role == "assistant": + chat_log.write(f"[bold green]AI:[/bold green] {content}") + elif role == "system": + # 系统消息不显示在聊天记录中 + pass + + def _add_message_to_log(self, role: str, content: str): + """添加消息到聊天记录显示""" + chat_log = self.query_one("#chat-log", RichLog) + if role == "user": + chat_log.write(f"[bold cyan]你:[/bold cyan] {content}") + elif role == "assistant": + chat_log.write(f"[bold green]AI:[/bold green] {content}") + chat_log.scroll_end() + + async def on_input_submitted(self, event: Input.Submitted): + """处理输入提交""" + if event.input.id == "message-input": + await self._send_message() + + async def on_button_pressed(self, event: Button.Pressed): + """处理按钮点击""" + button_id = event.button.id + + if button_id == "send-button": + await self._send_message() + elif button_id == "new-session": + self.action_new_session() + elif button_id == "save-session": + self.action_save_session() + elif button_id == "load-session": + self.action_load_session() + elif button_id == "clear-history": + self.action_clear_history() + elif button_id == "set-system-prompt": + self.action_set_system_prompt() + + async def _send_message(self): + """发送当前输入的消息""" + if not self.current_session or self.is_streaming: + return + + input_widget = self.query_one("#message-input", Input) + message = input_widget.value.strip() + + if not message: + return + + # 清空输入框 + input_widget.value = "" + + # 显示用户消息 + self._add_message_to_log("user", message) + + # 禁用输入和按钮 + self._set_input_state(disabled=True) + self.is_streaming = True + + # 更新状态 + self.query_one("#status-bar", Static).update("AI 正在思考...") + + try: + # 发送消息并获取响应 + response = await self.current_session.send_message(message) + + # 显示AI响应 + self._add_message_to_log("assistant", response) + + except Exception as e: + error_msg = f"请求失败: {str(e)}" + logger.error(error_msg) + self._add_message_to_log("assistant", f"[red]{error_msg}[/red]") + self.notify(error_msg, severity="error") + + finally: + # 恢复输入和按钮 + self._set_input_state(disabled=False) + self.is_streaming = False + self.query_one("#status-bar", Static).update("就绪") + input_widget.focus() + + def _set_input_state(self, disabled: bool): + """设置输入控件状态""" + self.query_one("#message-input", Input).disabled = disabled + self.query_one("#send-button", Button).disabled = disabled + + async def action_save_session(self): + """保存当前会话到文件""" + if not self.current_session: + self.notify("无当前会话", severity="error") + return + + # 默认保存到 data/chat_sessions/ 目录 + save_dir = Path(config_var.get()["paths"]["data"]) / "chat_sessions" + save_dir.mkdir(exist_ok=True, parents=True) + + file_path = save_dir / f"{self.current_session.session_id}.json" + self.current_session.save_to_file(file_path) + + self.notify(f"会话已保存到 {file_path}", severity="information") + + async def action_load_session(self): + """从文件加载会话""" + # 简化实现:加载默认目录下的第一个会话文件 + save_dir = Path(config_var.get()["paths"]["data"]) / "chat_sessions" + if not save_dir.exists(): + self.notify(f"目录不存在: {save_dir}", severity="error") + return + + session_files = list(save_dir.glob("*.json")) + if not session_files: + self.notify("未找到会话文件", severity="error") + return + + # 使用第一个文件(在实际应用中可以让用户选择) + file_path = session_files[0] + + try: + # 获取 LLM 提供者 + provider_name = config_var.get()["services"]["llm"] + provider_config = config_var.get()["providers"]["llm"][provider_name] + from heurams.providers.llm import providers as prov + + llm_provider = prov[provider_name](provider_config) + + # 加载会话 + self.current_session = ChatSession.load_from_file(file_path, llm_provider) + + # 更新聊天管理器 + self.chat_manager.sessions[self.current_session.session_id] = ( + self.current_session + ) + + # 更新UI + self.query_one("#current-session-label", Static).update( + f"{self.current_session.session_id}" + ) + self._display_history() + + self.notify(f"已加载会话: {file_path.name}", severity="information") + + except Exception as e: + logger.error("加载会话失败: %s", e) + self.notify(f"加载失败: {str(e)}", severity="error") + + async def action_new_session(self): + """创建新会话""" + # 简单实现:使用时间戳作为会话ID + import time + + new_session_id = f"session_{int(time.time())}" + + self.current_session = self.chat_manager.get_session(new_session_id) + + # 更新UI + self.query_one("#current-session-label", Static).update( + f"{self.current_session.session_id}" + ) + self._display_history() + + self.notify(f"已创建新会话: {new_session_id}", severity="information") + self.query_one("#message-input", Input).focus() + + async def action_clear_history(self): + """清空当前会话历史""" + if not self.current_session: + return + + self.current_session.clear_history() + self._display_history() + self.notify("历史已清空", severity="information") + + async def action_set_system_prompt(self): + """设置系统提示词""" + if not self.current_session: + return + + # 使用输入框获取新提示词 + input_widget = self.query_one("#message-input", Input) + current_value = input_widget.value + + # 临时修改输入框提示 + input_widget.placeholder = "输入系统提示词... (按 Enter 确认, Esc 取消)" + input_widget.value = self.current_session.system_prompt + + # 等待用户输入 + self.notify("请输入系统提示词,按 Enter 确认", severity="information") + + # 实际应用中需要更复杂的交互,这里简化处理 + # 用户手动输入后按 Enter 会触发 on_input_submitted + # 这里我们只修改占位符,实际系统提示词设置需要额外界面 + + def action_focus_input(self): + """聚焦到输入框""" + self.query_one("#message-input", Input).focus() + + def action_go_back(self): + """返回上级屏幕""" + self.app.pop_screen() diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 9ec5a38..a880d89 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,6 +1,7 @@ """队列式记忆工作界面""" from enum import Enum, auto +from pathlib import Path from typing import Callable from textual.app import ComposeResult @@ -9,10 +10,11 @@ from textual.reactive import reactive from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static -import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt +import heurams.kernel.puzzles as pz from heurams.context import config_var from heurams.kernel.reactor import * +from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger from .. import shim @@ -32,6 +34,7 @@ class MemScreen(Screen): ("p", "prev", "查看上一个"), ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), + ("*", "toggle_favorite", "收藏"), ("0,1,2,3", "app.push_screen('about')", ""), ] @@ -44,6 +47,7 @@ class MemScreen(Screen): self, phaser: Phaser, save_func: Callable, + repo=None, name=None, id=None, classes=None, @@ -51,9 +55,9 @@ class MemScreen(Screen): super().__init__(name, id, classes) self.phaser = phaser self.save_func = save_func + self.repo = repo self.update_state() self.fission: Fission - def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -84,6 +88,10 @@ class MemScreen(Screen): def _get_progress_text(self): s = f"阶段: {self.procession.phase.name}\n" + # 收藏状态 + if self.repo is not None: + fav_status = "★" if self._is_current_atom_favorited() else "☆" + s += f"收藏: {fav_status}\n" if config_var.get().get("debug_topline", 0): try: alia = self.fission.get_current_puzzle_inf()["alia"] # type: ignore @@ -129,6 +137,7 @@ class MemScreen(Screen): for i in container.children: i.remove() from heurams.interface.widgets.finished import Finished + if config_var.get().get("persist_to_file", 0): self.save_func() container.mount(Finished(is_saved=config_var.get().get("persist_to_file", 0))) @@ -208,3 +217,40 @@ class MemScreen(Screen): def action_quick_fail(self): self.rating = 3 + + def _get_repo_rel_path(self) -> str: + """获取仓库相对路径(相对于 data/repo)""" + if self.repo is None: + return "" + # self.repo.source 是 Path 对象,指向仓库目录 + repo_full_path = self.repo.source + data_repo_path = Path(config_var.get()["paths"]["data"]) / "repo" + try: + rel_path = repo_full_path.relative_to(data_repo_path) + return str(rel_path) + except ValueError: + # 如果不在 data/repo 下,则返回完整路径(字符串形式) + return str(repo_full_path) + + def _is_current_atom_favorited(self) -> bool: + """检查当前原子是否已收藏""" + if self.repo is None: + return False + repo_path = self._get_repo_rel_path() + return favorite_manager.has(repo_path, self.atom.ident) + + def action_toggle_favorite(self): + """切换收藏状态""" + if self.repo is None: + self.app.notify("无法收藏:未关联仓库", severity="error") + return + repo_path = self._get_repo_rel_path() + ident = self.atom.ident + if favorite_manager.has(repo_path, ident): + favorite_manager.remove(repo_path, ident) + self.app.notify(f"已取消收藏:{ident}", severity="information") + else: + favorite_manager.add(repo_path, ident) + self.app.notify(f"已收藏:{ident}", severity="information") + # 更新显示(如果需要) + self.update_display() diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py new file mode 100644 index 0000000..4739a1a --- /dev/null +++ b/src/heurams/interface/screens/navigator.py @@ -0,0 +1,93 @@ +import webbrowser + +from textual.app import ComposeResult +from textual.containers import Grid, ScrollableContainer +from textual.screen import ModalScreen +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static + +from heurams.context import * +from heurams.services.logger import get_logger + +from .favmgr import FavoriteManagerScreen + +logger = get_logger(__name__) + + +class NavigatorScreen(ModalScreen): + """导航器模态窗口""" + + BINDINGS = [ + ("q", "go_back", "返回"), + ("escape", "go_back", "返回"), + ("n", "go_back", "切换"), + ] + + SCREENS = [ + ("仪表盘", "dashboard"), + ("电台", "radio"), + ("语言模型集成", "llmchat"), + # ("创建仓库", "repo_creator"), + ("缓存管理器", "precache_all"), + ("收藏夹管理器", FavoriteManagerScreen), + ("关于此软件", "about"), + ("调试日志", "logviewer"), + # ("同步工具", "synctool"), + # ("仓库编辑器", "repo_editor"), + ] + + OTHERS = [ + ("退出程序", "self.app.exit()"), + ("项目主页", "webbrowser.open('https://ams.imwangzhiyu.xyz')"), + ] + + def compose(self) -> ComposeResult: + """组合界面组件""" + with Grid(id="dialog"): + yield Label( + "[b]请选择要跳转的功能\n或记忆会话实例[/b]\n\n将在此处显示提示", + classes="title-label", + ) + yield ListView( + *[ListItem(Label(title)) for title, _ in (self.SCREENS + self.OTHERS)], + id="nav-list", + classes="nav-list-view", + ) + yield Static("按下回车以完成切换\n所有会话将被保存") + yield Button( + "关闭 (n)", id="close_button", variant="primary", classes="close-button", flat=True + ) + + def on_mount(self) -> None: + # 设置焦点到列表 + nav_list = self.query_one("#nav-list", ListView) + nav_list.focus() + + def on_list_view_selected(self, event) -> None: + if not isinstance(event.item, ListItem): + return + selected_label = event.item.query_one(Label) + label_text = str(selected_label.render()) + # 查找对应的屏幕标识 + for title, screen_id in self.SCREENS: + if title == label_text: + self.app.pop_screen() + # 跳转到目标屏幕 + if isinstance(screen_id, str): + # 已注册的字符串标识符 + self.app.push_screen(screen_id) + else: + self.app.push_screen(screen_id()) + return + for title, cmd in self.OTHERS: + if title == label_text: + exec(cmd) + return + return + + def on_button_pressed(self, event) -> None: + event.stop() + if event.button.id == "close_button": + self.action_go_back() + + def action_go_back(self) -> None: + self.app.pop_screen() diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 0bb54d5..300690b 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -3,7 +3,7 @@ import pathlib from textual.app import ComposeResult -from textual.containers import Horizontal, ScrollableContainer +from textual.containers import Horizontal, ScrollableContainer, Container from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ProgressBar, Static from textual.worker import get_current_worker @@ -12,7 +12,18 @@ import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * -cache_dir = pathlib.Path(config_var.get()["paths"]["data"]) / "cache" / "voice" +# 兼容性缓存路径:优先使用 paths.cache,否则使用 data/cache +paths = config_var.get()["paths"] +cache_dir = pathlib.Path(paths.get("cache", paths["data"] + "/cache")) / "voice" + + +def format_size(bytes_num: int) -> str: + """将字节数格式化为人类可读的字符串""" + for unit in ['B', 'KB', 'MB', 'GB', 'TB']: + if bytes_num < 1024.0: + return f"{bytes_num:.2f} {unit}" + bytes_num /= 1024.0 # type: ignore + return f"{bytes_num:.2f} PB" class PrecachingScreen(Screen): @@ -26,7 +37,9 @@ class PrecachingScreen(Screen): """ SUB_TITLE = "缓存管理器" - BINDINGS = [("q", "go_back", "返回")] + BINDINGS = [ + ("q", "go_back", "返回"), + ] def __init__(self, nucleons: list = [], desc: str = ""): super().__init__(name=None, id=None, classes=None) @@ -40,21 +53,70 @@ class PrecachingScreen(Screen): self.precache_worker = None self.cancel_flag = 0 self.desc = desc + # 不再需要缓存配置,保留配置读取以兼容 + self.cache_stats = {"total_size": 0, "file_count": 0, "human_size": "0 B", "cached_units": 0, "total_units": 0, "cache_rate": 0} + self._update_cache_stats() + + def _get_total_units(self) -> int: + """获取所有仓库的总单元数""" + from heurams.context import config_var + from heurams.kernel.repolib import Repo + repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / "repo" + repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) + repos = map(Repo.create_from_repodir, repo_dirs) + total = 0 + for repo in repos: + try: + total += len(repo.ident_index) + except: + continue + return total + + def _update_cache_stats(self) -> None: + """更新缓存统计信息""" + total_size = 0 + file_count = 0 + cached_units = 0 + if cache_dir.exists(): + for file in cache_dir.rglob("*"): + if file.is_file(): + total_size += file.stat().st_size + file_count += 1 + if file.suffix.lower() == ".wav": + cached_units += 1 + total_units = self._get_total_units() + cache_rate = (cached_units / total_units * 100) if total_units > 0 else 0 + + self.cache_stats["total_size"] = total_size + self.cache_stats["file_count"] = file_count + self.cache_stats["human_size"] = format_size(total_size) + self.cache_stats["cached_units"] = cached_units + self.cache_stats["total_units"] = total_units + self.cache_stats["cache_rate"] = cache_rate def compose(self) -> ComposeResult: yield Header(show_clock=True) with ScrollableContainer(id="precache_container"): yield Label("[b]音频预缓存[/b]", classes="title-label") + with Container(classes="cache-info"): + yield Static(f"缓存路径: {cache_dir}", classes="cache-path") + yield Static(f"文件数: {self.cache_stats['file_count']}", classes="cache-count") + yield Static(f"总大小: {self.cache_stats['human_size']}", classes="cache-size") + yield Button("刷新", id="refresh_cache_stats", variant="default") + with Container(): + yield Static( + f"缓存率: {self.cache_stats.get('cache_rate', 0):.1f}% (已缓存 {self.cache_stats.get('cached_units', 0)} / {self.cache_stats.get('total_units', 0)} 个单元)", + classes="cache-usage-text" + ) + if self.nucleons: + yield Static(f"目标单元归属: [b]{self.desc}[/b]", classes="target-info") + yield Static(f"单元数量: {len(self.nucleons)}", classes="target-info") + else: + yield Static("目标: 所有单元", classes="target-info") - if self.nucleons: - yield Static(f"目标单元归属: [b]{self.desc}[/b]", classes="target-info") - yield Static(f"单元数量: {len(self.nucleons)}", classes="target-info") - else: - yield Static("目标: 所有单元", classes="target-info") - - yield Static(id="status", classes="status-info") - yield Static(id="current_item", classes="current-item") - yield ProgressBar(total=100, show_eta=False, id="progress_bar") + yield Static(id="status", classes="status-info") + yield Static(id="current_item", classes="current-item") + yield ProgressBar(total=100, show_eta=False, id="progress_bar") with Horizontal(classes="button-group"): if not self.is_precaching: @@ -72,6 +134,7 @@ class PrecachingScreen(Screen): def on_mount(self): """挂载时初始化状态""" self.update_status("就绪", "等待开始...") + self._update_cache_display() def update_status(self, status, current_item="", progress=None): """更新状态显示""" @@ -86,6 +149,25 @@ class PrecachingScreen(Screen): progress_bar.progress = progress progress_bar.advance(0) # 刷新显示 + def _update_cache_display(self) -> None: + """更新缓存信息显示""" + # 更新统计信息 + self._update_cache_stats() + # 更新缓存率进度条 + # 更新缓存大小和文件数显示 + cache_count_widget = self.query_one(".cache-count", Static) + cache_size_widget = self.query_one(".cache-size", Static) + cache_usage_text = self.query_one(".cache-usage-text", Static) + if cache_count_widget: + cache_count_widget.update(f"文件数: {self.cache_stats['file_count']}") + if cache_size_widget: + cache_size_widget.update(f"总大小: {self.cache_stats['human_size']}") + if cache_usage_text: + cache_usage_text.update( + f"缓存率: {self.cache_stats.get('cache_rate', 0):.1f}% " + f"(已缓存 {self.cache_stats.get('cached_units', 0)} / {self.cache_stats.get('total_units', 0)} 个单元)" + ) + def precache_by_text(self, text: str): """预缓存单段文本的音频""" from heurams.context import config_var, rootdir, workdir @@ -151,7 +233,7 @@ class PrecachingScreen(Screen): from heurams.kernel.repolib import Repo repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / "repo" - repo_dirs = Repo.probe_vaild_repos_in_dir(repo_path) + repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) repos = map(Repo.create_from_repodir, repo_dirs) # 计算总项目数 @@ -207,12 +289,17 @@ class PrecachingScreen(Screen): shutil.rmtree(cache_dir, ignore_errors=True) self.update_status("已清空", "音频缓存已清空", 0) + self._update_cache_display() # 更新缓存统计显示 except Exception as e: self.update_status("错误", f"清空缓存失败: {e}") self.cancel_flag = 1 self.processed = 0 self.progress = 0 + elif event.button.id == "refresh_cache_stats": + # 刷新缓存统计信息 + self._update_cache_display() + self.app.notify("缓存信息已刷新", severity="information") elif event.button.id == "go_back": self.action_go_back() @@ -220,8 +307,3 @@ class PrecachingScreen(Screen): if self.is_precaching and self.precache_worker: self.precache_worker.cancel() self.app.pop_screen() - - def action_quit_app(self): - if self.is_precaching and self.precache_worker: - self.precache_worker.cancel() - self.app.exit() diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index ee36806..79acb11 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -11,8 +11,8 @@ import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * from heurams.context import config_var -from heurams.services.logger import get_logger from heurams.kernel.repolib import * +from heurams.services.logger import get_logger logger = get_logger(__name__) @@ -59,7 +59,8 @@ class PreparationScreen(Screen): ) yield Static(f"\n单元预览:\n") - yield Markdown(self._get_full_content().replace("/", ""), classes="full") + for i in self._get_full_content().replace("/", "").splitlines(): + yield Static(i, classes="full") yield Footer() # def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num): @@ -76,7 +77,7 @@ class PreparationScreen(Screen): n = pt.Nucleon.create_on_nucleonic_data( nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) ) - content += f"- {n['content']} \n" + content += f" • {n['content']} \n" return content def action_go_back(self): @@ -126,14 +127,14 @@ class PreparationScreen(Screen): left_new -= 1 if left_new >= 0: atoms_to_provide.append(i) - from .memoqueue import MemScreen import heurams.kernel.reactor as rt + from .memoqueue import MemScreen + pheser = rt.Phaser(atoms_to_provide) save_func = self.repo.persist_to_repodir - memscreen = MemScreen(pheser, save_func) + memscreen = MemScreen(pheser, save_func, repo=self.repo) self.app.push_screen(memscreen) - elif event.button.id == "precache_button": self.action_precache() diff --git a/src/heurams/interface/screens/radio.py b/src/heurams/interface/screens/radio.py index dd05b12..000fb2a 100644 --- a/src/heurams/interface/screens/radio.py +++ b/src/heurams/interface/screens/radio.py @@ -1 +1,218 @@ +"""用于筛选当日记忆的条目 以音频形式重放""" + """ "前进电台" 界面""" +import os +from pathlib import Path +from typing import List, Optional + +from matplotlib.cbook import ls_mapper +from textual.app import ComposeResult +from textual.containers import Container, ScrollableContainer +from textual.reactive import reactive +from textual.screen import Screen +from textual.widgets import Button, Footer, Header, Label, Static + +import heurams.kernel.particles as pt +from heurams.kernel.repolib import Repo +from heurams.context import config_var +from heurams.services.audio_service import play_by_path +from heurams.services.hasher import get_md5 +from heurams.services.logger import get_logger +from heurams.services.tts_service import convertor + +logger = get_logger(__name__) + + +class RadioScreen(Screen): + SUB_TITLE = "电台" + + BINDINGS = [ + ("q", "go_back", "返回"), + ("space", "toggle_play", "播放/暂停"), + ] + + # 当前播放的原子索引 + current_index = reactive(0) + # 播放状态: 'stopped', 'playing', 'paused' + play_state = reactive("stopped") + + def __init__( + self, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + self._organizer() + + def _organizer(self): + repodirs = Repo.probe_valid_repos_in_dir(Path(config_var.get()['paths']['data']) / 'repo') + repos = list(map(lambda repodir: Repo.create_from_repodir(repodir), repodirs)) + for repo in repos: + last_modify = 0.0 + for i in repo.ident_index: + e = pt.Electron.create_on_electonic_data( + electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + ) + last_modify = max(last_modify, e.las()) + + + def compose(self) -> ComposeResult: + yield Header(show_clock=True) + with Container(id="main"): + yield Label("[b]前进电台[/b]", classes="title") + yield Static(f"共 {len(self.atoms)} 条当日记忆", id="status") + with Container(id="controls"): + yield Button("播放", id="play", variant="success") + yield Button("暂停", id="pause", variant="primary") + yield Button("上一首", id="prev", variant="default") + yield Button("下一首", id="next", variant="default") + yield Button("停止", id="stop", variant="error") + yield ScrollableContainer(id="playlist") + yield Footer() + + def on_mount(self) -> None: + """挂载后更新播放列表显示""" + self._update_playlist() + + def _filter_due_atoms(self) -> List[pt.Atom]: + """筛选当日需要复习的原子(已激活且到期)""" + atoms = [] + for ident in self.repo.ident_index: + n = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(ident) + ) + e = pt.Electron.create_on_electonic_data( + electronic_data=self.repo.electronic_data_lict.get_itemic_unit(ident) + ) + a = pt.Atom(n, e, self.repo.orbitic_data) + # 仅选择已激活且到期的原子 + if ( + a.registry["electron"].is_activated() + and a.registry["electron"].is_due() + ): + atoms.append(a) + return atoms + + def _update_playlist(self) -> None: + """更新播放列表显示""" + container = self.query_one("#playlist") + container.remove_children() + for idx, atom in enumerate(self.atoms): + content = atom.registry["nucleon"].get("content", "无内容") + prefix = "▶ " if idx == self.current_index else " " + widget = Static(f"{prefix}{idx+1}. {content[:50]}...") + widget.set_class(idx == self.current_index, "current") + container.mount(widget) + + def _get_audio_path(self, atom: pt.Atom) -> Path: + """返回音频文件路径,若不存在则生成""" + tts_text = atom.registry["nucleon"].get("tts_text", "") + if not tts_text: + tts_text = atom.registry["nucleon"].get("content", "") + voice_dir = Path(config_var.get()["paths"]["data"]) / "cache" / "voice" + voice_dir.mkdir(parents=True, exist_ok=True) + path = voice_dir / f"{get_md5(tts_text)}.wav" + if not path.exists(): + convertor(tts_text, path) + return path + + async def _play_atom(self, idx: int) -> None: + """播放指定索引的原子(异步)""" + if idx < 0 or idx >= len(self.atoms): + return + atom = self.atoms[idx] + try: + path = self._get_audio_path(atom) + self._current_path = path + # 在后台线程中播放,避免阻塞UI + await self.run_worker( + lambda: play_by_path(path), exclusive=True, thread=True + ) + except Exception as e: + logger.error("播放失败: %s", e) + + def _stop_playback(self) -> None: + """停止当前播放""" + if self._play_task and not self._play_task.done(): + self._play_task.cancel() + self._play_task = None + self._current_path = None + self.play_state = "stopped" + + async def _play_current(self) -> None: + """播放当前索引的原子""" + self._stop_playback() + self.play_state = "playing" + self._play_task = asyncio.create_task(self._play_atom(self.current_index)) + try: + await self._play_task + except asyncio.CancelledError: + pass + finally: + if self.play_state == "playing": + self.play_state = "stopped" + + # 按钮事件处理 + def on_button_pressed(self, event: Button.Pressed) -> None: + button_id = event.button.id + if button_id == "play": + self.action_toggle_play() + elif button_id == "pause": + self.action_pause() + elif button_id == "prev": + self.action_prev() + elif button_id == "next": + self.action_next() + elif button_id == "stop": + self.action_stop() + + # 键盘动作 + def action_toggle_play(self) -> None: + if self.play_state == "playing": + self.action_pause() + else: + self.action_play() + + def action_play(self) -> None: + if self.play_state != "playing": + if self.play_state == "paused": + # 恢复播放(目前暂停功能简单实现为停止) + self.play_state = "playing" + else: + asyncio.create_task(self._play_current()) + + def action_pause(self) -> None: + if self.play_state == "playing": + self._stop_playback() + self.play_state = "paused" + + def action_stop(self) -> None: + self._stop_playback() + self.play_state = "stopped" + + def action_next(self) -> None: + if self.current_index < len(self.atoms) - 1: + self.current_index += 1 + self._update_playlist() + if self.play_state == "playing": + asyncio.create_task(self._play_current()) + + def action_prev(self) -> None: + if self.current_index > 0: + self.current_index -= 1 + self._update_playlist() + if self.play_state == "playing": + asyncio.create_task(self._play_current()) + + def action_go_back(self) -> None: + self._stop_playback() + self.app.pop_screen() + + # 响应式更新 + def watch_current_index(self, old: int, new: int) -> None: + self._update_playlist() + + def watch_play_state(self, old: str, new: str) -> None: + # 更新按钮状态(可在此添加样式变化) + pass diff --git a/src/heurams/interface/screens/repocreator.py b/src/heurams/interface/screens/repocreator.py index 6b2e916..d60a9ec 100644 --- a/src/heurams/interface/screens/repocreator.py +++ b/src/heurams/interface/screens/repocreator.py @@ -24,7 +24,7 @@ class RepoCreatorScreen(Screen): from heurams.context import config_var - template_dir = Path(config_var.get()["paths"]["template_dir"]) + template_dir = Path(config_var.get()["paths"]["data"]) / "templates" templates = list() for i in template_dir.iterdir(): if i.name.endswith(".toml"): diff --git a/src/heurams/interface/screens/repoeditor.py b/src/heurams/interface/screens/repoeditor.py new file mode 100644 index 0000000..ec3f92c --- /dev/null +++ b/src/heurams/interface/screens/repoeditor.py @@ -0,0 +1,267 @@ +"""仓库编辑器, 使用TextArea控件等实现仓库配置编辑""" + +import json +from pathlib import Path +from typing import Optional + +import toml +from textual.app import ComposeResult +from textual.containers import Container, Horizontal, ScrollableContainer, Vertical +from textual.reactive import reactive +from textual.screen import Screen +from textual.widgets import ( + Button, + Footer, + Header, + Label, + ListItem, + ListView, + Static, + TextArea, +) + +from heurams.context import config_var +from heurams.kernel.repolib import Repo +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +class RepoEditorScreen(Screen): + """仓库编辑器屏幕""" + + SUB_TITLE = "仓库编辑器" + + BINDINGS = [ + ("q", "go_back", "返回"), + ("s", "save_file", "保存"), + ("r", "reload_file", "重载"), + ("d", "toggle_dark", ""), + ] + + # 当前选择的仓库路径 + selected_repo_path: reactive[Optional[Path]] = reactive(None) + # 当前选择的文件名 + selected_filename: reactive[Optional[str]] = reactive(None) + # 文件内容 + file_content: reactive[str] = reactive("") + + def __init__( + self, + repo: Optional[Repo] = None, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + self.repo = repo + self.repo_dir: Optional[Path] = None + self.file_list = [] + if repo is not None and repo.source is not None: + self.repo_dir = repo.source + self._load_file_list() + # selected_repo_path 将在 on_mount 中设置,避免触发watch时组件未就绪 + + def _load_file_list(self) -> None: + """加载仓库目录下的文件列表""" + if self.repo_dir is None: + return + self.file_list = [] + for fname in Repo.file_mapping.values(): + fpath = self.repo_dir / fname + if fpath.exists(): + self.file_list.append(fname) + # 也可能存在其他文件,但暂时只支持标准文件 + self.file_list.sort() + + def compose(self) -> ComposeResult: + """组合界面组件""" + yield Header(show_clock=True) + with Container(id="main_container"): + with Horizontal(id="top_panel"): + # 左侧: 仓库选择 + with Vertical(id="repo_selector", classes="panel"): + yield Label("仓库列表", classes="panel-title") + yield ListView( + *[ + ListItem(Label(repo_dir.name)) + for repo_dir in self._get_repo_dirs() + ], + id="repo_list", + classes="list-view", + ) + # 中间: 文件列表 + with Vertical(id="file_selector", classes="panel"): + yield Label("文件列表", classes="panel-title") + yield ListView( + *[ListItem(Label(fname)) for fname in self.file_list], + id="file_list", + classes="list-view", + ) + # 右侧: 编辑区域 + with Vertical(id="editor_panel", classes="panel"): + yield Label("编辑文件", classes="panel-title") + yield TextArea( + id="text_editor", + language="plaintext", + classes="text-editor", + ) + with Horizontal(id="button_bar"): + yield Button("保存", id="save_button", variant="primary") + yield Button("重载", id="reload_button", variant="default") + yield Button("返回", id="back_button", variant="error") + yield Footer() + + def _get_repo_dirs(self) -> list[Path]: + """获取data/repo/下所有有效仓库目录""" + repo_root = Path(config_var.get()["paths"]["data"]) / "repo" + repo_dirs = [] + if repo_root.exists(): + for entry in repo_root.iterdir(): + if entry.is_dir(): + # 检查是否存在 manifest.toml + if (entry / "manifest.toml").exists(): + repo_dirs.append(entry) + return repo_dirs + + def on_mount(self) -> None: + """挂载组件时初始化""" + # 如果已有仓库,设置 selected_repo_path 以触发watch(此时组件已就绪) + if self.repo_dir is not None: + self.selected_repo_path = self.repo_dir + # 焦点放在仓库列表 + self.query_one("#repo_list", ListView).focus() + + def watch_selected_repo_path( + self, old_path: Optional[Path], new_path: Optional[Path] + ) -> None: + """当选择的仓库路径变化时,加载文件列表""" + if new_path is None: + self.file_list = [] + self.selected_filename = None + self.file_content = "" + return + self.repo_dir = new_path + self._load_file_list() + # 如果组件已挂载,更新UI + if self.is_mounted: + file_list_view = self.query_one("#file_list", ListView) + file_list_view.clear() + for fname in self.file_list: + file_list_view.append(ListItem(Label(fname))) + # 清空编辑器 + self.query_one("#text_editor", TextArea).text = "" + self.selected_filename = None + + def watch_selected_filename( + self, old_name: Optional[str], new_name: Optional[str] + ) -> None: + """当选择的文件名变化时,加载文件内容""" + if new_name is None or self.repo_dir is None: + self.file_content = "" + return + file_path = self.repo_dir / new_name + if not file_path.exists(): + self.notify(f"文件不存在: {new_name}", severity="error") + return + try: + content = file_path.read_text(encoding="utf-8") + self.file_content = content + # 如果组件已挂载,更新编辑器 + if self.is_mounted: + editor = self.query_one("#text_editor", TextArea) + editor.text = content + # 根据文件后缀设置语言 + if new_name.endswith(".toml"): + editor.language = "toml" + elif new_name.endswith(".json"): + editor.language = "json" + else: + editor.language = "plaintext" + except Exception as e: + logger.error(f"读取文件失败: {e}") + self.notify(f"读取文件失败: {e}", severity="error") + + def watch_file_content(self, old_content: str, new_content: str) -> None: + """当文件内容变化时更新编辑器(仅当外部改变时)""" + # 目前不需要做任何事情,因为编辑器内容已绑定 + pass + + def on_list_view_selected(self, event) -> None: + """处理列表项选择事件""" + if not isinstance(event.item, ListItem): + return + list_id = event.list_view.id + selected_label = event.item.query_one(Label) + selected_text = str(selected_label.render()) + + if list_id == "repo_list": + # 用户选择了仓库 + repo_root = Path(config_var.get()["paths"]["data"]) / "repo" + selected_dir = repo_root / selected_text + if selected_dir.exists(): + self.selected_repo_path = selected_dir + elif list_id == "file_list": + # 用户选择了文件 + if self.repo_dir is None: + self.notify("请先选择仓库", severity="warning") + return + self.selected_filename = selected_text + + def on_button_pressed(self, event) -> None: + """处理按钮点击事件""" + event.stop() + if event.button.id == "save_button": + self.action_save_file() + elif event.button.id == "reload_button": + self.action_reload_file() + elif event.button.id == "back_button": + self.action_go_back() + + def action_save_file(self) -> None: + """保存当前编辑的文件""" + if self.repo_dir is None or self.selected_filename is None: + self.notify("未选择仓库或文件", severity="warning") + return + file_path = self.repo_dir / self.selected_filename + editor = self.query_one("#text_editor", TextArea) + new_content = editor.text + # 验证格式 + try: + if self.selected_filename.endswith(".toml"): + toml.loads(new_content) # 验证TOML + elif self.selected_filename.endswith(".json"): + json.loads(new_content) # 验证JSON + except Exception as e: + self.notify(f"格式错误: {e}", severity="error") + return + # 写入文件 + try: + file_path.write_text(new_content, encoding="utf-8") + self.notify("保存成功", severity="information") + except Exception as e: + logger.error(f"保存文件失败: {e}") + self.notify(f"保存文件失败: {e}", severity="error") + + def action_reload_file(self) -> None: + """重新加载当前文件(放弃修改)""" + if self.repo_dir is None or self.selected_filename is None: + self.notify("未选择仓库或文件", severity="warning") + return + file_path = self.repo_dir / self.selected_filename + try: + content = file_path.read_text(encoding="utf-8") + editor = self.query_one("#text_editor", TextArea) + editor.text = content + self.notify("已重载", severity="information") + except Exception as e: + logger.error(f"重载文件失败: {e}") + self.notify(f"重载文件失败: {e}", severity="error") + + def action_go_back(self) -> None: + """返回上一屏幕""" + self.app.pop_screen() + + def action_toggle_dark(self) -> None: + """切换暗色模式""" + self.app.dark = not self.app.dark diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index a669418..c140dba 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -7,8 +7,8 @@ from textual.message import Message from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt +import heurams.kernel.puzzles as pz from heurams.services.logger import get_logger from .base_puzzle_widget import BasePuzzleWidget diff --git a/src/heurams/interface/widgets/finished.py b/src/heurams/interface/widgets/finished.py index bb25739..db1c31e 100644 --- a/src/heurams/interface/widgets/finished.py +++ b/src/heurams/interface/widgets/finished.py @@ -7,12 +7,12 @@ class Finished(Widget): self, *children: Widget, alia="", - is_saved = 0, + is_saved=0, name: str | None = None, id: str | None = None, classes: str | None = None, disabled: bool = False, - markup: bool = True + markup: bool = True, ) -> None: self.alia = alia self.is_saved = is_saved @@ -22,7 +22,7 @@ class Finished(Widget): id=id, classes=classes, disabled=disabled, - markup=markup + markup=markup, ) def compose(self): diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 9cdb832..8499b94 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -5,8 +5,8 @@ from textual.containers import Container, ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label -import heurams.kernel.puzzles as pz import heurams.kernel.particles as pt +import heurams.kernel.puzzles as pz from heurams.services.hasher import hash from heurams.services.logger import get_logger diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 233dc80..3917a7f 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -90,7 +90,7 @@ class Recognition(BasePuzzleWidget): for item in cfg["secondary"]: if isinstance(item, list): for j in item: - yield Markdown(f"### {metadata['annotation'][item]}: {j}") + yield Markdown(f"### {j}") #TODO ANNOTATION continue if isinstance(item, Dict): total = "" diff --git a/src/heurams/utils/__init__.py b/src/heurams/kernel/auxiliary/__init__.py similarity index 100% rename from src/heurams/utils/__init__.py rename to src/heurams/kernel/auxiliary/__init__.py diff --git a/src/heurams/utils/evalizor.py b/src/heurams/kernel/auxiliary/evalizor.py similarity index 100% rename from src/heurams/utils/evalizor.py rename to src/heurams/kernel/auxiliary/evalizor.py diff --git a/src/heurams/utils/lict.py b/src/heurams/kernel/auxiliary/lict.py similarity index 100% rename from src/heurams/utils/lict.py rename to src/heurams/kernel/auxiliary/lict.py diff --git a/src/heurams/utils/refvar.py b/src/heurams/kernel/auxiliary/refvar.py similarity index 100% rename from src/heurams/utils/refvar.py rename to src/heurams/kernel/auxiliary/refvar.py diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index 211e9d5..48accff 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -3,8 +3,8 @@ from .electron import Electron from .nucleon import Nucleon from .placeholders import ( AtomPlaceholder, - NucleonPlaceholder, ElectronPlaceholder, + NucleonPlaceholder, orbital_placeholder, ) diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 3cd22a0..463add0 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -1,6 +1,5 @@ from typing import TypedDict - from heurams.services.logger import get_logger from .electron import Electron diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index ba58db5..4833b12 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -57,6 +57,10 @@ class Electron: result = self.algodata[self.algo.algo_name]["is_activated"] return result + def last_modify(self): + result = self.algodata[self.algo.algo_name]["last_modify"] + return result + def get_rating(self): try: result = self.algo.get_rating(self.algodata) @@ -68,6 +72,10 @@ class Electron: result = self.algo.nextdate(self.algodata) return result + def lastdate(self) -> int: + result = self.algodata[self.algo.algo_name]["lastdate"] + return result + def revisor(self, quality: int = 5, is_new_activation: bool = False): """算法迭代决策机制实现 diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index e34875f..9369bba 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,9 +1,9 @@ from copy import deepcopy from logging import config -from heurams.services.logger import get_logger -from heurams.utils.evalizor import Evalizer from heurams.context import config_var +from heurams.services.logger import get_logger +from heurams.kernel.auxiliary.evalizor import Evalizer logger = get_logger(__name__) diff --git a/src/heurams/kernel/particles/placeholders.py b/src/heurams/kernel/particles/placeholders.py index 6190d94..2e0b8c4 100644 --- a/src/heurams/kernel/particles/placeholders.py +++ b/src/heurams/kernel/particles/placeholders.py @@ -1,7 +1,8 @@ from heurams.kernel.particles import orbital + +from .atom import Atom from .electron import Electron from .nucleon import Nucleon -from .atom import Atom orbital_placeholder = { "schedule": ["quick_review", "recognition", "final_review"], diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 4f23ccb..7d5812b 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -1,12 +1,13 @@ -from functools import reduce import random - -import heurams.kernel.puzzles as puz -import heurams.kernel.particles as pt -from heurams.services.logger import get_logger +from functools import reduce from tabulate import tabulate as tabu from transitions import Machine + +import heurams.kernel.particles as pt +import heurams.kernel.puzzles as puz +from heurams.services.logger import get_logger + from .states import FissionState, PhaserState logger = get_logger(__name__) diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 9afdccd..19cf55e 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,8 +1,9 @@ from click import style +from transitions import Machine + import heurams.kernel.particles as pt from heurams.kernel.particles.placeholders import AtomPlaceholder from heurams.services.logger import get_logger -from transitions import Machine from .procession import Procession from .states import PhaserState, ProcessionState @@ -133,9 +134,10 @@ class Phaser(Machine): return Procession([AtomPlaceholder()], PhaserState.FINISHED) def __repr__(self, style="pipe", ends="\n"): - from heurams.services.textproc import truncate from tabulate import tabulate as tabu + from heurams.services.textproc import truncate + lst = [ { "Type": "Phaser", diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 29d7fca..3f37ca5 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -1,7 +1,8 @@ +from tabulate import tabulate as tabu +from transitions import Machine + import heurams.kernel.particles as pt from heurams.services.logger import get_logger -from transitions import Machine -from tabulate import tabulate as tabu from .fission import Fission from .states import PhaserState, ProcessionState diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index ec5cbbc..b863a34 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -7,7 +7,7 @@ import toml import heurams.kernel.particles as pt -from ...utils.lict import Lict +from heurams.kernel.auxiliary.lict import Lict class RepoManifest(TypedDict): @@ -167,7 +167,7 @@ class Repo: return 0 @classmethod - def probe_vaild_repos_in_dir(cls, folder: Path): + def probe_valid_repos_in_dir(cls, folder: Path): lst = list() for i in folder.iterdir(): if i.is_dir(): diff --git a/src/heurams/providers/audio/protocol.py b/src/heurams/providers/audio/protocol.py deleted file mode 100644 index 664d32e..0000000 --- a/src/heurams/providers/audio/protocol.py +++ /dev/null @@ -1,13 +0,0 @@ -import pathlib -from typing import Protocol - -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -class PlayFunctionProtocol(Protocol): - def __call__(self, path: pathlib.Path) -> None: ... - - -logger.debug("音频协议模块已加载") diff --git a/src/heurams/providers/llm/__init__.py b/src/heurams/providers/llm/__init__.py index e87befa..7cd42b7 100644 --- a/src/heurams/providers/llm/__init__.py +++ b/src/heurams/providers/llm/__init__.py @@ -1,6 +1,19 @@ # 大语言模型 from heurams.services.logger import get_logger +from .base import BaseLLM +from .openai import OpenAILLM + logger = get_logger(__name__) -logger.debug("LLM providers 模块已加载") +__all__ = [ + "BaseLLM", + "OpenAILLM", +] + +providers = { + "base": BaseLLM, + "openai": OpenAILLM, +} + +logger.debug("LLM providers 已注册: %s", list(providers.keys())) diff --git a/src/heurams/providers/llm/base.py b/src/heurams/providers/llm/base.py index b7c50c8..6426588 100644 --- a/src/heurams/providers/llm/base.py +++ b/src/heurams/providers/llm/base.py @@ -1,5 +1,55 @@ +"""LLM 提供者基类""" + +import asyncio +from typing import Any, Dict, List, Optional + from heurams.services.logger import get_logger logger = get_logger(__name__) -logger.debug("LLM 基类模块已加载") + +class BaseLLM: + """LLM 提供者基类""" + + name = "BaseLLM" + + def __init__(self, config: Dict[str, Any]): + """初始化 LLM 提供者 + + Args: + config: 提供者配置字典 + """ + self.config = config + logger.debug("BaseLLM 初始化完成") + + async def chat(self, messages: List[Dict[str, str]], **kwargs) -> str: + """发送聊天消息并获取响应 + + Args: + messages: 消息列表,每个消息为 {"role": "user"|"assistant"|"system", "content": "消息内容"} + **kwargs: 其他参数,如 temperature, max_tokens 等 + + Returns: + 模型返回的文本响应 + """ + logger.debug("BaseLLM.chat: messages=%d, kwargs=%s", len(messages), kwargs) + logger.warning("BaseLLM.chat 是基类方法,未实现具体功能") + await asyncio.sleep(0) # 避免未使用异步的警告 + return "BaseLLM 未实现具体功能" + + async def chat_stream(self, messages: List[Dict[str, str]], **kwargs): + """流式聊天(可选实现) + + Args: + messages: 消息列表 + **kwargs: 其他参数 + + Yields: + 流式响应的文本块 + """ + logger.debug( + "BaseLLM.chat_stream: messages=%d, kwargs=%s", len(messages), kwargs + ) + logger.warning("BaseLLM.chat_stream 是基类方法,未实现具体功能") + await asyncio.sleep(0) + yield "BaseLLM 未实现流式功能" diff --git a/src/heurams/providers/llm/openai.py b/src/heurams/providers/llm/openai.py index 43a74f7..252f45d 100644 --- a/src/heurams/providers/llm/openai.py +++ b/src/heurams/providers/llm/openai.py @@ -1,5 +1,96 @@ +"""OpenAI 兼容 LLM 提供者""" + +import asyncio +from typing import Any, AsyncGenerator, Dict, List, Optional + from heurams.services.logger import get_logger +from .base import BaseLLM + logger = get_logger(__name__) -logger.debug("OpenAI provider 模块已加载(未实现)") + +class OpenAILLM(BaseLLM): + """OpenAI 兼容 LLM 提供者""" + + name = "OpenAI" + + def __init__(self, config: Dict[str, Any]): + super().__init__(config) + self.api_key = config.get("key", "") + self.base_url = config.get("url", "https://api.openai.com/v1") + self._client = None + logger.debug("OpenAILLM 初始化完成: base_url=%s", self.base_url) + + def _get_client(self): + """获取 OpenAI 客户端(延迟导入)""" + if self._client is None: + try: + from openai import AsyncOpenAI + except ImportError: + logger.error("未安装 openai 库,请运行: pip install openai") + raise ImportError("未安装 openai 库,请运行: pip install openai") + + self._client = AsyncOpenAI( + api_key=self.api_key if self.api_key else None, + base_url=self.base_url if self.base_url else None, + ) + return self._client + + async def chat(self, messages: List[Dict[str, str]], **kwargs) -> str: + """发送聊天消息并获取响应""" + logger.debug("OpenAILLM.chat: messages=%d", len(messages)) + + client = self._get_client() + + # 默认参数 + default_kwargs = { + "model": kwargs.get("model", "gpt-3.5-turbo"), + "temperature": kwargs.get("temperature", 0.7), + "max_tokens": kwargs.get("max_tokens", 1000), + } + + # 合并参数,优先使用传入的 kwargs + request_kwargs = {**default_kwargs, **kwargs} + request_kwargs["messages"] = messages + + try: + response = await client.chat.completions.create(**request_kwargs) + content = response.choices[0].message.content + logger.debug( + "OpenAILLM.chat 成功: response length=%d", + len(content) if content else 0, + ) + return content or "" + except Exception as e: + logger.error("OpenAILLM.chat 失败: %s", e) + raise + + async def chat_stream( + self, messages: List[Dict[str, str]], **kwargs + ) -> AsyncGenerator[str, None]: + """流式聊天""" + logger.debug("OpenAILLM.chat_stream: messages=%d", len(messages)) + + client = self._get_client() + + # 默认参数 + default_kwargs = { + "model": kwargs.get("model", "gpt-3.5-turbo"), + "temperature": kwargs.get("temperature", 0.7), + "max_tokens": kwargs.get("max_tokens", 1000), + "stream": True, + } + + # 合并参数 + request_kwargs = {**default_kwargs, **kwargs} + request_kwargs["messages"] = messages + + try: + stream = await client.chat.completions.create(**request_kwargs) + async for chunk in stream: + if chunk.choices[0].delta.content: + yield chunk.choices[0].delta.content + except Exception as e: + logger.error("OpenAILLM.chat_stream 失败: %s", e) + raise diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py new file mode 100644 index 0000000..a925a34 --- /dev/null +++ b/src/heurams/services/favorite_service.py @@ -0,0 +1,163 @@ +# 收藏服务 +import json +import shutil +import time +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +from heurams.context import config_var +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +@dataclass +class FavoriteItem: + """收藏项""" + + repo_path: str # 仓库相对路径 (相对于 data/repo) + ident: str # 原子标识符 + added: int # 添加时间戳 (UNIX 秒) + # 可选标签 + tags: List[str] | None = None + + def __post_init__(self): + if self.tags is None: + self.tags = [] + + def to_dict(self) -> dict: + return { + "repo_path": self.repo_path, + "ident": self.ident, + "added": self.added, + "tags": self.tags, + } + + @classmethod + def from_dict(cls, data: dict) -> "FavoriteItem": + return cls( + repo_path=data["repo_path"], + ident=data["ident"], + added=data["added"], + tags=data.get("tags", []), + ) + + +class FavoriteManager: + """收藏管理器""" + + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self): + if not hasattr(self, "_loaded"): + self._loaded = True + self._favorites: List[FavoriteItem] = [] + self._file_path = self._get_file_path() + self.load() + + def _get_file_path(self) -> Path: + """获取收藏文件路径""" + config_path = Path(config_var.get()["paths"]["data"]) + fav_path = config_path / "global" / "favorites.json" + fav_path.parent.mkdir(parents=True, exist_ok=True) + return fav_path + + def load(self) -> None: + """从文件加载收藏列表""" + if self._file_path.exists(): + try: + with open(self._file_path, "r", encoding="utf-8") as f: + data = json.load(f) + self._favorites = [FavoriteItem.from_dict(item) for item in data] + logger.debug("收藏列表加载成功,共 %d 项", len(self._favorites)) + except Exception as e: + logger.error("加载收藏列表失败: %s", e) + self._favorites = [] + else: + self._favorites = [] + + def save(self) -> None: + """保存收藏列表到文件""" + try: + data = [item.to_dict() for item in self._favorites] + with open(self._file_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + logger.debug("收藏列表保存成功,共 %d 项", len(self._favorites)) + except Exception as e: + logger.error("保存收藏列表失败: %s", e) + + def add(self, repo_path: str, ident: str, tags: List[str] | None = None) -> bool: + """添加收藏 + + Args: + repo_path: 仓库相对路径 + ident: 原子标识符 + tags: 标签列表 + Returns: + 是否成功添加 (若已存在则返回 False) + """ + # 检查是否已存在 + for item in self._favorites: + if item.repo_path == repo_path and item.ident == ident: + logger.debug("收藏已存在: %s/%s", repo_path, ident) + return False + item = FavoriteItem( + repo_path=repo_path, + ident=ident, + added=int(time.time()), + tags=tags if tags else [], + ) + self._favorites.append(item) + self.save() + logger.info("添加收藏: %s/%s", repo_path, ident) + return True + + def remove(self, repo_path: str, ident: str) -> bool: + """移除收藏 + + Returns: + 是否成功移除 (若不存在则返回 False) + """ + for idx, item in enumerate(self._favorites): + if item.repo_path == repo_path and item.ident == ident: + del self._favorites[idx] + self.save() + logger.info("移除收藏: %s/%s", repo_path, ident) + return True + logger.debug("收藏不存在: %s/%s", repo_path, ident) + return False + + def has(self, repo_path: str, ident: str) -> bool: + """检查是否已收藏""" + for item in self._favorites: + if item.repo_path == repo_path and item.ident == ident: + return True + return False + + def get_all(self) -> List[FavoriteItem]: + """获取所有收藏项(按添加时间倒序)""" + return sorted(self._favorites, key=lambda x: x.added, reverse=True) + + def get_by_repo(self, repo_path: str) -> List[FavoriteItem]: + """获取指定仓库的所有收藏项""" + return [item for item in self._favorites if item.repo_path == repo_path] + + def clear(self) -> None: + """清空收藏列表""" + self._favorites = [] + self.save() + logger.info("清空收藏列表") + + def count(self) -> int: + """收藏总数""" + return len(self._favorites) + + +# 全局单例实例 +favorite_manager = FavoriteManager() diff --git a/src/heurams/services/llm_service.py b/src/heurams/services/llm_service.py new file mode 100644 index 0000000..2fd730e --- /dev/null +++ b/src/heurams/services/llm_service.py @@ -0,0 +1,228 @@ +"""LLM 聊天服务""" + +import asyncio +import json +from pathlib import Path +from typing import Any, Dict, List, Optional + +from heurams.context import config_var +from heurams.providers.llm import providers as prov +from heurams.services.logger import get_logger + +logger = get_logger(__name__) + + +class ChatSession: + """聊天会话,管理单个对话的历史和参数""" + + def __init__( + self, session_id: str, llm_provider, system_prompt: str = "", **default_params + ): + """初始化聊天会话 + + Args: + session_id: 会话唯一标识符 + llm_provider: LLM 提供者实例 + system_prompt: 系统提示词 + **default_params: 默认参数(temperature, max_tokens, model 等) + """ + self.session_id = session_id + self.llm_provider = llm_provider + self.system_prompt = system_prompt + self.default_params = default_params + + # 消息历史 + self.messages: List[Dict[str, str]] = [] + if system_prompt: + self.messages.append({"role": "system", "content": system_prompt}) + + logger.debug("创建聊天会话: id=%s", session_id) + + def add_message(self, role: str, content: str): + """添加消息到历史""" + self.messages.append({"role": role, "content": content}) + logger.debug( + "会话 %s 添加消息: role=%s, length=%d", self.session_id, role, len(content) + ) + + def clear_history(self): + """清空消息历史(保留系统提示)""" + self.messages = [] + if self.system_prompt: + self.messages.append({"role": "system", "content": self.system_prompt}) + logger.debug("会话 %s 清空历史", self.session_id) + + def set_system_prompt(self, prompt: str): + """设置系统提示词""" + self.system_prompt = prompt + # 更新消息历史中的系统消息 + if self.messages and self.messages[0]["role"] == "system": + self.messages[0]["content"] = prompt + elif prompt: + self.messages.insert(0, {"role": "system", "content": prompt}) + logger.debug("会话 %s 设置系统提示: length=%d", self.session_id, len(prompt)) + + async def send_message(self, message: str, **override_params) -> str: + """发送消息并获取响应 + + Args: + message: 用户消息内容 + **override_params: 覆盖默认参数 + + Returns: + 模型响应内容 + """ + # 添加用户消息 + self.add_message("user", message) + + # 合并参数 + params = {**self.default_params, **override_params} + + # 发送请求 + logger.debug("会话 %s 发送消息: length=%d", self.session_id, len(message)) + response = await self.llm_provider.chat(self.messages, **params) + + # 添加助手响应 + self.add_message("assistant", response) + + return response + + async def send_message_stream(self, message: str, **override_params): + """流式发送消息 + + Args: + message: 用户消息内容 + **override_params: 覆盖默认参数 + + Yields: + 流式响应的文本块 + """ + # 添加用户消息 + self.add_message("user", message) + + # 合并参数 + params = {**self.default_params, **override_params} + + # 发送流式请求 + logger.debug("会话 %s 发送流式消息: length=%d", self.session_id, len(message)) + + full_response = "" + async for chunk in self.llm_provider.chat_stream(self.messages, **params): + yield chunk + full_response += chunk + + # 添加完整的助手响应到历史 + self.add_message("assistant", full_response) + + def get_history(self) -> List[Dict[str, str]]: + """获取消息历史(不包括系统消息)""" + # 返回用户和助手的消息,可选排除系统消息 + return [msg for msg in self.messages if msg["role"] != "system"] + + def save_to_file(self, file_path: Path): + """保存会话到文件""" + data = { + "session_id": self.session_id, + "system_prompt": self.system_prompt, + "default_params": self.default_params, + "messages": self.messages, + } + with open(file_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + logger.debug("会话 %s 保存到: %s", self.session_id, file_path) + + @classmethod + def load_from_file(cls, file_path: Path, llm_provider): + """从文件加载会话""" + with open(file_path, "r", encoding="utf-8") as f: + data = json.load(f) + + session = cls( + session_id=data["session_id"], + llm_provider=llm_provider, + system_prompt=data.get("system_prompt", ""), + **data.get("default_params", {}) + ) + session.messages = data["messages"] + logger.debug("从文件加载会话: %s", file_path) + return session + + +class ChatManager: + """聊天管理器,管理多个会话""" + + def __init__(self): + self.sessions: Dict[str, ChatSession] = {} + self.default_session_id = "default" + logger.debug("聊天管理器初始化完成") + + def get_session( + self, + session_id: Optional[str] = None, + create_if_missing: bool = True, + **session_params + ) -> Optional[ChatSession]: + """获取或创建聊天会话 + + Args: + session_id: 会话标识符,None 则使用默认会话 + create_if_missing: 如果会话不存在则创建 + **session_params: 传递给 ChatSession 的参数 + + Returns: + 聊天会话实例,如果不存在且不创建则返回 None + """ + if session_id is None: + session_id = self.default_session_id + + if session_id in self.sessions: + return self.sessions[session_id] + + if create_if_missing: + # 获取 LLM 提供者 + provider_name = config_var.get()["services"]["llm"] + provider_config = config_var.get()["providers"]["llm"][provider_name] + llm_provider = prov[provider_name](provider_config) + + session = ChatSession( + session_id=session_id, llm_provider=llm_provider, **session_params + ) + self.sessions[session_id] = session + logger.debug("创建新会话: id=%s", session_id) + return session + + return None + + def delete_session(self, session_id: str): + """删除会话""" + if session_id in self.sessions: + del self.sessions[session_id] + logger.debug("删除会话: id=%s", session_id) + + def list_sessions(self) -> List[str]: + """列出所有会话ID""" + return list(self.sessions.keys()) + + +# 全局聊天管理器实例 +_chat_manager: Optional[ChatManager] = None + + +def get_chat_manager() -> ChatManager: + """获取全局聊天管理器实例""" + global _chat_manager + if _chat_manager is None: + _chat_manager = ChatManager() + logger.debug("创建全局聊天管理器") + return _chat_manager + + +def create_chat_session( + session_id: Optional[str] = None, **session_params +) -> ChatSession: + """创建或获取聊天会话(便捷函数)""" + manager = get_chat_manager() + return manager.get_session(session_id, True, **session_params) + + +logger.debug("LLM 服务初始化完成") From c9cc8a7917eb6abf7420fbcbd99e7963cffa36e3 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 8 Jan 2026 00:56:04 +0800 Subject: [PATCH 20/79] =?UTF-8?q?fix:=20=E5=B0=8F=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E4=BF=AE=E8=A1=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 6 +++--- src/heurams/interface/screens/memoqueue.py | 4 ++-- src/heurams/interface/widgets/mcq_puzzle.py | 8 +++++--- src/heurams/interface/widgets/recognition.py | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data/config/config.toml b/data/config/config.toml index 6479ca1..fc1c2bc 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -6,10 +6,10 @@ daystamp_override = -1 timestamp_override = -1 # [调试] 一键通过 -quick_pass = 1 +quick_pass = true # 对于每个项目的默认新记忆原子数量 -scheduled_num = 999 +scheduled_num = 8 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 timezone_offset = +28800 # 中国标准时间 (UTC+8) @@ -17,7 +17,7 @@ timezone_offset = +28800 # 中国标准时间 (UTC+8) [interface] [interface.memorizor] -autovoice = 0 # 自动语音播放, 仅限于 recognition 组件 +autovoice = false # 自动语音播放, 仅限于 recognition 组件 [algorithm] default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index a880d89..35f58bf 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -90,7 +90,7 @@ class MemScreen(Screen): s = f"阶段: {self.procession.phase.name}\n" # 收藏状态 if self.repo is not None: - fav_status = "★" if self._is_current_atom_favorited() else "☆" + fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" s += f"收藏: {fav_status}\n" if config_var.get().get("debug_topline", 0): try: @@ -113,7 +113,7 @@ class MemScreen(Screen): s += f"{stat}\n" except Exception as e: s = str(e) - # s += f"当前进度: {self.procession.process() + 1}/{self.procession.total_length()}" + s += f"进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s def update_display(self): diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 8499b94..84ed336 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -55,6 +55,8 @@ class MCQPuzzle(BasePuzzleWidget): def _load(self): cfg = self.atom.registry["nucleon"]["puzzles"][self.alia] + if cfg['mapping'] == {}: + self.screen.rating = 5 # type: ignore self.puzzle = pz.MCQPuzzle( cfg["mapping"], cfg["jammer"], int(cfg["max_riddles_num"]), cfg["prefix"] ) @@ -68,9 +70,9 @@ class MCQPuzzle(BasePuzzleWidget): logger.debug(self.puzzle.options) else: current_options = self.puzzle.options[len(self.inputlist)] - yield Label(setting["primary"], id="sentence") - yield Label(self.puzzle.wording[len(self.inputlist)], id="puzzle") - yield Label(f"当前输入: {self.inputlist}", id="inputpreview") + yield Label(setting["primary"], id="sentence") + yield Label(self.puzzle.wording[len(self.inputlist)], id="puzzle") + yield Label(f"当前输入: {self.inputlist}", id="inputpreview") # 渲染当前问题的选项 with Container(id="btn-container"): diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 3917a7f..f56f963 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -90,7 +90,7 @@ class Recognition(BasePuzzleWidget): for item in cfg["secondary"]: if isinstance(item, list): for j in item: - yield Markdown(f"### {j}") #TODO ANNOTATION + yield Markdown(f"### 笔记: {j}") #TODO ANNOTATION continue if isinstance(item, Dict): total = "" From 264af76fadda4f5b1855e1fc93fe1597307ccc5b Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 8 Jan 2026 01:00:08 +0800 Subject: [PATCH 21/79] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/screens/radio.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/heurams/interface/screens/radio.py b/src/heurams/interface/screens/radio.py index 000fb2a..6d0b610 100644 --- a/src/heurams/interface/screens/radio.py +++ b/src/heurams/interface/screens/radio.py @@ -5,7 +5,6 @@ import os from pathlib import Path from typing import List, Optional -from matplotlib.cbook import ls_mapper from textual.app import ComposeResult from textual.containers import Container, ScrollableContainer from textual.reactive import reactive From 4cb6edf073cfa91494060e478c1bc712ac343e9e Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Fri, 9 Jan 2026 00:47:34 +0800 Subject: [PATCH 22/79] =?UTF-8?q?build:=20=E4=BD=BF=E7=94=A8=20uv=20?= =?UTF-8?q?=E5=8C=85=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 +- .python-version | 1 + CONTRIBUTING.md | 13 +- package-lock.json | 6 - pyproject.toml | 38 +- requirements.txt | 5 +- src/heurams/__main__.py | 18 +- src/heurams/interface/__main__.py | 6 +- src/heurams/interface/screens/dashboard.py | 4 +- src/heurams/services/vfs.py | 20 - src/heurams/services/vfs/zipfs.py | 0 uv.lock | 833 +++++++++++++++++++++ 12 files changed, 886 insertions(+), 67 deletions(-) create mode 100644 .python-version delete mode 100644 package-lock.json delete mode 100644 src/heurams/services/vfs.py delete mode 100644 src/heurams/services/vfs/zipfs.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore index c863a00..bee63b2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,22 +6,15 @@ __pycache__/ .idea/ cache/ data/repo/cngk -#nucleon/test.toml -electron/test.toml *.egg-info/ build/ dist/ old/ -# config/ data/cache/ -data/electron/ -data/nucleon/ data/global/ -!data/nucleon/TEST* -data/orbital/ config/config_dev.toml AGENTS.md -*.log.1 +*.log.* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f51df26..2d50a01 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,22 +3,23 @@ 欢迎为此项目做出贡献! 本项目是一个开源项目, 我们鼓励社区成员参与改进. -## 开发流程 +## 开发规范 -1. **分支划分**: +1. 分支划分: - `main` 分支: 稳定版本 - `dev` 分支: 开发版本 - 功能分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/描述` -2. **代码风格**: - - 请使用 Black 与 isort 格式化代码 +2. 代码风格: + - 请使用 Black 格式化代码 - 遵循 PEP 8 规范 - 添加适当的文档字符串 -3. **提交消息**: +3. 提交消息: - 使用简体中文或英文撰写清晰的提交消息 - 格式: 遵循 Conventional Commits 规范 -4. **合并方式**: +4. 合并方式: - 不使用 Fast-forward 合并 - 可以设置 `git config merge.ff false` + ## 设置开发环境 ```bash diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 87ab9ea..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "HeurAMS", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/pyproject.toml b/pyproject.toml index 267bdab..b684840 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,23 +1,27 @@ -[build-system] -requires = ["setuptools>=45", "wheel"] -build-backend = "setuptools.build_meta" - [project] name = "heurams" version = "0.5.0" -description = "Heuristic Assisted Memory Scheduler" -license = {file = "LICENSE"} -classifiers = [ - "License :: OSI Approved :: GNU Affero General Public License v3", - "Programming Language :: Python :: 3", - "Operating System :: OS Independent", - "Topic :: Education", - "Intended Audience :: Education", -] -keywords = ["spaced-repetition", "memory", "learning", "tui", "textual", "flashcards", "education"] - +description = "Heuristic Auxiliary Memory Scheduler" readme = "README.md" +authors = [ + { name = "pluvium27", email = "pluvium27@outlook.com" } +] +requires-python = ">=3.13" +dependencies = [ + "edge-tts==7.0.2", + "jieba==0.42.1", + "openai==1.0.0", + "playsound==1.2.2", + "tabulate>=0.9.0", + "textual==7.0.0", + "toml==0.10.2", + "transitions==0.9.3", +] -[tool.setuptools.packages.find] -where = ["src"] +[project.scripts] +heurams = "heurams.__main__:main" +tui = "heurams.interface.__main__:main" +[build-system] +requires = ["uv_build>=0.9.22,<0.10.0"] +build-backend = "uv_build" diff --git a/requirements.txt b/requirements.txt index f4b26f9..f172b4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,8 @@ edge-tts==7.0.2 -fsspec==2025.12.0 jieba==0.42.1 -openai>=1.0.0 +openai==1.0.0 playsound==1.2.2 -tabulate==0.9.0 +tabulate>=0.9.0 textual==7.0.0 toml==0.10.2 transitions==0.9.3 diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index ca087c5..09d191f 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -1,7 +1,19 @@ -prompt = """HeurAMS 已经被成功地安装在系统中. +# __main__.py +def main(): + prompt = """HeurAMS 已经被成功地安装在系统中. 但 HeurAMS 被设计为一个带有辅助记忆调度器功能的软件包, 无法直接被执行, 但可被其他 Python 程序调用. -若您想启动内置的基本用户界面, +若您想启动内置的基本用户界面: 请运行 python -m heurams.interface, 或者 python -m heurams.interface.__main__ +python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 python 命令被指向了 python2. +尽管项目保留了 requirements.txt, 我们仍不推荐使用系统 python 和原始 venv 进行开发. +项目的推荐开发环境工具是 uv. +如果你的环境已经安装了 uv: + 先运行 uv sync 同步环境, 此命令只需要执行一遍, uv 会自动处理依赖. + 通过运行 uv run tui 启动内置基本用户界面. + 此时您的解释器在项目目录里的 .venv/bin 中, 使用 IDE 开发前, 务必切换解释器! 注意: 一个常见的误区是, 执行 interface 下的 __main__.py 运行基本用户界面, 这会导致 Python 上下文环境异常, 请不要这样做.""" -print(prompt) + print(prompt) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 6e87ebe..4681ca9 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -12,7 +12,9 @@ from .screens.repocreator import RepoCreatorScreen logger = get_logger(__name__) -app = HeurAMSApp() +def main(): + app = HeurAMSApp() + app.run() if __name__ == "__main__": - app.run() + main() \ No newline at end of file diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 0d510b9..a0e7f78 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -50,7 +50,7 @@ class DashboardScreen(Screen): yield ScrollableContainer( Label('欢迎使用 "潜进" 启发式辅助记忆调度器', classes="title-label"), Label( - f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()["timezone_offset"] / 3600})" + f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()['timezone_offset'] / 3600})" ), Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), Label("选择待学习或待修改的项目:", classes="title-label"), @@ -90,7 +90,7 @@ class DashboardScreen(Screen): if is_unfinished: nextdate = min(nextdate, timer.get_daystamp()) need_to_study = is_due or is_unfinished - prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum} ({round(activated_sum/unit_sum*100)}%)\n {"需要学习" if need_to_study else "无需操作"}" + prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum} ({round(activated_sum/unit_sum*100)}%)\n {'需要学习' if need_to_study else '无需操作'}" stat = { "is_due": is_due, "unit_sum": unit_sum, diff --git a/src/heurams/services/vfs.py b/src/heurams/services/vfs.py deleted file mode 100644 index a024ef8..0000000 --- a/src/heurams/services/vfs.py +++ /dev/null @@ -1,20 +0,0 @@ -"""vfs.py -得益于 FSSpec, 无需实现大部分虚拟文件系统的 Providers -""" - -from pathlib import Path - -import fsspec as fs - - -class VFSObject: - def __init__(self, protocol, base_url): - self.base_url = base_url - self.protocol = protocol - self.fs = fs.filesystem(protocol=protocol, base_url=base_url) - - def open(self, path: Path): - return self.fs.open(path) - - def open_by_list(self, path_list: list[Path]): - return self.fs.open_files(path_list) diff --git a/src/heurams/services/vfs/zipfs.py b/src/heurams/services/vfs/zipfs.py deleted file mode 100644 index e69de29..0000000 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..b6fcf41 --- /dev/null +++ b/uv.lock @@ -0,0 +1,833 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "3.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/99/2dfd53fd55ce9838e6ff2d4dac20ce58263798bd1a0dbe18b3a9af3fcfce/anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", size = 142927, upload-time = "2023-07-05T16:45:02.294Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/24/44299477fe7dcc9cb58d0a57d5a7588d6af2ff403fdd2d47a246c91a3246/anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5", size = 80896, upload-time = "2023-07-05T16:44:59.805Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "edge-tts" +version = "7.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "certifi" }, + { name = "srt" }, + { name = "tabulate" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/12/32554080d0d03ca0b874677fc4548ea9042ddfeb0b3f38cd107c760aff28/edge_tts-7.0.2.tar.gz", hash = "sha256:1374f493c170e6fe432d04012061c279e518c495524fa51b1b9da7368cc6b21b", size = 23581, upload-time = "2025-05-03T10:34:17.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/21/6ebbc7fc6a4e58bcd49130273a072f7c2e4e6dc03735e078895b47148e30/edge_tts-7.0.2-py3-none-any.whl", hash = "sha256:effc554c249f02bd5013f28cd1faa22802e0757b031a7759be5960084ccb8d76", size = 26274, upload-time = "2025-05-03T10:34:15.872Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "heurams" +version = "0.5.0" +source = { editable = "." } +dependencies = [ + { name = "edge-tts" }, + { name = "jieba" }, + { name = "openai" }, + { name = "playsound" }, + { name = "tabulate" }, + { name = "textual" }, + { name = "toml" }, + { name = "transitions" }, +] + +[package.metadata] +requires-dist = [ + { name = "edge-tts", specifier = "==7.0.2" }, + { name = "jieba", specifier = "==0.42.1" }, + { name = "openai", specifier = "==1.0.0" }, + { name = "playsound", specifier = "==1.2.2" }, + { name = "tabulate", specifier = ">=0.9.0" }, + { name = "textual", specifier = "==7.0.0" }, + { name = "toml", specifier = "==0.10.2" }, + { name = "transitions", specifier = "==0.9.3" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "jieba" +version = "0.42.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/cb/18eeb235f833b726522d7ebed54f2278ce28ba9438e3135ab0278d9792a2/jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2", size = 19214172, upload-time = "2020-01-20T14:27:23.5Z" } + +[[package]] +name = "linkify-it-py" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "uc-micro-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946, upload-time = "2024-02-04T14:48:04.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, + { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, + { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, + { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, + { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, + { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, + { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, + { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, + { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, + { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +] + +[[package]] +name = "openai" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/92/559d5b2859950dd1f60f09e264b2f9749363c2cf6aa449698192d3dae98c/openai-1.0.0.tar.gz", hash = "sha256:bc58aad3d192f107b82c873dcab66b70f859cbdd12face5124595ef0d0d2c9f4", size = 100085, upload-time = "2023-11-06T16:20:37.411Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/4d4ac5ddc0bdd8257aedb1383841af8c688114ab22a902976f520362eb35/openai-1.0.0-py3-none-any.whl", hash = "sha256:e9220abf3f0332ddfcbcef3e13f70e71459618637d2e7e87b82241aaca1147f4", size = 154081, upload-time = "2023-11-06T16:20:35.146Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, +] + +[[package]] +name = "playsound" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/16/10d897b0a83fb4b05b03a63d7a2667ab75f857f67f7062fd447dd3f49bf7/playsound-1.2.2-py2.py3-none-any.whl", hash = "sha256:1e83750a5325cbccee03d6e751ba3e78c037ac95b95a3ba1f38d0c5aca9e1a34", size = 5960, upload-time = "2017-06-29T14:08:29.207Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "srt" +version = "3.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/b7/4a1bc231e0681ebf339337b0cd05b91dc6a0d701fa852bb812e244b7a030/srt-3.5.3.tar.gz", hash = "sha256:4884315043a4f0740fd1f878ed6caa376ac06d70e135f306a6dc44632eed0cc0", size = 28296, upload-time = "2023-03-28T02:35:44.007Z" } + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "textual" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", extra = ["linkify"] }, + { name = "mdit-py-plugins" }, + { name = "platformdirs" }, + { name = "pygments" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/9c/ebc9ca1f95366bef4c0e8360f4a77400d47a79aeecc08747de1990ef8bdc/textual-7.0.0.tar.gz", hash = "sha256:617638a2be74fb7507aff3ea6ec9374148be02e5a7bb1d02396d1d557b66c0a9", size = 1582005, upload-time = "2026-01-03T11:48:10.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/f8/a1ef9034b2a7f334f91b2f673f2ec03020a2529bb30a9437a6beb855beee/textual-7.0.0-py3-none-any.whl", hash = "sha256:190de0f65e5f4bc820fae46f32f591e509621d76688b36400ce01fa63dc6b623", size = 715156, upload-time = "2026-01-03T11:48:09.067Z" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "transitions" +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/83/9e90f3494057d73c9e6bd8de8488af7c9fa714666ccc2db30fe07d147818/transitions-0.9.3.tar.gz", hash = "sha256:881fb75bb1654ed55d86060bb067f2c716f8e155f57bb73fd444e53713aafec8", size = 1191029, upload-time = "2025-07-02T10:49:03.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/05/fea3020e90aa378941ff10de8860fb3b1288313c27efd10fa0c476498f7e/transitions-0.9.3-py2.py3-none-any.whl", hash = "sha256:02463248f2b668d86f66636b1e3c9e8de84d93e22915247f4e1aa9ee1cae28aa", size = 112792, upload-time = "2025-07-02T10:49:01.415Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043, upload-time = "2024-02-09T16:52:01.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] From 3f7bbcdc19bfe0f979cc41d644a8a47b8d33d160 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 13 Jan 2026 23:39:10 +0800 Subject: [PATCH 23/79] =?UTF-8?q?feat(interface):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .python-version | 2 +- pyproject.toml | 8 +- src/heurams/__main__.py | 8 +- src/heurams/interface/screens/about.py | 125 +++-- src/heurams/interface/screens/llmchat.py | 5 +- src/heurams/interface/screens/preparation.py | 34 +- src/heurams/kernel/particles/electron.py | 5 + src/heurams/kernel/reactor/phaser.py | 1 - uv.lock | 476 ++++++++++++++++++- 9 files changed, 615 insertions(+), 49 deletions(-) diff --git a/.python-version b/.python-version index 24ee5b1..c8cfe39 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.13 +3.10 diff --git a/pyproject.toml b/pyproject.toml index b684840..cecd172 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,12 +6,13 @@ readme = "README.md" authors = [ { name = "pluvium27", email = "pluvium27@outlook.com" } ] -requires-python = ">=3.13" +requires-python = ">=3.10" dependencies = [ "edge-tts==7.0.2", "jieba==0.42.1", "openai==1.0.0", "playsound==1.2.2", + "psutil>=7.2.1", "tabulate>=0.9.0", "textual==7.0.0", "toml==0.10.2", @@ -25,3 +26,8 @@ tui = "heurams.interface.__main__:main" [build-system] requires = ["uv_build>=0.9.22,<0.10.0"] build-backend = "uv_build" + +[dependency-groups] +dev = [ + "flet>=0.80.1", +] diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index 09d191f..81065af 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -1,7 +1,9 @@ +import heurams.services.version as ver + # __main__.py def main(): - prompt = """HeurAMS 已经被成功地安装在系统中. -但 HeurAMS 被设计为一个带有辅助记忆调度器功能的软件包, 无法直接被执行, 但可被其他 Python 程序调用. + prompt = f"""HeurAMS {ver.ver} 已经被成功地安装在系统中. +HeurAMS 被设计为一个带有辅助记忆调度器功能的软件包, 无法直接被执行, 但可被其他 Python 程序调用. 若您想启动内置的基本用户界面: 请运行 python -m heurams.interface, 或者 python -m heurams.interface.__main__ @@ -10,7 +12,7 @@ python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 项目的推荐开发环境工具是 uv. 如果你的环境已经安装了 uv: 先运行 uv sync 同步环境, 此命令只需要执行一遍, uv 会自动处理依赖. - 通过运行 uv run tui 启动内置基本用户界面. + 然后通过运行 uv run tui 启动内置基本用户界面. 此时您的解释器在项目目录里的 .venv/bin 中, 使用 IDE 开发前, 务必切换解释器! 注意: 一个常见的误区是, 执行 interface 下的 __main__.py 运行基本用户界面, 这会导致 Python 上下文环境异常, 请不要这样做.""" print(prompt) diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index e25cc4d..782362f 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -7,6 +7,11 @@ from textual.widgets import Button, Footer, Header, Label, Markdown, Static import heurams.services.version as version from heurams.context import * +import platform +import shutil +import psutil +import os +import sys class AboutScreen(Screen): @@ -18,6 +23,15 @@ class AboutScreen(Screen): yield Header(show_clock=True) with ScrollableContainer(id="about_container"): yield Label("[b]关于与版本信息[/b]") + + # 获取系统信息 + textual_version = self._get_textual_version() + terminal_info = self._get_terminal_info() + python_version = self._get_python_version() + os_version = self._get_os_version() + disk_usage = self._get_disk_usage() + memory_info = self._get_memory_info() + about_text = f""" # 关于 "潜进" @@ -33,6 +47,10 @@ class AboutScreen(Screen): 如果您觉得这个软件有用, 请给它添加一个星标 :) +我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. + +不管您来自何方, 我们都欢迎您加入社区并做出贡献. + 开发人员: - Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 项目作者 @@ -43,40 +61,22 @@ class AboutScreen(Screen): - [Kazuaki Tanida](https://github.com/slaypni): SM-15 算法的 CoffeeScript 实现 - [Thoughts Memo](https://www.zhihu.com/people/L.M.Sherlock): 文献参考 -# 参与贡献 -我们是一个年轻且包容的社区, 由技术人员, 设计师, 文书工作者, 以及创意人员共同构成, +# 运行环境信息 -通过我们协力开发的软件为所有人谋取福祉. +Textual 框架版本: {textual_version} + +终端模拟器: {terminal_info} + +Python 解释器版本: {python_version} + +操作系统版本: {os_version} + +存储余量: {disk_usage} + +内存大小: {memory_info} -上述工作不可避免地让我们确立了下列价值观 (取自 KDE 宣言): - - - 开放治理 确保更多人能参与我们的领导和决策进程; - - - 自由软件 确保我们的工作成果随时能为所有人所用; - - - 多样包容 确保所有人都能加入社区并参加工作; - - - 创新精神 确保新思路能不断涌现并服务于所有人; - - - 共同产权 确保我们能团结一致; - - - 迎合用户 确保我们的成果对所有人有用. - -综上所述, 在为我们共同目标奋斗的过程中, 我们认为上述价值观反映了我们社区的本质, 是我们始终如一地保持初心的关键所在. - -这是一项立足于协作精神的事业, 它的运作和产出不受任何单一个人或者机构的操纵. - -我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. - -不管您来自何方, 我们都欢迎您加入社区并做出贡献. """ - - # """ - # 学术数据 - - # "潜进" 的用户数据可用于科学方面的研究, 我们将在未来版本添加学术数据的收集和展示平台 - # """ yield Markdown(about_text, classes="about-markdown") yield Button( @@ -94,3 +94,68 @@ class AboutScreen(Screen): event.stop() if event.button.id == "back_button": self.action_go_back() + + def _get_textual_version(self) -> str: + """获取 Textual 框架版本""" + try: + import textual + return textual.__version__ + except (ImportError, AttributeError): + return "未知" + + def _get_terminal_info(self) -> str: + """获取终端模拟器信息""" + terminal = shutil.which("terminal") + if terminal: + return terminal + # 尝试从环境变量获取 + terminal_env = os.environ.get('TERM_PROGRAM') or os.environ.get('TERM') + return terminal_env or "未知" + + def _get_python_version(self) -> str: + """获取 Python 解释器版本""" + return platform.python_version() + + def _get_os_version(self) -> str: + """获取操作系统版本""" + try: + if platform.system() == "Darwin": + # macOS + import subprocess + result = subprocess.run(['sw_vers', '-productVersion'], + capture_output=True, text=True) + return f"macOS {result.stdout.strip()}" + elif platform.system() == "Windows": + # Windows + return f"Windows {platform.release()}" + elif platform.system() == "Linux": + # Linux - 尝试获取发行版信息 + try: + import distro + return f"{distro.name()} {distro.version()}" + except (ImportError, AttributeError): + return platform.platform() + else: + return platform.platform() + except Exception: + return platform.platform() + + def _get_disk_usage(self) -> str: + """获取磁盘使用情况""" + try: + usage = psutil.disk_usage('/') + free_gb = usage.free / (1024 ** 3) + total_gb = usage.total / (1024 ** 3) + percent_free = (free_gb / total_gb) * 100 + return f"{free_gb:.1f} GB ({percent_free:.1f}%)" + except Exception: + return "未知" + + def _get_memory_info(self) -> str: + """获取内存信息""" + try: + memory = psutil.virtual_memory() + total_gb = memory.total / (1024 ** 3) + return f"{total_gb:.1f} GB" + except Exception: + return "未知" \ No newline at end of file diff --git a/src/heurams/interface/screens/llmchat.py b/src/heurams/interface/screens/llmchat.py index b444de7..bd54e04 100644 --- a/src/heurams/interface/screens/llmchat.py +++ b/src/heurams/interface/screens/llmchat.py @@ -1,6 +1,3 @@ -"""LLM 聊天界面""" - -import asyncio from pathlib import Path from typing import Optional @@ -19,7 +16,7 @@ logger = get_logger(__name__) class LLMChatScreen(Screen): """LLM 聊天屏幕""" - SUB_TITLE = "AI 聊天" + SUB_TITLE = "语言模型集成" BINDINGS = [ ("q", "go_back", "返回"), ("ctrl+s", "save_session", "保存会话"), diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 79acb11..909dae2 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -5,7 +5,7 @@ from textual.containers import ScrollableContainer from textual.reactive import reactive from textual.screen import Screen from textual.widget import Widget -from textual.widgets import Button, Footer, Header, Label, Markdown, Static +from textual.widgets import Button, Footer, Header, Label, Markdown, Static, Rule, Sparkline import heurams.kernel.particles as pt import heurams.services.hasher as hasher @@ -34,6 +34,7 @@ class PreparationScreen(Screen): super().__init__(name=None, id=None, classes=None) self.repo = repo self.repostat = repostat + self.load_data() def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -43,7 +44,7 @@ class PreparationScreen(Screen): f"仓库路径: {config_var.get()['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]" ) yield Label(f"\n单元数量: {len(self.repo)}\n") - yield Label(f"单次记忆数量: {self.scheduled_num}", id="schnum_label") + yield Label(f"最小记忆分组: {self.scheduled_num}\n", id="schnum_label") yield Button( "开始记忆", @@ -58,11 +59,15 @@ class PreparationScreen(Screen): classes="precache-button", ) - yield Static(f"\n单元预览:\n") - for i in self._get_full_content().replace("/", "").splitlines(): + yield Static() + yield Sparkline(self.spark_line_arr, summary_function=max) + yield Rule() + #yield Static(str(self.spark_line_arr)) + yield Static(f"单元状态预览:\n") + for i in self.content.splitlines(): yield Static(i, classes="full") yield Footer() - + # def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num): # logger.debug("响应", old_scheduled_num, "->", new_scheduled_num) # try: @@ -71,14 +76,27 @@ class PreparationScreen(Screen): # except: # pass - def _get_full_content(self): + def load_data(self): content = "" + spark_line_arr = [] for i in self.repo.ident_index: n = pt.Nucleon.create_on_nucleonic_data( nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) ) - content += f" • {n['content']} \n" - return content + e = pt.Electron.create_on_electonic_data(electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i)) + statstr = "" + + if e.is_activated(): + statstr = '[#00ff00]A[/]' + if e.is_due(): + statstr = '[#ffff00]R[/]' + #statstr += ('[dim]' + str(e.rept(real_rept=True)).zfill(2)+'[/]') + else: + statstr = '[#ff0000]U[/]' + spark_line_arr.append(e.rept(real_rept=True)) + content += f" {statstr} {n['content'].replace('/', '')} \n" + self.content = content + self.spark_line_arr = spark_line_arr def action_go_back(self): self.app.pop_screen() diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 4833b12..8f4901c 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -53,6 +53,11 @@ class Electron: result = self.algo.is_due(self.algodata) return result and self.is_activated() + def rept(self, real_rept = False): + if real_rept: + return self.algodata[self.algo.algo_name]['real_rept'] + return self.algodata[self.algo.algo_name]['rept'] + def is_activated(self): result = self.algodata[self.algo.algo_name]["is_activated"] return result diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index 19cf55e..a22d80f 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -1,4 +1,3 @@ -from click import style from transitions import Machine import heurams.kernel.particles as pt diff --git a/uv.lock b/uv.lock index b6fcf41..5ad9fde 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.13" +requires-python = ">=3.10" [[package]] name = "aiohappyeyeballs" @@ -18,6 +18,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -26,6 +27,57 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, + { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, + { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, + { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, + { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, + { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, + { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, + { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, + { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701, upload-time = "2026-01-03T17:30:10.869Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678, upload-time = "2026-01-03T17:30:12.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, @@ -85,6 +137,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -105,6 +158,7 @@ name = "anyio" version = "3.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "sniffio" }, ] @@ -113,6 +167,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/24/44299477fe7dcc9cb58d0a57d5a7588d6af2ff403fdd2d47a246c91a3246/anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5", size = 80896, upload-time = "2023-07-05T16:44:59.805Z" }, ] +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, +] + [[package]] name = "attrs" version = "25.4.0" @@ -165,12 +228,88 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/21/6ebbc7fc6a4e58bcd49130273a072f7c2e4e6dc03735e078895b47148e30/edge_tts-7.0.2-py3-none-any.whl", hash = "sha256:effc554c249f02bd5013f28cd1faa22802e0757b031a7759be5960084ccb8d76", size = 26274, upload-time = "2025-05-03T10:34:15.872Z" }, ] +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "flet" +version = "0.80.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx", marker = "platform_system != 'Pyodide'" }, + { name = "msgpack" }, + { name = "oauthlib", marker = "platform_system != 'Pyodide'" }, + { name = "repath" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/80/0dbf92f0d829729be0f22721fa7dd6cffbdaca6017e51379f96666f20d65/flet-0.80.1.tar.gz", hash = "sha256:1ecfa713e46051c3b4b856ac9d46bb69aa476c51d35823b518387cfb2d415d64", size = 349528, upload-time = "2026-01-02T21:40:32.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/20/085201355f6525756ab32fc766e26559983ca6cbc0bd24e073846cf5492f/flet-0.80.1-py3-none-any.whl", hash = "sha256:645dfa7e0ff9648b94a3a47b6e0f26944046200e631e25f397bd4c5295067b9d", size = 440587, upload-time = "2026-01-02T21:40:30.988Z" }, +] + [[package]] name = "frozenlist" version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, + { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, + { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, + { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, + { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, @@ -256,24 +395,34 @@ dependencies = [ { name = "jieba" }, { name = "openai" }, { name = "playsound" }, + { name = "psutil" }, { name = "tabulate" }, { name = "textual" }, { name = "toml" }, { name = "transitions" }, ] +[package.dev-dependencies] +dev = [ + { name = "flet" }, +] + [package.metadata] requires-dist = [ { name = "edge-tts", specifier = "==7.0.2" }, { name = "jieba", specifier = "==0.42.1" }, { name = "openai", specifier = "==1.0.0" }, { name = "playsound", specifier = "==1.2.2" }, + { name = "psutil", specifier = ">=7.2.1" }, { name = "tabulate", specifier = ">=0.9.0" }, { name = "textual", specifier = "==7.0.0" }, { name = "toml", specifier = "==0.10.2" }, { name = "transitions", specifier = "==0.9.3" }, ] +[package.metadata.requires-dev] +dev = [{ name = "flet", specifier = ">=0.80.1" }] + [[package]] name = "httpcore" version = "1.0.9" @@ -367,12 +516,130 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + [[package]] name = "multidict" version = "6.7.0" source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153, upload-time = "2025-10-06T14:48:26.409Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993, upload-time = "2025-10-06T14:48:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607, upload-time = "2025-10-06T14:48:29.581Z" }, + { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847, upload-time = "2025-10-06T14:48:32.107Z" }, + { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616, upload-time = "2025-10-06T14:48:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333, upload-time = "2025-10-06T14:48:35.9Z" }, + { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239, upload-time = "2025-10-06T14:48:37.302Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618, upload-time = "2025-10-06T14:48:38.963Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655, upload-time = "2025-10-06T14:48:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245, upload-time = "2025-10-06T14:48:41.848Z" }, + { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523, upload-time = "2025-10-06T14:48:43.749Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129, upload-time = "2025-10-06T14:48:45.225Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999, upload-time = "2025-10-06T14:48:46.703Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711, upload-time = "2025-10-06T14:48:48.146Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504, upload-time = "2025-10-06T14:48:49.447Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422, upload-time = "2025-10-06T14:48:50.789Z" }, + { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050, upload-time = "2025-10-06T14:48:51.938Z" }, + { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153, upload-time = "2025-10-06T14:48:53.146Z" }, + { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, + { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, + { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, + { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, + { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, + { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, + { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, + { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, + { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, + { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, + { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, + { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, + { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, + { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, @@ -448,6 +715,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, ] +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + [[package]] name = "openai" version = "1.0.0" @@ -488,6 +764,51 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, + { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, + { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, + { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, + { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, + { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, @@ -551,6 +872,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] +[[package]] +name = "psutil" +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d", size = 129624, upload-time = "2025-12-29T08:26:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49", size = 130132, upload-time = "2025-12-29T08:26:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc", size = 180612, upload-time = "2025-12-29T08:26:08.276Z" }, + { url = "https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf", size = 183201, upload-time = "2025-12-29T08:26:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, + { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, + { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, + { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, + { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, +] + [[package]] name = "pydantic" version = "2.12.5" @@ -575,6 +924,47 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, + { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, + { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, + { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, + { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, @@ -617,6 +1007,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, + { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, + { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] @@ -628,6 +1042,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "repath" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/e1/824989291d0f01886074fdf9504ba54598f5665bc4dd373b589b87e76608/repath-0.9.0.tar.gz", hash = "sha256:8292139bac6a0e43fd9d70605d4e8daeb25d46672e484ed31a24c7ce0aef0fb7", size = 5492, upload-time = "2019-10-08T00:25:22.3Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/ed/92e9b8a3ffc562f21df14ef2538f54e911df29730e1f0d79130a4edc86e7/repath-0.9.0-py3-none-any.whl", hash = "sha256:ee079d6c91faeb843274d22d8f786094ee01316ecfe293a1eb6546312bb6a318", size = 4738, upload-time = "2019-10-08T00:25:20.842Z" }, +] + [[package]] name = "rich" version = "14.2.0" @@ -765,6 +1191,54 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, + { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, + { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, + { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, + { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, + { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, + { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, + { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, + { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, + { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, + { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, + { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, + { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, + { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, + { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, From 56f5dc076ed3b69c68f64db67271d9b268ee3ed1 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 15 Jan 2026 12:49:57 +0800 Subject: [PATCH 24/79] =?UTF-8?q?fix(interface):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=A0=87=E8=AF=86=E5=92=8C=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .python-version | 2 +- data/config/config.toml | 3 + pyproject.toml | 2 +- src/heurams/interface/__init__.py | 1 + src/heurams/interface/screens/configure.py | 0 src/heurams/interface/screens/memoqueue.py | 2 + src/heurams/interface/screens/navigator.py | 1 + src/heurams/interface/widgets/cloze_puzzle.py | 1 + src/heurams/interface/widgets/mcq_puzzle.py | 2 +- uv.lock | 257 +----------------- 10 files changed, 12 insertions(+), 259 deletions(-) create mode 100644 src/heurams/interface/screens/configure.py diff --git a/.python-version b/.python-version index c8cfe39..e4fba21 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.10 +3.12 diff --git a/data/config/config.toml b/data/config/config.toml index fc1c2bc..d6fd9f2 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -8,6 +8,9 @@ timestamp_override = -1 # [调试] 一键通过 quick_pass = true +# [调试] 自动化测试模式(仅用于测试完整性) +auto_pass = false + # 对于每个项目的默认新记忆原子数量 scheduled_num = 8 diff --git a/pyproject.toml b/pyproject.toml index cecd172..2a76263 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ readme = "README.md" authors = [ { name = "pluvium27", email = "pluvium27@outlook.com" } ] -requires-python = ">=3.10" +requires-python = ">=3.12" dependencies = [ "edge-tts==7.0.2", "jieba==0.42.1", diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 5142d97..d1ac262 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -57,6 +57,7 @@ class HeurAMSApp(App): "radio": RadioScreen, "repo_editor": RepoEditorScreen, "llmchat": LLMChatScreen, +# "config": ConfigScreen, } def on_mount(self) -> None: diff --git a/src/heurams/interface/screens/configure.py b/src/heurams/interface/screens/configure.py new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 35f58bf..afab256 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -70,6 +70,7 @@ class MemScreen(Screen): """更新状态机""" self.procession: Procession = self.phaser.current_procession() # type: ignore self.atom: pt.Atom = self.procession.current_atom # type: ignore + def on_mount(self): self.fission = self.procession.get_fission() @@ -176,6 +177,7 @@ class MemScreen(Screen): self.forward(new_rating) self.rating = -1 + def forward(self, rating): self.update_state() allow_forward = 1 if rating >= 4 else 0 diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index 4739a1a..cedb038 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -29,6 +29,7 @@ class NavigatorScreen(ModalScreen): # ("创建仓库", "repo_creator"), ("缓存管理器", "precache_all"), ("收藏夹管理器", FavoriteManagerScreen), + ("配置设置", "config"), ("关于此软件", "about"), ("调试日志", "logviewer"), # ("同步工具", "synctool"), diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index c140dba..67794bc 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -9,6 +9,7 @@ from textual.widgets import Button, Label import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz +from heurams.services.hasher import hash from heurams.services.logger import get_logger from .base_puzzle_widget import BasePuzzleWidget diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 84ed336..d724a15 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -152,7 +152,7 @@ class MCQPuzzle(BasePuzzleWidget): for option in current_options: button_id = f"sel{str(self.cursor).zfill(3)}-{hash(option)}" if button_id not in self.hashmap: - self.hashmap[button_id] = option + self.hashmap[button_id[7:]] = option new_button = Button(option, id=button_id) container.mount(new_button) diff --git a/uv.lock b/uv.lock index 5ad9fde..864f120 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.10" +requires-python = ">=3.12" [[package]] name = "aiohappyeyeballs" @@ -18,7 +18,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -27,40 +26,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, - { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, - { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, - { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, - { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, - { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, - { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, - { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, - { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, - { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, - { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, - { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, - { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, - { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, - { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701, upload-time = "2026-01-03T17:30:10.869Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678, upload-time = "2026-01-03T17:30:12.719Z" }, { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, @@ -158,7 +123,6 @@ name = "anyio" version = "3.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "sniffio" }, ] @@ -167,15 +131,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/24/44299477fe7dcc9cb58d0a57d5a7588d6af2ff403fdd2d47a246c91a3246/anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5", size = 80896, upload-time = "2023-07-05T16:44:59.805Z" }, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - [[package]] name = "attrs" version = "25.4.0" @@ -228,18 +183,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/21/6ebbc7fc6a4e58bcd49130273a072f7c2e4e6dc03735e078895b47148e30/edge_tts-7.0.2-py3-none-any.whl", hash = "sha256:effc554c249f02bd5013f28cd1faa22802e0757b031a7759be5960084ccb8d76", size = 26274, upload-time = "2025-05-03T10:34:15.872Z" }, ] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - [[package]] name = "flet" version = "0.80.1" @@ -249,7 +192,6 @@ dependencies = [ { name = "msgpack" }, { name = "oauthlib", marker = "platform_system != 'Pyodide'" }, { name = "repath" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/80/0dbf92f0d829729be0f22721fa7dd6cffbdaca6017e51379f96666f20d65/flet-0.80.1.tar.gz", hash = "sha256:1ecfa713e46051c3b4b856ac9d46bb69aa476c51d35823b518387cfb2d415d64", size = 349528, upload-time = "2026-01-02T21:40:32.697Z" } wheels = [ @@ -262,38 +204,6 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, - { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, - { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, - { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, - { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, - { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, - { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, - { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, - { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, - { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, - { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, - { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, @@ -522,23 +432,6 @@ version = "1.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, - { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, - { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, - { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, - { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, - { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, - { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, - { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, - { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, - { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, - { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, - { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, - { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, @@ -581,47 +474,8 @@ wheels = [ name = "multidict" version = "6.7.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153, upload-time = "2025-10-06T14:48:26.409Z" }, - { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993, upload-time = "2025-10-06T14:48:28.4Z" }, - { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607, upload-time = "2025-10-06T14:48:29.581Z" }, - { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847, upload-time = "2025-10-06T14:48:32.107Z" }, - { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616, upload-time = "2025-10-06T14:48:34.054Z" }, - { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333, upload-time = "2025-10-06T14:48:35.9Z" }, - { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239, upload-time = "2025-10-06T14:48:37.302Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618, upload-time = "2025-10-06T14:48:38.963Z" }, - { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655, upload-time = "2025-10-06T14:48:40.312Z" }, - { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245, upload-time = "2025-10-06T14:48:41.848Z" }, - { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523, upload-time = "2025-10-06T14:48:43.749Z" }, - { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129, upload-time = "2025-10-06T14:48:45.225Z" }, - { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999, upload-time = "2025-10-06T14:48:46.703Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711, upload-time = "2025-10-06T14:48:48.146Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504, upload-time = "2025-10-06T14:48:49.447Z" }, - { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422, upload-time = "2025-10-06T14:48:50.789Z" }, - { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050, upload-time = "2025-10-06T14:48:51.938Z" }, - { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153, upload-time = "2025-10-06T14:48:53.146Z" }, - { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, - { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, - { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, - { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, - { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, - { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, - { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, - { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, - { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, - { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, - { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, - { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, @@ -764,36 +618,6 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, - { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, - { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, - { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, - { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, - { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, - { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, - { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, - { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, - { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, - { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, - { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, - { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, - { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, - { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, - { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, @@ -924,33 +748,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, @@ -1007,30 +804,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] @@ -1191,38 +968,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, - { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, - { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, - { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, - { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, - { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, - { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, - { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, - { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, - { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, - { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, - { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, - { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, - { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, - { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, - { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, - { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, - { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, - { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, - { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, - { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, - { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, - { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, From 76c9537ff04238dfdbfb56c02b6e307550c19504 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 17 Jan 2026 05:45:45 +0800 Subject: [PATCH 25/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + pyproject.toml | 1 + src/heurams/interface/screens/about.py | 33 ++-- src/heurams/interface/widgets/recognition.py | 2 +- src/heurams/kernel/particles/nucleon.py | 29 +++- src/heurams/tools/csv2payload.py | 158 +++++++++++++++++++ uv.lock | 30 ++++ 7 files changed, 229 insertions(+), 25 deletions(-) create mode 100755 src/heurams/tools/csv2payload.py diff --git a/.gitignore b/.gitignore index bee63b2..26c67b7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ .idea/ cache/ data/repo/cngk +data/repo/eotgk *.egg-info/ build/ dist/ diff --git a/pyproject.toml b/pyproject.toml index 2a76263..e4a829c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "openai==1.0.0", "playsound==1.2.2", "psutil>=7.2.1", + "pygobject>=3.54.5", "tabulate>=0.9.0", "textual==7.0.0", "toml==0.10.2", diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 782362f..beff979 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -41,21 +41,24 @@ class AboutScreen(Screen): 一个基于启发式算法的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. -以 AGPL-3.0 开放源代码 +以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. -您可在项目主页 https://ams.imwangzhiyu.xyz 获取用户指南, 开发文档与软件更新 +您可在项目主页 https://ams.imwangzhiyu.xyz 获取用户指南, 开发文档与软件更新. -如果您觉得这个软件有用, 请给它添加一个星标 :) +如果您觉得这个软件有用, 可以给它添加一个星标 :) -我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. +> 此软件, 以及它作为一个"程序库"是自由且免费的, 但是开发工作必须投入大量精力 +> 即使您不是软件开发人员, 我们也欢迎您加入 HeurAMS 的队伍! +> 您可以加入各种语言的翻译团队来翻译软件的界面, 您还可以制作图像、主题、音效, 或者改进软件配套的文档…… +> 不管您来自何方, 我们都欢迎您加入社区并做出贡献. +> 我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. +> 您的慷慨支持, 我们必当涌泉相报. -不管您来自何方, 我们都欢迎您加入社区并做出贡献. +开发人员列表: -开发人员: +- Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 发起项目与主要维护者 -- Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 项目作者 - -特别感谢: +特别感谢以下人士, 他们的算法与理论构成了此软件算法的基石: - [Piotr A. Woźniak](https://supermemo.guru/wiki/Piotr_Wozniak): SM-2 算法与 SM-15 算法理论 - [Kazuaki Tanida](https://github.com/slaypni): SM-15 算法的 CoffeeScript 实现 @@ -64,18 +67,14 @@ class AboutScreen(Screen): # 运行环境信息 -Textual 框架版本: {textual_version} - -终端模拟器: {terminal_info} - Python 解释器版本: {python_version} - +Textual 框架版本: {textual_version} +终端模拟器: {terminal_info} 操作系统版本: {os_version} - 存储余量: {disk_usage} - 内存大小: {memory_info} - + +报告问题时, 请复制这些信息到问题描述, 并上传软件日志 `heurams.log` 作为附件, 以协助开发者定位错误 """ yield Markdown(about_text, classes="about-markdown") diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index f56f963..142d959 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -95,7 +95,7 @@ class Recognition(BasePuzzleWidget): if isinstance(item, Dict): total = "" for j, k in item.items(): # type: ignore - total += f"> **{j}**: {k} \n" + total += f"> {j}: {k} \n" yield Markdown(total) if isinstance(item, str): yield Markdown(item) diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 9369bba..9015be7 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -13,13 +13,28 @@ class Nucleon: def __init__(self, ident, payload, common): self.ident = ident - env = { - "payload": payload, - "default": config_var.get()["puzzles"], - "nucleon": (payload | common), - } - self.evalizer = Evalizer(environment=env) - self.data: dict = self.evalizer(deepcopy((payload | common))) # type: ignore + try: + data_safe = deepcopy((payload | common)) + data_puz = deepcopy(data_safe['puzzles']) + data_safe['puzzles'] = {} + env = { + "payload": data_safe, + "default": config_var.get()["puzzles"], + "nucleon": data_safe, + } + self.evalizer = Evalizer(environment=env) + data_safe = self.evalizer(deepcopy(data_safe)) + env = { + "payload": data_safe, + "default": config_var.get()["puzzles"], + "nucleon": data_safe, + } + self.evalizer = Evalizer(environment=env) + data_puz = self.evalizer(deepcopy(data_puz)) + data_safe['puzzles'] = data_puz # type: ignore + self.data: dict = data_safe # type: ignore + except Exception: + self.data = (payload | common) def __getitem__(self, key): if isinstance(key, str): diff --git a/src/heurams/tools/csv2payload.py b/src/heurams/tools/csv2payload.py new file mode 100755 index 0000000..a32cb20 --- /dev/null +++ b/src/heurams/tools/csv2payload.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +""" +将符合条件的CSV转为符合Payload需要的TOML格式 + +使用命令: python3 csv2payload.py <生成TOML路径, 默认为文件名相同, 后缀为toml的TOML文件> + + +转换规则: +1. `ident` 列用作 TOML 的 section 标题(`[ident]`) +2. 若某行的 `ident` 为空,则自动按顺序生成标识符,例如 `idx_1`、`idx_2` 等 +3. 所有其他列(除 `ident` 外)都作为该 section 下的键值对 +4. 所有列都是可选的,但 `ident` 为空时会自动生成 + +示例 CSV: +```csv +ident, content, meaning, ... +"Fox", "Fox", "狐狸(一种动物)", ... +"Dog", "Dog", "狗(一种比猫聪明的动物)", ... +"Cat", "Cat", "猫(一种不如狗聪明的动物)", ... +"Dolphin", "Dolphin", "一种很聪明的海洋哺乳动物", ... +, "Duck", "一种扁嘴水禽" +, "Meow", "猫发出的声音" +"Doge", "Doge", "神烦狗(一张搞笑狗狗表情包的代称)", ... +, "Woof", "狗发出的声音" +``` + +转换后的 TOML: +```toml +[Fox] +content = "Fox" +meaning = "狐狸(一种动物)" + +[Dog] +content = "Dog" +meaning = "狗(一种比猫聪明的动物)" + +[Cat] +content = "Cat" +meaning = "猫(一种不如狗聪明的动物)" + +[Dolphin] +content = "Dolphin" +meaning = "一种很聪明的海洋哺乳动物" + +[idx_1] +content = "Duck" +meaning = "一种扁嘴水禽" + +[idx_2] +content = "Meow" +meaning = "猫发出的声音" + +[Doge] +content = "Doge" +meaning = "神烦狗(一张搞笑狗狗表情包的代称)" + +[idx_3] +content = "Woof" +meaning = "狗发出的声音" +``` + +补充说明: +- 自动生成的标识符使用 `idx_` 前缀加数字序列 +- 生成序列基于原始 CSV 中 `ident` 为空的行出现的顺序 +- 所有值都保留为字符串类型,符合 TOML 字符串格式要求 +- 如果 CSV 包含更多列,它们也会以相同方式转换为键值对 +""" +import csv +import sys +import os +from pathlib import Path + +def csv_to_toml(csv_path, toml_path=None): + """ + 将CSV文件转换为TOML格式 + + Args: + csv_path (str): 输入CSV文件路径 + toml_path (str): 输出TOML文件路径,默认为相同目录下同名文件 + """ + # 检查CSV文件是否存在 + csv_file = Path(csv_path) + if not csv_file.exists(): + print(f"错误: CSV文件不存在 - {csv_path}") + sys.exit(1) + + # 确定输出TOML文件路径 + if toml_path is None: + toml_path = csv_file.with_suffix('.toml') + else: + toml_path = Path(toml_path) + + # 读取CSV文件 + try: + with open(csv_file, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + rows = list(reader) + except Exception as e: + print(f"错误: 无法读取CSV文件 - {e}") + sys.exit(1) + + # 检查CSV文件是否有数据 + if not rows: + print("错误: CSV文件为空或格式不正确") + sys.exit(1) + + # 生成TOML内容 + toml_content = [] + idx_counter = 1 + + for row in rows: + # 处理ident列,为空时生成自动标识符 + ident = row.get('ident', '').strip() + if not ident: + ident = f"idx_{idx_counter}" + idx_counter += 1 + + # 添加section标题 + toml_content.append(f"[{ident}]") + + # 添加所有其他列作为键值对(排除ident列) + for key, value in row.items(): + if key == 'ident': + continue + + # 确保值存在且不为空 + if value is not None and str(value).strip() != '': + # 转义特殊字符并添加引号 + escaped_value = str(value).replace('"', '\\"') + toml_content.append(f'"{key}" = "{escaped_value}"') + + # section之间添加空行 + toml_content.append("") + + # 写入TOML文件 + try: + with open(toml_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(toml_content).strip()) + print(f"成功: 已生成TOML文件 - {toml_path}") + except Exception as e: + print(f"错误: 无法写入TOML文件 - {e}") + sys.exit(1) + +def main(): + """主函数""" + if len(sys.argv) < 2: + print("用法: python3 csv2payload.py []") + print("示例: python3 csv2payload.py input.csv output.toml") + print("示例: python3 csv2payload.py input.csv # 自动生成input.toml") + sys.exit(1) + + csv_path = sys.argv[1] + toml_path = sys.argv[2] if len(sys.argv) > 2 else None + + csv_to_toml(csv_path, toml_path) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/uv.lock b/uv.lock index 864f120..7581f96 100644 --- a/uv.lock +++ b/uv.lock @@ -306,6 +306,7 @@ dependencies = [ { name = "openai" }, { name = "playsound" }, { name = "psutil" }, + { name = "pygobject" }, { name = "tabulate" }, { name = "textual" }, { name = "toml" }, @@ -324,6 +325,7 @@ requires-dist = [ { name = "openai", specifier = "==1.0.0" }, { name = "playsound", specifier = "==1.2.2" }, { name = "psutil", specifier = ">=7.2.1" }, + { name = "pygobject", specifier = ">=3.54.5" }, { name = "tabulate", specifier = ">=0.9.0" }, { name = "textual", specifier = "==7.0.0" }, { name = "toml", specifier = "==0.10.2" }, @@ -724,6 +726,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, ] +[[package]] +name = "pycairo" +version = "1.29.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/28/6363087b9e60af031398a6ee5c248639eefc6cc742884fa2789411b1f73b/pycairo-1.29.0-cp312-cp312-win32.whl", hash = "sha256:91bcd7b5835764c616a615d9948a9afea29237b34d2ed013526807c3d79bb1d0", size = 751486, upload-time = "2025-11-11T19:11:54.451Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d2/d146f1dd4ef81007686ac52231dd8f15ad54cf0aa432adaefc825475f286/pycairo-1.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f01c3b5e49ef9411fff6bc7db1e765f542dc1c9cfed4542958a5afa3a8b8e76", size = 845383, upload-time = "2025-11-11T19:12:01.551Z" }, + { url = "https://files.pythonhosted.org/packages/01/16/6e6f33bb79ec4a527c9e633915c16dc55a60be26b31118dbd0d5859e8c51/pycairo-1.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:eafe3d2076f3533535ad4a361fa0754e0ee66b90e548a3a0f558fed00b1248f2", size = 694518, upload-time = "2025-11-11T19:12:06.561Z" }, + { url = "https://files.pythonhosted.org/packages/f0/21/3f477dc318dd4e84a5ae6301e67284199d7e5a2384f3063714041086b65d/pycairo-1.29.0-cp313-cp313-win32.whl", hash = "sha256:3eb382a4141591807073274522f7aecab9e8fa2f14feafd11ac03a13a58141d7", size = 750949, upload-time = "2025-11-11T19:12:12.198Z" }, + { url = "https://files.pythonhosted.org/packages/43/34/7d27a333c558d6ac16dbc12a35061d389735e99e494ee4effa4ec6d99bed/pycairo-1.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:91114e4b3fbf4287c2b0788f83e1f566ce031bda49cf1c3c3c19c3e986e95c38", size = 844149, upload-time = "2025-11-11T19:12:19.171Z" }, + { url = "https://files.pythonhosted.org/packages/15/43/e782131e23df69e5c8e631a016ed84f94bbc4981bf6411079f57af730a23/pycairo-1.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:09b7f69a5ff6881e151354ea092137b97b0b1f0b2ab4eb81c92a02cc4a08e335", size = 693595, upload-time = "2025-11-11T19:12:23.445Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, + { url = "https://files.pythonhosted.org/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, + { url = "https://files.pythonhosted.org/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, +] + [[package]] name = "pydantic" version = "2.12.5" @@ -819,6 +840,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pygobject" +version = "3.54.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycairo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/a5/68f883df1d8442e3b267cb92105a4b2f0de819bd64ac9981c2d680d3f49f/pygobject-3.54.5.tar.gz", hash = "sha256:b6656f6348f5245606cf15ea48c384c7f05156c75ead206c1b246c80a22fb585", size = 1274658, upload-time = "2025-10-18T13:45:03.121Z" } + [[package]] name = "repath" version = "0.9.0" From 26e053f79feabe564d4bf45a73cad0ee59ebfee5 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 22 Jan 2026 06:13:01 +0800 Subject: [PATCH 26/79] =?UTF-8?q?feat(interface):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E4=BB=AA=E8=A1=A8=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + examples/data/config/config.toml | 56 ------------- src/heurams/context.py | 38 ++------- src/heurams/default/config/config.toml | 56 ------------- src/heurams/interface/__init__.py | 38 +++------ src/heurams/interface/__main__.py | 29 ++++--- src/heurams/interface/css/main.tcss | 17 ++++ src/heurams/interface/screens/dashboard.py | 48 +++++++---- src/heurams/interface/screens/preparation.py | 65 ++++++++------- src/heurams/interface/widgets/cloze_puzzle.py | 15 +++- src/heurams/interface/widgets/recognition.py | 4 +- src/heurams/kernel/reactor/fission.py | 7 +- src/heurams/services/config.py | 82 +++++++++++++++++-- src/heurams/tools/csv2payload.py | 41 +++++++--- 14 files changed, 249 insertions(+), 248 deletions(-) delete mode 100644 examples/data/config/config.toml delete mode 100644 src/heurams/default/config/config.toml diff --git a/.gitignore b/.gitignore index 26c67b7..db6916d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ __pycache__/ cache/ data/repo/cngk data/repo/eotgk +data/repo/evtgk *.egg-info/ build/ dist/ diff --git a/examples/data/config/config.toml b/examples/data/config/config.toml deleted file mode 100644 index 22c0f2f..0000000 --- a/examples/data/config/config.toml +++ /dev/null @@ -1,56 +0,0 @@ -# [调试] 将更改保存到文件 -persist_to_file = 1 - -# [调试] 覆写时间, 设为 -1 以禁用 -daystamp_override = -1 -timestamp_override = -1 - -# [调试] 一键通过 -quick_pass = 1 - -# 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 - -# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -timezone_offset = +28800 # 中国标准时间 (UTC+8) - -[interface] - -[interface.memorizor] -autovoice = true # 自动语音播放, 仅限于 recognition 组件 - -[algorithm] -default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS - -[puzzles] # 谜题默认配置 - -[puzzles.mcq] -max_riddles_num = 2 - -[puzzles.cloze] -min_denominator = 3 - -[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -data = "./data" - -[services] # 定义服务到提供者的映射 -audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) -tts = "edgetts" # 可选项: edgetts -llm = "openai" # 可选项: openai -sync = "webdav" # 可选项: 留空, webdav - -[providers.tts.edgetts] # EdgeTTS 设置 -voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - -[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 -url = "" -key = "" - -[providers.sync.webdav] # WebDAV 同步设置 -url = "" -username = "" -password = "" -remote_path = "/heurams/" -verify_ssl = true - -[sync] diff --git a/src/heurams/context.py b/src/heurams/context.py index b9ea142..d4d4521 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -4,7 +4,6 @@ """ import pathlib -import shutil from contextvars import ContextVar from heurams.services.config import ConfigFile @@ -15,40 +14,19 @@ from heurams.services.logger import get_logger # 数据文件路径规定: 以运行目录为准 rootdir = pathlib.Path(__file__).parent -print(f"项目根目录: {rootdir}") +workdir = pathlib.Path.cwd() +#print(f"项目根目录: {rootdir}") +#print(f"工作目录: {workdir}") logger = get_logger(__name__) logger.debug(f"项目根目录: {rootdir}") -workdir = pathlib.Path.cwd() -print(f"工作目录: {workdir}") logger.debug(f"工作目录: {workdir}") -if pathlib.Path(workdir / "data" / "config" / "config_dev.toml").exists(): - print("使用开发设置") - logger.debug("使用开发设置") - config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", - default=ConfigFile(workdir / "data" / "config" / "config_dev.toml"), - ) -else: - try: - config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", - default=ConfigFile(workdir / "data" / "config" / "config.toml"), - ) # 配置文件 - except Exception as e: - input("按下回车以创建新的配置文件, 或按下 Ctrl + C 以终止程序 ") - (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) - (workdir / "data" / "config" / "config").unlink(missing_ok=True) - shutil.copy( - (rootdir / "default" / "config" / "config.toml"), - workdir / "data" / "config" / "config.toml", - ) - finally: - config_var: ContextVar[ConfigFile] = ContextVar( - "config_var", - default=ConfigFile(workdir / "data" / "config" / "config.toml"), - ) # 配置文件 +(workdir / "data" / "config").mkdir(parents=True, exist_ok=True) +config_var: ContextVar[ConfigFile] = ContextVar( + "config_var", + default=ConfigFile(workdir / "data" / "config" / "config.toml"), +) class ConfigContext: """ diff --git a/src/heurams/default/config/config.toml b/src/heurams/default/config/config.toml deleted file mode 100644 index 22c0f2f..0000000 --- a/src/heurams/default/config/config.toml +++ /dev/null @@ -1,56 +0,0 @@ -# [调试] 将更改保存到文件 -persist_to_file = 1 - -# [调试] 覆写时间, 设为 -1 以禁用 -daystamp_override = -1 -timestamp_override = -1 - -# [调试] 一键通过 -quick_pass = 1 - -# 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 - -# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -timezone_offset = +28800 # 中国标准时间 (UTC+8) - -[interface] - -[interface.memorizor] -autovoice = true # 自动语音播放, 仅限于 recognition 组件 - -[algorithm] -default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS - -[puzzles] # 谜题默认配置 - -[puzzles.mcq] -max_riddles_num = 2 - -[puzzles.cloze] -min_denominator = 3 - -[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -data = "./data" - -[services] # 定义服务到提供者的映射 -audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) -tts = "edgetts" # 可选项: edgetts -llm = "openai" # 可选项: openai -sync = "webdav" # 可选项: 留空, webdav - -[providers.tts.edgetts] # EdgeTTS 设置 -voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - -[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 -url = "" -key = "" - -[providers.sync.webdav] # WebDAV 同步设置 -url = "" -username = "" -password = "" -remote_path = "/heurams/" -verify_ssl = true - -[sync] diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index d1ac262..cf37948 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -1,12 +1,15 @@ -from typing import Type +from time import sleep +print("欢迎使用基本用户界面!") +print("加载配置... ", end="", flush=True) +from heurams.context import * +print("已完成!") +print("加载用户界面框架... ", end="", flush=True) from textual.app import App -from textual.driver import Driver from textual.widgets import Button +print("已完成!") -from heurams.context import config_var -from heurams.services.logger import get_logger - +print("加载用户界面布局... ", end="", flush=True) from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen from .screens.llmchat import LLMChatScreen @@ -16,27 +19,9 @@ from .screens.radio import RadioScreen from .screens.repocreator import RepoCreatorScreen from .screens.repoeditor import RepoEditorScreen from .screens.synctool import SyncScreen - -logger = get_logger(__name__) - - -def environment_check(): - from pathlib import Path - - logger.debug("检查环境路径") - subdir = ["cache/voice", "repo", "global", "config"] - for i in subdir: - i = Path(config_var.get()["paths"]["data"]) / i - if not i.exists(): - logger.info("创建目录: %s", i) - print(f"创建 {i}") - i.mkdir(exist_ok=True, parents=True) - else: - logger.debug("目录已存在: %s", i) - print(f"找到 {i}") - logger.debug("环境检查完成") - - +print("已完成!") +print(f"组件目录: {rootdir}") +print(f"工作目录: {workdir}") class HeurAMSApp(App): TITLE = "潜进" CSS_PATH = "css/main.tcss" @@ -61,7 +46,6 @@ class HeurAMSApp(App): } def on_mount(self) -> None: - environment_check() self.push_screen("dashboard") def on_button_pressed(self, event: Button.Pressed) -> None: diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 4681ca9..3600fe7 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -1,20 +1,29 @@ -from textual.app import App -from textual.widgets import Button - +from heurams.interface import * from heurams.context import config_var -from heurams.interface import HeurAMSApp from heurams.services.logger import get_logger -from .screens.about import AboutScreen -from .screens.dashboard import DashboardScreen -from .screens.precache import PrecachingScreen -from .screens.repocreator import RepoCreatorScreen - logger = get_logger(__name__) +def environment_check(): + from pathlib import Path + + logger.debug("检查环境路径") + subdir = ["cache/voice", "repo", "global", "config"] + for i in subdir: + i = Path(config_var.get()["paths"]["data"]) / i + if not i.exists(): + logger.info("创建目录: %s", i) + print(f"创建 {i}") + i.mkdir(exist_ok=True, parents=True) + else: + logger.debug("目录已存在: %s", i) + print(f"找到 {i}") + logger.debug("环境检查完成") + def main(): + environment_check() app = HeurAMSApp() - app.run() + app.run(inline=False) if __name__ == "__main__": main() \ No newline at end of file diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index f060ddd..8314c2d 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -1,7 +1,20 @@ + + NavigatorScreen { align: center middle; } + +.repo_listitem { + layout: grid; + grid-size: 2; +} + +.repo_listitem_btn { + dock: right; + offset: -5% 0 +} + #dialog { grid-size: 2; grid-gutter: 1 1; @@ -40,6 +53,10 @@ LLMChatScreen { background: $surface; } +#dashboardtop { + height: 4 +} + #input-container { height: 3; margin-top: 1; diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index a0e7f78..9964a26 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -1,12 +1,14 @@ """仪表盘界面""" +from functools import reduce import pathlib from pathlib import Path from textual.app import ComposeResult -from textual.containers import ScrollableContainer +from textual.containers import ScrollableContainer, Container, Horizontal, Vertical from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static +from textual.layouts import horizontal import heurams.kernel.particles as pt import heurams.services.timer as timer @@ -42,21 +44,35 @@ class DashboardScreen(Screen): self.repostat = {} self.title2dirname = {} self.title2repo = {} + self.dirname2repo = {} self._load_data() def compose(self) -> ComposeResult: """组合界面组件""" yield Header(show_clock=True) - yield ScrollableContainer( - Label('欢迎使用 "潜进" 启发式辅助记忆调度器', classes="title-label"), - Label( - f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()['timezone_offset'] / 3600})" - ), - Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), - Label("选择待学习或待修改的项目:", classes="title-label"), - ListView(id="repo-list", classes="repo-list-view"), - Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} '), - ) + with ScrollableContainer(): + yield Horizontal( + Vertical( + Label('欢迎使用 "潜进" 启发式辅助记忆调度器'), + Label( + f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()['timezone_offset'] / 3600})" + ), + Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), + Label("选择待学习或待修改的项目:"), + classes="column", + ), + Vertical( + Label(f"已加载 {len(self.repostat)} 个单元集", classes='dataview'), + Label(f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.get('unit_sum'), self.repostat.values()))} 个单元", classes='dataview'), + Label(f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.get('activated_sum'), self.repostat.values()))} 个单元", classes='dataview'), + Label(""), + classes="column", + ), + id="dashboardtop" + ) + + yield ListView(id="repo-list", classes="repo-list-view") + yield Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} ') yield Footer() def _load_data(self): @@ -105,6 +121,7 @@ class DashboardScreen(Screen): self.repostat[dirname] = stat self.title2dirname[title] = dirname self.title2repo[title] = repo + self.dirname2repo[dirname] = repo def on_mount(self) -> None: """挂载组件时初始化""" @@ -132,7 +149,7 @@ class DashboardScreen(Screen): for repotitle in repotitles: prompt = self.repostat[self.title2dirname[repotitle]]["prompt"] - list_item = ListItem(Label(prompt)) + list_item = ListItem(Label(prompt), Button(f"开始学习", flat=True, variant="primary", classes="repo_listitem_btn", id=f"launch_{self.repostat[self.title2dirname[repotitle]]['dirname']}"), classes="repo_listitem") repo_list_widget.append(list_item) # if not self.stay_enabled[repodir]: @@ -169,6 +186,9 @@ class DashboardScreen(Screen): self.app.push_screen(NavigatorScreen()) def on_button_pressed(self, event: Button.Pressed) -> None: + logger.debug(f"event.button.id: {event.button.id}") """处理按钮点击事件""" - if event.button.id == "navigator-button": - self.action_open_navigator() + if str(event.button.id).startswith("launch_"): # type: ignore + from .preparation import launch + launch(repo=self.dirname2repo[event.button.id[7:]], app=self.app, scheduled_num=-1) # type: ignore + # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 \ No newline at end of file diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 909dae2..3ae7459 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -123,36 +123,41 @@ class PreparationScreen(Screen): event.stop() logger.debug("按下按钮") if event.button.id == "start_memorizing_button": - atoms = list() - for i in self.repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data( - nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) - ) - e = pt.Electron.create_on_electonic_data( - electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i) - ) - a = pt.Atom(n, e, self.repo.orbitic_data) - atoms.append(a) - - atoms_to_provide = list() - left_new = self.scheduled_num - for i in atoms: - i: pt.Atom - if i.registry["electron"].is_activated(): - if i.registry["electron"].is_due(): - atoms_to_provide.append(i) - else: - left_new -= 1 - if left_new >= 0: - atoms_to_provide.append(i) - import heurams.kernel.reactor as rt - - from .memoqueue import MemScreen - - pheser = rt.Phaser(atoms_to_provide) - save_func = self.repo.persist_to_repodir - memscreen = MemScreen(pheser, save_func, repo=self.repo) - self.app.push_screen(memscreen) + launch(repo=self.repo, app=self.app, scheduled_num=self.scheduled_num) elif event.button.id == "precache_button": self.action_precache() + +def launch(repo, app, scheduled_num): + if scheduled_num == -1: + scheduled_num = config_var.get()["scheduled_num"] + atoms = list() + for i in repo.ident_index: + n = pt.Nucleon.create_on_nucleonic_data( + nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) + ) + e = pt.Electron.create_on_electonic_data( + electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + ) + a = pt.Atom(n, e, repo.orbitic_data) + atoms.append(a) + + atoms_to_provide = list() + left_new = scheduled_num + for i in atoms: + i: pt.Atom + if i.registry["electron"].is_activated(): + if i.registry["electron"].is_due(): + atoms_to_provide.append(i) + else: + left_new -= 1 + if left_new >= 0: + atoms_to_provide.append(i) + import heurams.kernel.reactor as rt + + from .memoqueue import MemScreen + + pheser = rt.Phaser(atoms_to_provide) + save_func = repo.persist_to_repodir + memscreen = MemScreen(pheser, save_func, repo=repo) + app.push_screen(memscreen) diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 67794bc..b0e3bd8 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -5,7 +5,7 @@ from typing import TypedDict from textual.containers import Container from textual.message import Message from textual.widget import Widget -from textual.widgets import Button, Label +from textual.widgets import Button, Label, Markdown import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz @@ -66,7 +66,7 @@ class ClozePuzzle(BasePuzzleWidget): def compose(self): yield Label(self.puzzle.wording, id="sentence") - yield Label(f"当前输入: {self.inputlist}", id="inputpreview") + yield Markdown(f"> {self.listprint(self.inputlist)}", id="inputpreview") # 渲染当前问题的选项 with Container(id="btn-container"): for i in self.ans: @@ -77,9 +77,18 @@ class ClozePuzzle(BasePuzzleWidget): yield Button("退格", id="delete") + def listprint(self, lst): + s = "" + if lst: + lastone = lst[-1] + for i in lst[:-1]: + s += (i + ' ') + s += f" `{lastone}`" + return s + def update_display(self): preview = self.query_one("#inputpreview") - preview.update(f"当前输入: {self.inputlist}") # type: ignore + preview.update(f"> {self.listprint(self.inputlist)}") # type: ignore def on_button_pressed(self, event: Button.Pressed) -> None: button_id = event.button.id diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 142d959..67f6091 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -67,9 +67,7 @@ class Recognition(BasePuzzleWidget): f";{delim}": ";", f":{delim}": ":", } - - nucleon = self.atom.registry["nucleon"] - metadata = self.atom.registry["nucleon"] + primary = cfg["primary"] with Center(): diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 7d5812b..cba67cd 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -49,13 +49,16 @@ class Fission(Machine): self.min_ratings = [] for item, possibility in orbital_schedule: # type: ignore logger.debug(f"开始处理: {item}") + + puzzle = puz.puzzles[orbital_puzzles[item]["__origin__"]] + if not isinstance(possibility, float): possibility = float(possibility) while possibility > 1: self.puzzles_inf.append( { - "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], + "puzzle": puzzle, "alia": item, } ) @@ -64,7 +67,7 @@ class Fission(Machine): if random.random() <= possibility: self.puzzles_inf.append( { - "puzzle": puz.puzzles[orbital_puzzles[item]["__origin__"]], + "puzzle": puzzle, "alia": item, } ) diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index 06bf48c..c71cc6b 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -6,15 +6,81 @@ import toml from heurams.services.logger import get_logger +default_config = { + "persist_to_file": 1, # 将更改保存到文件 + "daystamp_override": -1, # 覆写时间, 设为 -1 以禁用 + "timestamp_override": -1, # 覆写时间, 设为 -1 以禁用 + "quick_pass": 1, # 启用用于测试的快速通过 + "scheduled_num": 8, # 对于每个项目的默认新记忆原子数量 + "timezone_offset": 28800, # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 + # 28800 是中国标准时间 (UTC+8) + + "interface": { + "memorizor": { + "autovoice": True # 自动语音播放, 仅限于 recognition 组件 + } + }, + + "algorithm": { + "default": "SM-2" # 主要算法 + # 可选项: SM-2, SM-15M, FSRS + }, + + "puzzles": { # 谜题默认配置 + "mcq": { + "max_riddles_num": 2 + }, + "cloze": { + "min_denominator": 3 + } + }, + + "paths": { # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 + "data": "./data" + }, + + "services": { # 定义服务到提供者的映射 + "audio": "playsound", # 可选项: playsound(通用), termux(仅用于 Android Termux), mpg123(TODO) + "tts": "edgetts", # 可选项: edgetts + "llm": "openai", # 可选项: openai + "sync": "webdav" # 可选项: 留空, webdav + }, + + "providers": { + "tts": { + "edgetts": { # EdgeTTS 设置 + "voice": "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) + } + }, + "llm": { + "openai": { # 与 OpenAI 相容的语言模型接口服务设置 + "url": "", + "key": "" + } + }, + "sync": { + "webdav": { # WebDAV 同步设置 + "url": "", + "username": "", + "password": "", + "remote_path": "/heurams/", + "verify_ssl": True + } + } + }, +} class ConfigFile: def __init__(self, path: pathlib.Path): self.logger = get_logger(__name__) self.path = path + self.data = dict() if not self.path.exists(): self.path.touch() self.logger.debug("创建配置文件: %s", self.path) - self.data = dict() + self.data = default_config + self.valid_configfile = 1 + # 考虑到可能临时编辑格式错误, 所以不覆写格式错误的配置文件, 而是提示损坏并使用默认配置 self._load() def _load(self): @@ -26,7 +92,8 @@ class ConfigFile: except toml.TomlDecodeError as e: print(f"{e}") self.logger.error("TOML解析错误: %s", e) - self.data = {} + self.data = default_config + self.valid_configfile = 0 def modify(self, key: str, value: typing.Any): """修改配置值并保存""" @@ -36,10 +103,13 @@ class ConfigFile: def save(self, path: typing.Union[str, pathlib.Path] = ""): """保存配置到文件""" - save_path = pathlib.Path(path) if path else self.path - with open(save_path, "w") as f: - toml.dump(self.data, f) - self.logger.debug("配置文件已保存: %s", save_path) + if self.valid_configfile: + save_path = pathlib.Path(path) if path else self.path + with open(save_path, "w") as f: + toml.dump(self.data, f) + self.logger.debug("配置文件已保存: %s", save_path) + else: + pass def get(self, key: str, default: typing.Any = None) -> typing.Any: """获取配置值, 如果不存在返回默认值""" diff --git a/src/heurams/tools/csv2payload.py b/src/heurams/tools/csv2payload.py index a32cb20..4caa023 100755 --- a/src/heurams/tools/csv2payload.py +++ b/src/heurams/tools/csv2payload.py @@ -2,8 +2,7 @@ """ 将符合条件的CSV转为符合Payload需要的TOML格式 -使用命令: python3 csv2payload.py <生成TOML路径, 默认为文件名相同, 后缀为toml的TOML文件> - +使用命令: python3 csv2payload.py <生成TOML路径, 默认为文件名相同, 后缀为toml的TOML文件> [-r: 可选参数, 表示按照索引打乱顺序的随机整数种子] 转换规则: 1. `ident` 列用作 TOML 的 section 标题(`[ident]`) @@ -64,19 +63,23 @@ meaning = "狗发出的声音" - 生成序列基于原始 CSV 中 `ident` 为空的行出现的顺序 - 所有值都保留为字符串类型,符合 TOML 字符串格式要求 - 如果 CSV 包含更多列,它们也会以相同方式转换为键值对 +- 支持 `-r` 参数指定随机种子来打乱 section 顺序 """ import csv import sys import os +import random +import argparse from pathlib import Path -def csv_to_toml(csv_path, toml_path=None): +def csv_to_toml(csv_path, toml_path=None, random_seed=None): """ 将CSV文件转换为TOML格式 Args: csv_path (str): 输入CSV文件路径 toml_path (str): 输出TOML文件路径,默认为相同目录下同名文件 + random_seed (int): 随机种子,用于打乱section顺序,None表示不打乱 """ # 检查CSV文件是否存在 csv_file = Path(csv_path) @@ -104,6 +107,12 @@ def csv_to_toml(csv_path, toml_path=None): print("错误: CSV文件为空或格式不正确") sys.exit(1) + # 如果指定了随机种子,设置随机种子并打乱行顺序 + if random_seed is not None: + random.seed(random_seed) + random.shuffle(rows) + print(f"提示: 使用随机种子 {random_seed} 打乱了 section 顺序") + # 生成TOML内容 toml_content = [] idx_counter = 1 @@ -143,16 +152,26 @@ def csv_to_toml(csv_path, toml_path=None): def main(): """主函数""" - if len(sys.argv) < 2: - print("用法: python3 csv2payload.py []") - print("示例: python3 csv2payload.py input.csv output.toml") - print("示例: python3 csv2payload.py input.csv # 自动生成input.toml") - sys.exit(1) + parser = argparse.ArgumentParser( + description='将CSV文件转换为TOML格式,支持随机打乱section顺序', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=''' +示例: + %(prog)s input.csv output.toml + %(prog)s input.csv # 自动生成input.toml + %(prog)s input.csv -r 42 # 使用种子42打乱顺序 + %(prog)s input.csv -r 123 output.toml # 指定种子和输出路径 + ''' + ) - csv_path = sys.argv[1] - toml_path = sys.argv[2] if len(sys.argv) > 2 else None + parser.add_argument('csv_path', help='输入的CSV文件路径') + parser.add_argument('toml_path', nargs='?', help='输出的TOML文件路径,默认为CSV同名文件') + parser.add_argument('-r', '--random-seed', type=int, + help='随机种子,用于打乱TOML section的顺序') - csv_to_toml(csv_path, toml_path) + args = parser.parse_args() + + csv_to_toml(args.csv_path, args.toml_path, args.random_seed) if __name__ == "__main__": main() \ No newline at end of file From 230a76fe27dc0729c56fb5b7a1351c969397431f Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 28 Jan 2026 03:35:58 +0800 Subject: [PATCH 27/79] =?UTF-8?q?feat(interface):=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/__init__.py | 20 +++++++++++---- src/heurams/interface/css/main.tcss | 6 +++++ src/heurams/interface/screens/dashboard.py | 15 ++++++----- src/heurams/interface/screens/precache.py | 30 ++++++++++------------ 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index cf37948..2bb3171 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -1,15 +1,21 @@ -from time import sleep +from time import sleep, perf_counter print("欢迎使用基本用户界面!") -print("加载配置... ", end="", flush=True) +print("加载配置与上下文... ", end="", flush=True) +_start1 = perf_counter() +_start = perf_counter() from heurams.context import * -print("已完成!") +_end = perf_counter() +print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") print("加载用户界面框架... ", end="", flush=True) +_start = perf_counter() from textual.app import App from textual.widgets import Button -print("已完成!") +_end = perf_counter() +print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") print("加载用户界面布局... ", end="", flush=True) +_start = perf_counter() from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen from .screens.llmchat import LLMChatScreen @@ -19,9 +25,13 @@ from .screens.radio import RadioScreen from .screens.repocreator import RepoCreatorScreen from .screens.repoeditor import RepoEditorScreen from .screens.synctool import SyncScreen -print("已完成!") +_end = perf_counter() +print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") + print(f"组件目录: {rootdir}") print(f"工作目录: {workdir}") +_end1 = perf_counter() +print(f"前置工作共计耗时: {round(1000 * (_end1 - _start1))}ms") class HeurAMSApp(App): TITLE = "潜进" CSS_PATH = "css/main.tcss" diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index 8314c2d..347966d 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -4,6 +4,12 @@ NavigatorScreen { align: center middle; } +.infview { + width: 5fr +} +.dataview { + width: 3fr +} .repo_listitem { layout: grid; diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 9964a26..cf8b9ce 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -3,6 +3,7 @@ from functools import reduce import pathlib from pathlib import Path +import os from textual.app import ComposeResult from textual.containers import ScrollableContainer, Container, Horizontal, Vertical @@ -53,26 +54,26 @@ class DashboardScreen(Screen): with ScrollableContainer(): yield Horizontal( Vertical( - Label('欢迎使用 "潜进" 启发式辅助记忆调度器'), + Label(f'欢迎使用 "潜进" 版本 {version.ver}'), Label( - f"当前 UNIX 日时间戳: {timer.get_daystamp()} (UTC+{config_var.get()['timezone_offset'] / 3600})" + f"当前 UNIX 日时间戳: {timer.get_daystamp()}" ), + Label(f"应用时区修正: UTC+{config_var.get()['timezone_offset'] / 3600}"), Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), - Label("选择待学习或待修改的项目:"), - classes="column", + classes="column infview", ), Vertical( Label(f"已加载 {len(self.repostat)} 个单元集", classes='dataview'), Label(f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.get('unit_sum'), self.repostat.values()))} 个单元", classes='dataview'), Label(f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.get('activated_sum'), self.repostat.values()))} 个单元", classes='dataview'), - Label(""), - classes="column", + Label(f"终端尺寸: {os.get_terminal_size()[0]}x{os.get_terminal_size()[1]}"), + classes="column dataview", ), id="dashboardtop" ) yield ListView(id="repo-list", classes="repo-list-view") - yield Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} ') + yield Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} {version.stage.capitalize()}') yield Footer() def _load_data(self): diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 300690b..422f738 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -98,11 +98,6 @@ class PrecachingScreen(Screen): yield Header(show_clock=True) with ScrollableContainer(id="precache_container"): yield Label("[b]音频预缓存[/b]", classes="title-label") - with Container(classes="cache-info"): - yield Static(f"缓存路径: {cache_dir}", classes="cache-path") - yield Static(f"文件数: {self.cache_stats['file_count']}", classes="cache-count") - yield Static(f"总大小: {self.cache_stats['human_size']}", classes="cache-size") - yield Button("刷新", id="refresh_cache_stats", variant="default") with Container(): yield Static( f"缓存率: {self.cache_stats.get('cache_rate', 0):.1f}% (已缓存 {self.cache_stats.get('cached_units', 0)} / {self.cache_stats.get('total_units', 0)} 个单元)", @@ -117,17 +112,20 @@ class PrecachingScreen(Screen): yield Static(id="status", classes="status-info") yield Static(id="current_item", classes="current-item") yield ProgressBar(total=100, show_eta=False, id="progress_bar") - - with Horizontal(classes="button-group"): - if not self.is_precaching: - yield Button("开始预缓存", id="start_precache", variant="primary") - else: - yield Button("取消预缓存", id="cancel_precache", variant="error") - yield Button("清空缓存", id="clear_cache", variant="warning") - yield Button("返回", id="go_back", variant="default") - - yield Static("若您离开此界面, 未完成的缓存进程会自动停止.") - yield Static('缓存程序支持 "断点续传".') + with Horizontal(classes="button-group"): + if not self.is_precaching: + yield Button("开始预缓存", id="start_precache", variant="primary") + else: + yield Button("取消预缓存", id="cancel_precache", variant="error") + yield Button("清空缓存", id="clear_cache", variant="warning") + yield Button("返回", id="go_back", variant="default") + with Container(classes="cache-info"): + yield Static(f"缓存路径: {cache_dir}", classes="cache-path") + yield Static(f"文件数: {self.cache_stats['file_count']}", classes="cache-count") + yield Static(f"总大小: {self.cache_stats['human_size']}", classes="cache-size") + yield Button("刷新", id="refresh_cache_stats", variant="default", flat=True) + yield Static("若您离开此界面, 未完成的缓存进程会自动停止.") + yield Static('缓存程序支持 "断点续传".') yield Footer() From f7c072dd0b421aec27bdce21eefab16b892da545 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Fri, 27 Mar 2026 19:31:40 +0800 Subject: [PATCH 28/79] =?UTF-8?q?build:=20=E4=BF=AE=E6=94=B9=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=B9=B6=E5=BC=95=E5=85=A5=E5=A4=96=E9=83=A8=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 112 +--- pyproject.toml | 8 +- src/heurams/vendor/pyfsrs/LICENSE | 21 + src/heurams/vendor/pyfsrs/__init__.py | 29 + src/heurams/vendor/pyfsrs/card.py | 167 +++++ src/heurams/vendor/pyfsrs/optimizer.py | 674 +++++++++++++++++++ src/heurams/vendor/pyfsrs/py.typed | 0 src/heurams/vendor/pyfsrs/rating.py | 15 + src/heurams/vendor/pyfsrs/review_log.py | 117 ++++ src/heurams/vendor/pyfsrs/scheduler.py | 856 ++++++++++++++++++++++++ src/heurams/vendor/pyfsrs/state.py | 14 + uv.lock | 118 ---- 12 files changed, 1915 insertions(+), 216 deletions(-) create mode 100644 src/heurams/vendor/pyfsrs/LICENSE create mode 100644 src/heurams/vendor/pyfsrs/__init__.py create mode 100644 src/heurams/vendor/pyfsrs/card.py create mode 100644 src/heurams/vendor/pyfsrs/optimizer.py create mode 100644 src/heurams/vendor/pyfsrs/py.typed create mode 100644 src/heurams/vendor/pyfsrs/rating.py create mode 100644 src/heurams/vendor/pyfsrs/review_log.py create mode 100644 src/heurams/vendor/pyfsrs/scheduler.py create mode 100644 src/heurams/vendor/pyfsrs/state.py diff --git a/README.md b/README.md index 4a978f0..9cbbfae 100644 --- a/README.md +++ b/README.md @@ -6,60 +6,6 @@ ## 关于此仓库 本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现 除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 -本仓库在 AGPLv3 下开放源代码(详见 LICENSE 文件) - -## 版本日志 - -### 0.0.x -- 简易调度器实现与最小原型 - -### 0.1.x -- 命令行操作的调度器 - -### 0.2.x -- 使用 Textual 构建富文本终端用户界面 -- 项目可行性验证 -- 采用 SM-2 原始算法, 评估方式为用户自评估原型 - -### 0.3.x Frontal 前端 -- 简单的多文件项目 -- 创建了记忆内容/算法数据结构 -- 基于 SM-2 改进算法的自动复习测评评估 -- 重点设计古诗文记忆理解功能 -- TUI 界面改进 -- 简单的 TTS 集成 - -### 0.4.x Fledge 雏鸟 -- 开发目标转为多用途 -- 使用模块管理解耦设计 -- 增加文档与类型标注 -- 采用上下文设计模式的隐式依赖注入与遵从 IoC, 注册器设计的算法与功能实现 -- 支持其他调度算法模块 (SM-2, SM-18M 参考理论变体, FSRS) 与谜题模块 -- 采用规范的日志调试取代 Textual Devtools 调试 -- 更新数据持久化协议规范 -- 引入动态数据模式 (宏驱动的动态内容生成) , 与基于文件的策略调控 -- 更佳的用户数据处理 -- 加入模块化扩展集成 -- 更换算法数据格式, 提高性能 -- 采用 provider-service 抽象架构, 支持切换服务提供者 -- 整体兼容性改进 - -### 0.5.x Fulcrum 支点 -- 以仓库 (repository) 对象作为文件系统与运行时对象间的桥梁, 提高解耦性与性能 -- 使用具有列表-字典 API 同步特性的 "Lict" 对象作为 Repo 数据的内部存储 -- 将粒子对象作为纯运行时对象, 数据通过引用自动同步至 Repo, 减少负担 -- 实现声音形式回顾 "电台" 功能 -- 改进数据存储结构, 实现选择性持久化 -- 增强可配置性 -- 使用 Transitions 状态机库重新实现 Reactor 模块系列状态机, 增强可维护性 -- 实现整体回顾记忆功能, 与队列式记忆功能并列 -- 加入状态机快照功能 (基于 pickle) , 使中断的记忆流程得以恢复 -- 增加 "整体文章引用" 功能, 实现从一篇长文本中摘取内容片段记忆并在原文中高亮查看的组织操作 - -### 下一步? -- 增加云同步 / 文档源服务 -- 使用 Flutter 构建酷酷的现代化前端 -- ... ## 特性 @@ -81,13 +27,6 @@ - 支持触屏/鼠标/键盘多操作模式 - 简洁直观的复习流程设计 -### 架构特性 -- 模块化设计: 算法, 谜题, 服务提供者可插拔替换 -- 上下文管理: 使用 ContextVar 实现隐式依赖注入 -- 数据持久化: TOML 配置与内容, JSON 算法状态 -- 服务抽象: 音频播放, TTS, LLM 通过 provider 架构支持多种后端 -- 完整日志系统: 带轮转的日志记录, 便于调试 - ## 安装 ### 从源码安装 @@ -107,13 +46,17 @@ pip install -e . ``` +### 从包管理器安装 +暂时还没有:( + ## 启动应用 ```bash # 在任一目录(建议是空目录或者包根目录, 将被用作存放数据)下运行 python -m heurams.interface ``` -配置文件位于 `./data/config/config.toml`(相对于工作目录). 如果不存在, 会使用内置的默认配置. +配置文件位于 `./data/config/config.toml`(相对于工作目录). +如果不存在, 会使用内置的默认配置. ## 项目结构 @@ -178,38 +121,25 @@ graph TB Algorithms --> Files ``` -### 目录结构(待更新 0.5.0) -``` -src/heurams/ -├── __init__.py # 包入口点 -├── context.py # 全局上下文, 路径, 配置上下文管理器 -├── services/ # 核心服务 -│ ├── config.py # 配置管理 -│ ├── logger.py # 日志系统 -│ ├── timer.py # 时间服务 -│ ├── audio_service.py # 音频播放抽象 -│ ├── tts_service.py # 文本转语音抽象 -│ └── sync_service.py # WebDAV 同步服务 -├── kernel/ # 核心业务逻辑 -│ ├── algorithms/ # 间隔重复算法 (FSRS, SM2) -│ ├── particles/ # 数据模型 (Atom, Electron, Nucleon, Orbital) -│ ├── puzzles/ # 谜题类型 (MCQ, cloze, recognition) -│ └── reactor/ # 调度和处理逻辑 -├── providers/ # 外部服务提供者 -│ ├── audio/ # 音频播放实现 -│ ├── tts/ # 文本转语音实现 -│ └── llm/ # LLM 集成 -├── interface/ # Textual TUI 界面 -│ ├── widgets/ # UI 组件 -│ ├── screens/ # 应用屏幕 -│ └── __main__.py # 应用入口点 -└── default/ # 默认配置和数据模板 -``` - ## 贡献 欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. ## 许可证 -本项目基于 AGPL-3.0 许可证开源. 详见 [LICENSE](LICENSE) 文件. \ No newline at end of file +### 项目本身 + +本项目基于 AGPL-3.0 许可证开源. 详见根目录下 [LICENSE](LICENSE) 文件. + +### 第三方代码 + +项目在 `src/heurams/vendor/` 目录下嵌入了以下第三方代码(可能有修改): + +#### py-fsrs +- 上游版本: 6.3.1 +- 位置: `src/heurams/vendor/pyfsrs/` +- 原项目: [py-fsrs](https://github.com/open-spaced-repetition/py-fsrs) +- 原许可证: Copyright (c) 2026 Open Spaced Repetition Contributors +- 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` + +本项目受益于他们无私且优秀的工作 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index e4a829c..395b4dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ dependencies = [ "openai==1.0.0", "playsound==1.2.2", "psutil>=7.2.1", - "pygobject>=3.54.5", "tabulate>=0.9.0", "textual==7.0.0", "toml==0.10.2", @@ -26,9 +25,4 @@ tui = "heurams.interface.__main__:main" [build-system] requires = ["uv_build>=0.9.22,<0.10.0"] -build-backend = "uv_build" - -[dependency-groups] -dev = [ - "flet>=0.80.1", -] +build-backend = "uv_build" \ No newline at end of file diff --git a/src/heurams/vendor/pyfsrs/LICENSE b/src/heurams/vendor/pyfsrs/LICENSE new file mode 100644 index 0000000..29d7488 --- /dev/null +++ b/src/heurams/vendor/pyfsrs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Open Spaced Repetition + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/heurams/vendor/pyfsrs/__init__.py b/src/heurams/vendor/pyfsrs/__init__.py new file mode 100644 index 0000000..ae59e0d --- /dev/null +++ b/src/heurams/vendor/pyfsrs/__init__.py @@ -0,0 +1,29 @@ +""" +py-fsrs +------- + +Py-FSRS is the official Python implementation of the FSRS scheduler algorithm, which can be used to develop spaced repetition systems. +""" + +from fsrs.scheduler import Scheduler +from fsrs.state import State +from fsrs.card import Card +from fsrs.rating import Rating +from fsrs.review_log import ReviewLog +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from fsrs.optimizer import Optimizer + + +# lazy load the Optimizer module due to heavy dependencies +def __getattr__(name: str) -> type: + if name == "Optimizer": + global Optimizer + from fsrs.optimizer import Optimizer + + return Optimizer + raise AttributeError + + +__all__ = ["Scheduler", "Card", "Rating", "ReviewLog", "State", "Optimizer"] diff --git a/src/heurams/vendor/pyfsrs/card.py b/src/heurams/vendor/pyfsrs/card.py new file mode 100644 index 0000000..2531ea1 --- /dev/null +++ b/src/heurams/vendor/pyfsrs/card.py @@ -0,0 +1,167 @@ +""" +fsrs.card +--------- + +This module defines the Card and State classes. + +Classes: + Card: Represents a flashcard in the FSRS system. + State: Enum representing the learning state of a Card object. +""" + +from __future__ import annotations +from dataclasses import dataclass +from datetime import datetime, timezone +import time +import json +from typing import TypedDict +from typing_extensions import Self +from fsrs.state import State + + +class CardDict(TypedDict): + """ + JSON-serializable dictionary representation of a Card object. + """ + + card_id: int + state: int + step: int | None + stability: float | None + difficulty: float | None + due: str + last_review: str | None + + +@dataclass(init=False) +class Card: + """ + Represents a flashcard in the FSRS system. + + Attributes: + card_id: The id of the card. Defaults to the epoch milliseconds of when the card was created. + state: The card's current learning state. + step: The card's current learning or relearning step or None if the card is in the Review state. + stability: Core mathematical parameter used for future scheduling. + difficulty: Core mathematical parameter used for future scheduling. + due: The date and time when the card is due next. + last_review: The date and time of the card's last review. + """ + + card_id: int + state: State + step: int | None + stability: float | None + difficulty: float | None + due: datetime + last_review: datetime | None + + def __init__( + self, + card_id: int | None = None, + state: State = State.Learning, + step: int | None = None, + stability: float | None = None, + difficulty: float | None = None, + due: datetime | None = None, + last_review: datetime | None = None, + ) -> None: + if card_id is None: + # epoch milliseconds of when the card was created + card_id = int(datetime.now(timezone.utc).timestamp() * 1000) + # wait 1ms to prevent potential card_id collision on next Card creation + time.sleep(0.001) + self.card_id = card_id + + self.state = state + + if self.state == State.Learning and step is None: + step = 0 + self.step = step + + self.stability = stability + self.difficulty = difficulty + + if due is None: + due = datetime.now(timezone.utc) + self.due = due + + self.last_review = last_review + + def to_dict(self) -> CardDict: + """ + Returns a dictionary representation of the Card object. + + Returns: + CardDict: A dictionary representation of the Card object. + """ + + return { + "card_id": self.card_id, + "state": self.state.value, + "step": self.step, + "stability": self.stability, + "difficulty": self.difficulty, + "due": self.due.isoformat(), + "last_review": self.last_review.isoformat() if self.last_review else None, + } + + @classmethod + def from_dict(cls, source_dict: CardDict) -> Self: + """ + Creates a Card object from an existing dictionary. + + Args: + source_dict: A dictionary representing an existing Card object. + + Returns: + Self: A Card object created from the provided dictionary. + """ + + return cls( + card_id=int(source_dict["card_id"]), + state=State(int(source_dict["state"])), + step=source_dict["step"], + stability=( + float(source_dict["stability"]) if source_dict["stability"] else None + ), + difficulty=( + float(source_dict["difficulty"]) if source_dict["difficulty"] else None + ), + due=datetime.fromisoformat(source_dict["due"]), + last_review=( + datetime.fromisoformat(source_dict["last_review"]) + if source_dict["last_review"] + else None + ), + ) + + def to_json(self, indent: int | str | None = None) -> str: + """ + Returns a JSON-serialized string of the Card object. + + Args: + indent: Equivalent argument to the indent in json.dumps() + + Returns: + str: A JSON-serialized string of the Card object. + """ + return json.dumps(self.to_dict(), indent=indent) + + @classmethod + def from_json(cls, source_json: str) -> Self: + """ + Creates a Card object from a JSON-serialized string. + + Args: + source_json: A JSON-serialized string of an existing Card object. + + Returns: + Self: A Card object created from the JSON string. + """ + + source_dict: CardDict = json.loads(source_json) + return cls.from_dict(source_dict=source_dict) + + +__all__ = ["Card"] diff --git a/src/heurams/vendor/pyfsrs/optimizer.py b/src/heurams/vendor/pyfsrs/optimizer.py new file mode 100644 index 0000000..d19c9bb --- /dev/null +++ b/src/heurams/vendor/pyfsrs/optimizer.py @@ -0,0 +1,674 @@ +""" +fsrs.optimizer +--------- + +This module defines the optional Optimizer class. +""" + +from fsrs.card import Card +from fsrs.review_log import ReviewLog, Rating +from fsrs.scheduler import ( + Scheduler, + DEFAULT_PARAMETERS, + LOWER_BOUNDS_PARAMETERS, + UPPER_BOUNDS_PARAMETERS, +) + +import math +from datetime import datetime, timezone +from copy import deepcopy +from random import Random +from statistics import mean + +try: + import torch + from torch.nn import BCELoss + from torch import optim + import pandas as pd + from tqdm import tqdm + + # weight clipping + LOWER_BOUNDS_PARAMETERS_TENSORS = torch.tensor( + LOWER_BOUNDS_PARAMETERS, + dtype=torch.float64, + ) + + UPPER_BOUNDS_PARAMETERS_TENSORS = torch.tensor( + UPPER_BOUNDS_PARAMETERS, + dtype=torch.float64, + ) + + # hyper parameters + num_epochs = 5 + mini_batch_size = 512 + learning_rate = 4e-2 + max_seq_len = ( + 64 # up to the first 64 reviews of each card are used for optimization + ) + + class Optimizer: + """ + The FSRS optimizer. + + Enables the optimization of FSRS scheduler parameters from existing review logs for more accurate interval calculations. + + Attributes: + review_logs: A collection of previous ReviewLog objects from a user. + _revlogs_train: The collection of review logs, sorted and formatted for optimization. + """ + + review_logs: tuple[ReviewLog, ...] + _revlogs_train: dict + + def __init__( + self, review_logs: tuple[ReviewLog, ...] | list[ReviewLog] + ) -> None: + """ + Initializes the Optimizer with a set of ReviewLogs. Also formats a copy of the review logs for optimization. + + Note that the ReviewLogs provided by the user don't need to be in order. + """ + + def _format_revlogs() -> dict: + """ + Sorts and converts the tuple of ReviewLog objects to a dictionary format for optimizing + """ + + revlogs_train = {} + for review_log in self.review_logs: + # pull data out of current ReviewLog object + card_id = review_log.card_id + rating = review_log.rating + review_datetime = review_log.review_datetime + review_duration = review_log.review_duration + + # if the card was rated Again, it was not recalled + recall = 0 if rating == Rating.Again else 1 + + # as a ML problem, [x, y] = [ [review_datetime, rating, review_duration], recall ] + datum = [[review_datetime, rating, review_duration], recall] + + if card_id not in revlogs_train: + revlogs_train[card_id] = [] + + revlogs_train[card_id].append((datum)) + revlogs_train[card_id] = sorted( + revlogs_train[card_id], key=lambda x: x[0][0] + ) # keep reviews sorted + + # sort the dictionary in order of when each card history starts + revlogs_train = dict(sorted(revlogs_train.items())) + + return revlogs_train + + self.review_logs = deepcopy(tuple(review_logs)) + + # format the ReviewLog data for optimization + self._revlogs_train = _format_revlogs() + + def _compute_batch_loss(self, *, parameters: list[float]) -> float: + """ + Computes the current total loss for the entire batch of review logs. + """ + + card_ids = list(self._revlogs_train.keys()) + params = torch.tensor(parameters, dtype=torch.float64) + loss_fn = BCELoss() + scheduler = Scheduler(parameters=params) + step_losses = [] + + for card_id in card_ids: + card_review_history = self._revlogs_train[card_id][:max_seq_len] + + for i in range(len(card_review_history)): + review = card_review_history[i] + + x_date = review[0][0] + y_retrievability = review[1] + u_rating = review[0][1] + + if i == 0: + card = Card(card_id=card_id, due=x_date) + + y_pred_retrievability = scheduler.get_card_retrievability( + card=card, current_datetime=x_date + ) + y_retrievability = torch.tensor( + y_retrievability, dtype=torch.float64 + ) + + if card.last_review and (x_date - card.last_review).days > 0: + step_loss = loss_fn(y_pred_retrievability, y_retrievability) + step_losses.append(step_loss) + + card, _ = scheduler.review_card( + card=card, + rating=u_rating, + review_datetime=x_date, + review_duration=None, + ) + + batch_loss = torch.sum(torch.stack(step_losses)) + batch_loss = batch_loss.item() / len(step_losses) + + return batch_loss + + def compute_optimal_parameters(self, verbose: bool = False) -> list[float]: + """ + Computes a set of optimized parameters for the FSRS scheduler and returns it as a list of floats. + + High level explanation of optimization: + --------------------------------------- + FSRS is a many-to-many sequence model where the "State" at each step is a Card object at a given point in time, + the input is the time of the review and the output is the predicted retrievability of the card at the time of review. + + Each card's review history can be thought of as a sequence, each review as a step and each collection of card review histories + as a batch. + + The loss is computed by comparing the predicted retrievability of the Card at each step with whether the Card was actually + sucessfully recalled or not (0/1). + + Finally, the card objects at each step in their sequences are updated using the current parameters of the Scheduler + as well as the rating given to that card by the user. The parameters of the Scheduler is what is being optimized. + """ + + def _num_reviews() -> int: + """ + Computes how many Review-state reviews there are in the dataset. + Only the loss from Review-state reviews count for optimization and their number must + be computed in advance to properly initialize the Cosine Annealing learning rate scheduler. + """ + + scheduler = Scheduler() + num_reviews = 0 + # iterate through the card review histories + card_ids = list(self._revlogs_train.keys()) + for card_id in card_ids: + card_review_history = self._revlogs_train[card_id][:max_seq_len] + + # iterate through the current Card's review history + for i in range(len(card_review_history)): + review = card_review_history[i] + + review_datetime = review[0][0] + rating = review[0][1] + + # if this is the first review, create the Card object + if i == 0: + card = Card(card_id=card_id, due=review_datetime) + + # only non-same-day reviews count + if ( + card.last_review + and (review_datetime - card.last_review).days > 0 + ): + num_reviews += 1 + + card, _ = scheduler.review_card( + card=card, + rating=rating, + review_datetime=review_datetime, + review_duration=None, + ) + + return num_reviews + + def _update_parameters( + *, + step_losses: list, + adam_optimizer: torch.optim.Adam, + params: torch.Tensor, + lr_scheduler: torch.optim.lr_scheduler.CosineAnnealingLR, + ) -> None: + """ + Computes and updates the current FSRS parameters based on the step losses. Also updates the learning rate scheduler. + """ + + # Backpropagate through the loss + mini_batch_loss = torch.sum(torch.stack(step_losses)) + adam_optimizer.zero_grad() # clear previous gradients + mini_batch_loss.backward() # compute gradients + adam_optimizer.step() # Update parameters + + # clamp the weights in place without modifying the computational graph + with torch.no_grad(): + params.clamp_( + min=LOWER_BOUNDS_PARAMETERS_TENSORS, + max=UPPER_BOUNDS_PARAMETERS_TENSORS, + ) + + # update the learning rate + lr_scheduler.step() + + # set local random seed for reproducibility + rng = Random(42) + + card_ids = list(self._revlogs_train.keys()) + + num_reviews = _num_reviews() + + if num_reviews < mini_batch_size: + return list(DEFAULT_PARAMETERS) + + # Define FSRS Scheduler parameters as torch tensors with gradients + params = torch.tensor( + DEFAULT_PARAMETERS, requires_grad=True, dtype=torch.float64 + ) + + loss_fn = BCELoss() + adam_optimizer = optim.Adam([params], lr=learning_rate) + lr_scheduler = optim.lr_scheduler.CosineAnnealingLR( + optimizer=adam_optimizer, + T_max=math.ceil(num_reviews / mini_batch_size) * num_epochs, + ) + + best_params = None + best_loss = math.inf + # iterate through the epochs + for _ in tqdm( + range(num_epochs), + desc="Optimizing", + unit="epoch", + disable=(not verbose), + ): + # randomly shuffle the order of which Card's review histories get computed first + # at the beginning of each new epoch + rng.shuffle(card_ids) + + # initialize new scheduler with updated parameters each epoch + scheduler = Scheduler(parameters=params) + + # stores the computed loss of each individual review + step_losses = [] + + # iterate through the card review histories (sequences) + for card_id in card_ids: + card_review_history = self._revlogs_train[card_id][:max_seq_len] + + # iterate through the current Card's review history (steps) + for i in range(len(card_review_history)): + review = card_review_history[i] + + # input + x_date = review[0][0] + # target + y_retrievability = review[1] + # update + u_rating = review[0][1] + + # if this is the first review, create the Card object + if i == 0: + card = Card(card_id=card_id, due=x_date) + + # predicted target + y_pred_retrievability = scheduler.get_card_retrievability( + card=card, current_datetime=x_date + ) + y_retrievability = torch.tensor( + y_retrievability, dtype=torch.float64 + ) + + # only compute step-loss on non-same-day reviews + if card.last_review and (x_date - card.last_review).days > 0: + step_loss = loss_fn(y_pred_retrievability, y_retrievability) + step_losses.append(step_loss) + + # update the card's state + card, _ = scheduler.review_card( + card=card, + rating=u_rating, + review_datetime=x_date, + review_duration=None, + ) + + # take a gradient step after each mini-batch + if len(step_losses) == mini_batch_size: + _update_parameters( + step_losses=step_losses, + adam_optimizer=adam_optimizer, + params=params, + lr_scheduler=lr_scheduler, + ) + + # update the scheduler's with the new parameters + scheduler = Scheduler(parameters=params) + # clear the step losses for next batch + step_losses = [] + + # remove gradient history from tensor card parameters for next batch + card.stability = card.stability.detach() + card.difficulty = card.difficulty.detach() + + # update params on remaining review logs + if len(step_losses) > 0: + _update_parameters( + step_losses=step_losses, + adam_optimizer=adam_optimizer, + params=params, + lr_scheduler=lr_scheduler, + ) + + # compute the current batch loss after each epoch + detached_params = [ + x.detach().item() for x in list(params.detach()) + ] # convert to floats + with torch.no_grad(): + epoch_batch_loss = self._compute_batch_loss( + parameters=detached_params + ) + + # if the batch loss is better with the current parameters, update the current best parameters + if epoch_batch_loss < best_loss: + best_loss = epoch_batch_loss + best_params = detached_params + + return best_params + + def _compute_probs_and_costs(self) -> dict[str, float]: + review_log_df = pd.DataFrame( + vars(review_log) for review_log in self.review_logs + ) + + review_log_df = review_log_df.sort_values( + by=["card_id", "review_datetime"], ascending=[True, True] + ).reset_index(drop=True) + + # dictionary to return + probs_and_costs_dict = {} + + # compute the probabilities and costs of the first rating + first_reviews_df = review_log_df.loc[ + ~review_log_df["card_id"].duplicated(keep="first") + ].reset_index(drop=True) + + first_again_reviews_df = first_reviews_df.loc[ + first_reviews_df["rating"] == Rating.Again + ] + first_hard_reviews_df = first_reviews_df.loc[ + first_reviews_df["rating"] == Rating.Hard + ] + first_good_reviews_df = first_reviews_df.loc[ + first_reviews_df["rating"] == Rating.Good + ] + first_easy_reviews_df = first_reviews_df.loc[ + first_reviews_df["rating"] == Rating.Easy + ] + + # compute the probability of the user clicking again/hard/good/easy given it's their first review + num_first_again = len(first_again_reviews_df) + num_first_hard = len(first_hard_reviews_df) + num_first_good = len(first_good_reviews_df) + num_first_easy = len(first_easy_reviews_df) + + num_first_review = ( + num_first_again + num_first_hard + num_first_good + num_first_easy + ) + + prob_first_again = num_first_again / num_first_review + prob_first_hard = num_first_hard / num_first_review + prob_first_good = num_first_good / num_first_review + prob_first_easy = num_first_easy / num_first_review + + probs_and_costs_dict["prob_first_again"] = prob_first_again + probs_and_costs_dict["prob_first_hard"] = prob_first_hard + probs_and_costs_dict["prob_first_good"] = prob_first_good + probs_and_costs_dict["prob_first_easy"] = prob_first_easy + + # compute the cost of the user clicking again/hard/good/easy on their first review + first_again_review_durations = list( + first_again_reviews_df["review_duration"] + ) + first_hard_review_durations = list(first_hard_reviews_df["review_duration"]) + first_good_review_durations = list(first_good_reviews_df["review_duration"]) + first_easy_review_durations = list(first_easy_reviews_df["review_duration"]) + + avg_first_again_review_duration = ( + mean(first_again_review_durations) + if first_again_review_durations + else 0 + ) + avg_first_hard_review_duration = ( + mean(first_hard_review_durations) if first_hard_review_durations else 0 + ) + avg_first_good_review_duration = ( + mean(first_good_review_durations) if first_good_review_durations else 0 + ) + avg_first_easy_review_duration = ( + mean(first_easy_review_durations) if first_easy_review_durations else 0 + ) + + probs_and_costs_dict["avg_first_again_review_duration"] = ( + avg_first_again_review_duration + ) + probs_and_costs_dict["avg_first_hard_review_duration"] = ( + avg_first_hard_review_duration + ) + probs_and_costs_dict["avg_first_good_review_duration"] = ( + avg_first_good_review_duration + ) + probs_and_costs_dict["avg_first_easy_review_duration"] = ( + avg_first_easy_review_duration + ) + + # compute the probabilities and costs of non-first ratings + non_first_reviews_df = review_log_df.loc[ + review_log_df["card_id"].duplicated(keep="first") + ].reset_index(drop=True) + + again_reviews_df = non_first_reviews_df.loc[ + non_first_reviews_df["rating"] == Rating.Again + ] + hard_reviews_df = non_first_reviews_df.loc[ + non_first_reviews_df["rating"] == Rating.Hard + ] + good_reviews_df = non_first_reviews_df.loc[ + non_first_reviews_df["rating"] == Rating.Good + ] + easy_reviews_df = non_first_reviews_df.loc[ + non_first_reviews_df["rating"] == Rating.Easy + ] + + # compute the probability of the user clicking hard/good/easy given they correctly recalled the card + num_hard = len(hard_reviews_df) + num_good = len(good_reviews_df) + num_easy = len(easy_reviews_df) + + num_recall = num_hard + num_good + num_easy + + prob_hard = num_hard / num_recall + prob_good = num_good / num_recall + prob_easy = num_easy / num_recall + + probs_and_costs_dict["prob_hard"] = prob_hard + probs_and_costs_dict["prob_good"] = prob_good + probs_and_costs_dict["prob_easy"] = prob_easy + + again_review_durations = list(again_reviews_df["review_duration"]) + hard_review_durations = list(hard_reviews_df["review_duration"]) + good_review_durations = list(good_reviews_df["review_duration"]) + easy_review_durations = list(easy_reviews_df["review_duration"]) + + avg_again_review_duration = ( + mean(again_review_durations) if again_review_durations else 0 + ) + avg_hard_review_duration = ( + mean(hard_review_durations) if hard_review_durations else 0 + ) + avg_good_review_duration = ( + mean(good_review_durations) if good_review_durations else 0 + ) + avg_easy_review_duration = ( + mean(easy_review_durations) if easy_review_durations else 0 + ) + + probs_and_costs_dict["avg_again_review_duration"] = ( + avg_again_review_duration + ) + probs_and_costs_dict["avg_hard_review_duration"] = avg_hard_review_duration + probs_and_costs_dict["avg_good_review_duration"] = avg_good_review_duration + probs_and_costs_dict["avg_easy_review_duration"] = avg_easy_review_duration + + return probs_and_costs_dict + + def _simulate_cost( + self, + *, + desired_retention: float, + parameters: tuple[float, ...] | list[float], + num_cards_simulate: int, + probs_and_costs_dict: dict[str, float], + ) -> float: + rng = Random(42) + + # simulate from the beginning of 2025 till before the beginning of 2026 + start_date = datetime(2025, 1, 1, 0, 0, 0, 0, timezone.utc) + end_date = datetime(2026, 1, 1, 0, 0, 0, 0, timezone.utc) + + scheduler = Scheduler( + parameters=parameters, + desired_retention=desired_retention, + enable_fuzzing=False, + ) + + # unpack probs_and_costs_dict + prob_first_again = probs_and_costs_dict["prob_first_again"] + prob_first_hard = probs_and_costs_dict["prob_first_hard"] + prob_first_good = probs_and_costs_dict["prob_first_good"] + prob_first_easy = probs_and_costs_dict["prob_first_easy"] + + avg_first_again_review_duration = probs_and_costs_dict[ + "avg_first_again_review_duration" + ] + avg_first_hard_review_duration = probs_and_costs_dict[ + "avg_first_hard_review_duration" + ] + avg_first_good_review_duration = probs_and_costs_dict[ + "avg_first_good_review_duration" + ] + avg_first_easy_review_duration = probs_and_costs_dict[ + "avg_first_easy_review_duration" + ] + + prob_hard = probs_and_costs_dict["prob_hard"] + prob_good = probs_and_costs_dict["prob_good"] + prob_easy = probs_and_costs_dict["prob_easy"] + + avg_again_review_duration = probs_and_costs_dict[ + "avg_again_review_duration" + ] + avg_hard_review_duration = probs_and_costs_dict["avg_hard_review_duration"] + avg_good_review_duration = probs_and_costs_dict["avg_good_review_duration"] + avg_easy_review_duration = probs_and_costs_dict["avg_easy_review_duration"] + + simulation_cost = 0 + for i in range(num_cards_simulate): + card = Card() + curr_date = start_date + while curr_date < end_date: + # the card is new + if curr_date == start_date: + rating = rng.choices( + [Rating.Again, Rating.Hard, Rating.Good, Rating.Easy], + weights=[ + prob_first_again, + prob_first_hard, + prob_first_good, + prob_first_easy, + ], + )[0] + + if rating == Rating.Again: + simulation_cost += avg_first_again_review_duration + + elif rating == Rating.Hard: + simulation_cost += avg_first_hard_review_duration + + elif rating == Rating.Good: + simulation_cost += avg_first_good_review_duration + + elif rating == Rating.Easy: + simulation_cost += avg_first_easy_review_duration + + # the card is not new + else: + rating = rng.choices( + ["recall", Rating.Again], + weights=[desired_retention, 1.0 - desired_retention], + )[0] + + if rating == "recall": + # compute probability that the user chose hard/good/easy, GIVEN that they correctly recalled the card + rating = rng.choices( + [Rating.Hard, Rating.Good, Rating.Easy], + weights=[prob_hard, prob_good, prob_easy], + )[0] + + if rating == Rating.Again: + simulation_cost += avg_again_review_duration + + elif rating == Rating.Hard: + simulation_cost += avg_hard_review_duration + + elif rating == Rating.Good: + simulation_cost += avg_good_review_duration + + elif rating == Rating.Easy: + simulation_cost += avg_easy_review_duration + + card, _ = scheduler.review_card( + card=card, rating=rating, review_datetime=curr_date + ) + curr_date = card.due + + total_knowledge = desired_retention * num_cards_simulate + simulation_cost = simulation_cost / total_knowledge + + return simulation_cost + + def compute_optimal_retention( + self, parameters: tuple[float, ...] | list[float] + ) -> list[float]: + def _validate_review_logs() -> None: + if len(self.review_logs) < 512: + raise ValueError( + "Not enough ReviewLog's: at least 512 ReviewLog objects are required to compute optimal retention" + ) + + for review_log in self.review_logs: + if review_log.review_duration is None: + raise ValueError( + "ReviewLog.review_duration cannot be None when computing optimal retention" + ) + + _validate_review_logs() + + NUM_CARDS_SIMULATE = 1000 + DESIRED_RETENTIONS = [0.7, 0.75, 0.8, 0.85, 0.9, 0.95] + + probs_and_costs_dict = self._compute_probs_and_costs() + + simulation_costs = [] + for desired_retention in DESIRED_RETENTIONS: + simulation_cost = self._simulate_cost( + desired_retention=desired_retention, + parameters=parameters, + num_cards_simulate=NUM_CARDS_SIMULATE, + probs_and_costs_dict=probs_and_costs_dict, + ) + simulation_costs.append(simulation_cost) + + min_index = simulation_costs.index(min(simulation_costs)) + optimal_retention = DESIRED_RETENTIONS[min_index] + + return optimal_retention + +except ImportError: + + class Optimizer: + def __init__(self, *args, **kwargs) -> None: + raise ImportError( + 'Optimizer is not installed.\nInstall it with: pip install "fsrs[optimizer]"' + ) + + +__all__ = ["Optimizer"] diff --git a/src/heurams/vendor/pyfsrs/py.typed b/src/heurams/vendor/pyfsrs/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/vendor/pyfsrs/rating.py b/src/heurams/vendor/pyfsrs/rating.py new file mode 100644 index 0000000..65c994d --- /dev/null +++ b/src/heurams/vendor/pyfsrs/rating.py @@ -0,0 +1,15 @@ +from enum import IntEnum + + +class Rating(IntEnum): + """ + Enum representing the four possible ratings when reviewing a card. + """ + + Again = 1 + Hard = 2 + Good = 3 + Easy = 4 + + +__all__ = ["Rating"] diff --git a/src/heurams/vendor/pyfsrs/review_log.py b/src/heurams/vendor/pyfsrs/review_log.py new file mode 100644 index 0000000..a787d9b --- /dev/null +++ b/src/heurams/vendor/pyfsrs/review_log.py @@ -0,0 +1,117 @@ +""" +fsrs.review_log +--------- + +This module defines the ReviewLog and Rating classes. + +Classes: + ReviewLog: Represents the log entry of a Card that has been reviewed. + Rating: Enum representing the four possible ratings when reviewing a card. +""" + +from __future__ import annotations +from dataclasses import dataclass +from datetime import datetime +from typing import TypedDict +import json +from typing_extensions import Self +from fsrs.rating import Rating + + +class ReviewLogDict(TypedDict): + """ + JSON-serializable dictionary representation of a ReviewLog object. + """ + + card_id: int + rating: int + review_datetime: str + review_duration: int | None + + +@dataclass +class ReviewLog: + """ + Represents the log entry of a Card object that has been reviewed. + + Attributes: + card_id: The id of the card being reviewed. + rating: The rating given to the card during the review. + review_datetime: The date and time of the review. + review_duration: The number of milliseconds it took to review the card or None if unspecified. + """ + + card_id: int + rating: Rating + review_datetime: datetime + review_duration: int | None + + def to_dict( + self, + ) -> ReviewLogDict: + """ + Returns a dictionary representation of the ReviewLog object. + + Returns: + ReviewLogDict: A dictionary representation of the ReviewLog object. + """ + + return { + "card_id": self.card_id, + "rating": int(self.rating), + "review_datetime": self.review_datetime.isoformat(), + "review_duration": self.review_duration, + } + + @classmethod + def from_dict( + cls, + source_dict: ReviewLogDict, + ) -> Self: + """ + Creates a ReviewLog object from an existing dictionary. + + Args: + source_dict: A dictionary representing an existing ReviewLog object. + + Returns: + Self: A ReviewLog object created from the provided dictionary. + """ + + return cls( + card_id=source_dict["card_id"], + rating=Rating(int(source_dict["rating"])), + review_datetime=datetime.fromisoformat(source_dict["review_datetime"]), + review_duration=source_dict["review_duration"], + ) + + def to_json(self, indent: int | str | None = None) -> str: + """ + Returns a JSON-serialized string of the ReviewLog object. + + Args: + indent: Equivalent argument to the indent in json.dumps() + + Returns: + str: A JSON-serialized string of the ReviewLog object. + """ + + return json.dumps(self.to_dict(), indent=indent) + + @classmethod + def from_json(cls, source_json: str) -> Self: + """ + Creates a ReviewLog object from a JSON-serialized string. + + Args: + source_json: A JSON-serialized string of an existing ReviewLog object. + + Returns: + Self: A ReviewLog object created from the JSON string. + """ + + source_dict: ReviewLogDict = json.loads(source_json) + return cls.from_dict(source_dict=source_dict) + + +__all__ = ["ReviewLog"] diff --git a/src/heurams/vendor/pyfsrs/scheduler.py b/src/heurams/vendor/pyfsrs/scheduler.py new file mode 100644 index 0000000..6d42ecb --- /dev/null +++ b/src/heurams/vendor/pyfsrs/scheduler.py @@ -0,0 +1,856 @@ +""" +fsrs.scheduler +--------- + +This module defines the Scheduler class as well as the various constants used in its calculations. + +Classes: + Scheduler: The FSRS spaced-repetition scheduler. +""" + +from __future__ import annotations +from collections.abc import Sequence +import math +from datetime import datetime, timezone, timedelta +from copy import copy +import json +from random import random +from dataclasses import dataclass +from fsrs.state import State +from fsrs.card import Card +from fsrs.rating import Rating +from fsrs.review_log import ReviewLog +from typing import TYPE_CHECKING, TypedDict, overload + +if TYPE_CHECKING: + from torch import Tensor # torch is optional; import only for type checking +from typing_extensions import Self + +FSRS_DEFAULT_DECAY = 0.1542 +DEFAULT_PARAMETERS = ( + 0.212, + 1.2931, + 2.3065, + 8.2956, + 6.4133, + 0.8334, + 3.0194, + 0.001, + 1.8722, + 0.1666, + 0.796, + 1.4835, + 0.0614, + 0.2629, + 1.6483, + 0.6014, + 1.8729, + 0.5425, + 0.0912, + 0.0658, + FSRS_DEFAULT_DECAY, +) + +STABILITY_MIN = 0.001 +LOWER_BOUNDS_PARAMETERS = ( + STABILITY_MIN, + STABILITY_MIN, + STABILITY_MIN, + STABILITY_MIN, + 1.0, + 0.001, + 0.001, + 0.001, + 0.0, + 0.0, + 0.001, + 0.001, + 0.001, + 0.001, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.1, +) + +INITIAL_STABILITY_MAX = 100.0 +UPPER_BOUNDS_PARAMETERS = ( + INITIAL_STABILITY_MAX, + INITIAL_STABILITY_MAX, + INITIAL_STABILITY_MAX, + INITIAL_STABILITY_MAX, + 10.0, + 4.0, + 4.0, + 0.75, + 4.5, + 0.8, + 3.5, + 5.0, + 0.25, + 0.9, + 4.0, + 1.0, + 6.0, + 2.0, + 2.0, + 0.8, + 0.8, +) + +MIN_DIFFICULTY = 1.0 +MAX_DIFFICULTY = 10.0 + +FUZZ_RANGES = [ + { + "start": 2.5, + "end": 7.0, + "factor": 0.15, + }, + { + "start": 7.0, + "end": 20.0, + "factor": 0.1, + }, + { + "start": 20.0, + "end": math.inf, + "factor": 0.05, + }, +] + + +class SchedulerDict(TypedDict): + """ + JSON-serializable dictionary representation of a Scheduler object. + """ + + parameters: list[float] + desired_retention: float + learning_steps: list[int] + relearning_steps: list[int] + maximum_interval: int + enable_fuzzing: bool + + +@dataclass(init=False) +class Scheduler: + """ + The FSRS scheduler. + + Enables the reviewing and future scheduling of cards according to the FSRS algorithm. + + Attributes: + parameters: The model weights of the FSRS scheduler. + desired_retention: The desired retention rate of cards scheduled with the scheduler. + learning_steps: Small time intervals that schedule cards in the Learning state. + relearning_steps: Small time intervals that schedule cards in the Relearning state. + maximum_interval: The maximum number of days a Review-state card can be scheduled into the future. + enable_fuzzing: Whether to apply a small amount of random 'fuzz' to calculated intervals. + """ + + parameters: tuple[float, ...] + desired_retention: float + learning_steps: tuple[timedelta, ...] + relearning_steps: tuple[timedelta, ...] + maximum_interval: int + enable_fuzzing: bool + + def __init__( + self, + parameters: Sequence[float] = DEFAULT_PARAMETERS, + desired_retention: float = 0.9, + learning_steps: tuple[timedelta, ...] | list[timedelta] = ( + timedelta(minutes=1), + timedelta(minutes=10), + ), + relearning_steps: tuple[timedelta, ...] | list[timedelta] = ( + timedelta(minutes=10), + ), + maximum_interval: int = 36500, + enable_fuzzing: bool = True, + ) -> None: + self._validate_parameters(parameters=parameters) + + self.parameters = tuple(parameters) + self.desired_retention = desired_retention + self.learning_steps = tuple(learning_steps) + self.relearning_steps = tuple(relearning_steps) + self.maximum_interval = maximum_interval + self.enable_fuzzing = enable_fuzzing + + self._DECAY = -self.parameters[20] + self._FACTOR = 0.9 ** (1 / self._DECAY) - 1 + + def _validate_parameters(self, *, parameters: Sequence[float]) -> None: + if len(parameters) != len(LOWER_BOUNDS_PARAMETERS): + raise ValueError( + f"Expected {len(LOWER_BOUNDS_PARAMETERS)} parameters, got {len(parameters)}." + ) + + error_messages = [] + for index, (parameter, lower_bound, upper_bound) in enumerate( + zip(parameters, LOWER_BOUNDS_PARAMETERS, UPPER_BOUNDS_PARAMETERS) + ): + if not lower_bound <= parameter <= upper_bound: + error_message = f"parameters[{index}] = {parameter} is out of bounds: ({lower_bound}, {upper_bound})" + error_messages.append(error_message) + + if len(error_messages) > 0: + raise ValueError( + "One or more parameters are out of bounds:\n" + + "\n".join(error_messages) + ) + + def get_card_retrievability( + self, card: Card, current_datetime: datetime | None = None + ) -> float: + """ + Calculates a Card object's current retrievability for a given date and time. + + The retrievability of a card is the predicted probability that the card is correctly recalled at the provided datetime. + + Args: + card: The card whose retrievability is to be calculated + current_datetime: The current date and time + + Returns: + float: The retrievability of the Card object. + """ + + if card.last_review is None or card.stability is None: + return 0 + + if current_datetime is None: + current_datetime = datetime.now(timezone.utc) + + elapsed_days = max(0, (current_datetime - card.last_review).days) + + return (1 + self._FACTOR * elapsed_days / card.stability) ** self._DECAY + + def review_card( + self, + card: Card, + rating: Rating, + review_datetime: datetime | None = None, + review_duration: int | None = None, + ) -> tuple[Card, ReviewLog]: + """ + Reviews a card with a given rating at a given time for a specified duration. + + Args: + card: The card being reviewed. + rating: The chosen rating for the card being reviewed. + review_datetime: The date and time of the review. + review_duration: The number of miliseconds it took to review the card or None if unspecified. + + Returns: + tuple[Card,ReviewLog]: A tuple containing the updated, reviewed card and its corresponding review log. + + Raises: + ValueError: If the `review_datetime` argument is not timezone-aware and set to UTC. + """ + + if review_datetime is not None and ( + (review_datetime.tzinfo is None) or (review_datetime.tzinfo != timezone.utc) + ): + raise ValueError("datetime must be timezone-aware and set to UTC") + + card = copy(card) + + if review_datetime is None: + review_datetime = datetime.now(timezone.utc) + + days_since_last_review = ( + (review_datetime - card.last_review).days if card.last_review else None + ) + + match card.state: + case State.Learning: + assert card.step is not None + + # update the card's stability and difficulty + if card.stability is None or card.difficulty is None: + card.stability = self._initial_stability(rating=rating) + card.difficulty = self._initial_difficulty( + rating=rating, clamp=True + ) + + elif days_since_last_review is not None and days_since_last_review < 1: + card.stability = self._short_term_stability( + stability=card.stability, rating=rating + ) + card.difficulty = self._next_difficulty( + difficulty=card.difficulty, rating=rating + ) + + else: + card.stability = self._next_stability( + difficulty=card.difficulty, + stability=card.stability, + retrievability=self.get_card_retrievability( + card, + current_datetime=review_datetime, + ), + rating=rating, + ) + card.difficulty = self._next_difficulty( + difficulty=card.difficulty, rating=rating + ) + + # calculate the card's next interval + ## first if-clause handles edge case where the Card in the Learning state was previously + ## scheduled with a Scheduler with more learning_steps than the current Scheduler + if len(self.learning_steps) == 0 or ( + card.step >= len(self.learning_steps) + and rating in (Rating.Hard, Rating.Good, Rating.Easy) + ): + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval(stability=card.stability) + next_interval = timedelta(days=next_interval_days) + + else: + match rating: + case Rating.Again: + card.step = 0 + next_interval = self.learning_steps[card.step] + + case Rating.Hard: + # card step stays the same + + if card.step == 0 and len(self.learning_steps) == 1: + next_interval = self.learning_steps[0] * 1.5 + elif card.step == 0 and len(self.learning_steps) >= 2: + next_interval = ( + self.learning_steps[0] + self.learning_steps[1] + ) / 2.0 + else: + next_interval = self.learning_steps[card.step] + + case Rating.Good: + if card.step + 1 == len( + self.learning_steps + ): # the last step + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + else: + card.step += 1 + next_interval = self.learning_steps[card.step] + + case Rating.Easy: + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + case _: + raise ValueError(f"Unknown rating: {rating}") + + case State.Review: + assert card.stability is not None + assert card.difficulty is not None + + # update the card's stability and difficulty + if days_since_last_review is not None and days_since_last_review < 1: + card.stability = self._short_term_stability( + stability=card.stability, rating=rating + ) + else: + card.stability = self._next_stability( + difficulty=card.difficulty, + stability=card.stability, + retrievability=self.get_card_retrievability( + card, + current_datetime=review_datetime, + ), + rating=rating, + ) + + card.difficulty = self._next_difficulty( + difficulty=card.difficulty, rating=rating + ) + + # calculate the card's next interval + match rating: + case Rating.Again: + # if there are no relearning steps (they were left blank) + if len(self.relearning_steps) == 0: + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + else: + card.state = State.Relearning + card.step = 0 + + next_interval = self.relearning_steps[card.step] + + case Rating.Hard | Rating.Good | Rating.Easy: + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + case _: + raise ValueError(f"Unknown rating: {rating}") + + case State.Relearning: + assert card.stability is not None + assert card.difficulty is not None + assert card.step is not None + + # update the card's stability and difficulty + if days_since_last_review is not None and days_since_last_review < 1: + card.stability = self._short_term_stability( + stability=card.stability, rating=rating + ) + card.difficulty = self._next_difficulty( + difficulty=card.difficulty, rating=rating + ) + + else: + card.stability = self._next_stability( + difficulty=card.difficulty, + stability=card.stability, + retrievability=self.get_card_retrievability( + card, + current_datetime=review_datetime, + ), + rating=rating, + ) + card.difficulty = self._next_difficulty( + difficulty=card.difficulty, rating=rating + ) + + # calculate the card's next interval + ## first if-clause handles edge case where the Card in the Relearning state was previously + ## scheduled with a Scheduler with more relearning_steps than the current Scheduler + if len(self.relearning_steps) == 0 or ( + card.step >= len(self.relearning_steps) + and rating in (Rating.Hard, Rating.Good, Rating.Easy) + ): + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval(stability=card.stability) + next_interval = timedelta(days=next_interval_days) + + else: + match rating: + case Rating.Again: + card.step = 0 + next_interval = self.relearning_steps[card.step] + + case Rating.Hard: + # card step stays the same + + if card.step == 0 and len(self.relearning_steps) == 1: + next_interval = self.relearning_steps[0] * 1.5 + elif card.step == 0 and len(self.relearning_steps) >= 2: + next_interval = ( + self.relearning_steps[0] + self.relearning_steps[1] + ) / 2.0 + else: + next_interval = self.relearning_steps[card.step] + + case Rating.Good: + if card.step + 1 == len( + self.relearning_steps + ): # the last step + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + else: + card.step += 1 + next_interval = self.relearning_steps[card.step] + + case Rating.Easy: + card.state = State.Review + card.step = None + + next_interval_days = self._next_interval( + stability=card.stability + ) + next_interval = timedelta(days=next_interval_days) + + case _: + raise ValueError(f"Unknown rating: {rating}") + + case _: + raise ValueError(f"Unknown card state: {card.state}") + + if self.enable_fuzzing and card.state == State.Review: + next_interval = self._get_fuzzed_interval(interval=next_interval) + + card.due = review_datetime + next_interval + card.last_review = review_datetime + + review_log = ReviewLog( + card_id=card.card_id, + rating=rating, + review_datetime=review_datetime, + review_duration=review_duration, + ) + + return card, review_log + + def reschedule_card(self, card: Card, review_logs: list[ReviewLog]) -> Card: + """ + Reschedules/updates the given card with the current scheduler provided that card's review logs. + + If the current card was previously scheduled with a different scheduler, you may want to reschedule/update + it as if it had always been scheduled with this current scheduler. For example, you may want to reschedule + each of your cards with a new scheduler after computing the optimal parameters with the Optimizer. + + Args: + card: The card to be rescheduled/updated. + review_logs: A list of that card's review logs (order doesn't matter). + + Returns: + Card: A new card that has been rescheduled/updated with this current scheduler. + + Raises: + ValueError: If any of the review logs are for a card other than the one specified, this will raise an error. + + """ + + for review_log in review_logs: + if review_log.card_id != card.card_id: + raise ValueError( + f"ReviewLog card_id {review_log.card_id} does not match Card card_id {card.card_id}" + ) + + review_logs = sorted(review_logs, key=lambda log: log.review_datetime) + + rescheduled_card = Card(card_id=card.card_id, due=card.due) + + for review_log in review_logs: + rescheduled_card, _ = self.review_card( + card=rescheduled_card, + rating=review_log.rating, + review_datetime=review_log.review_datetime, + ) + + return rescheduled_card + + def to_dict( + self, + ) -> SchedulerDict: + """ + Returns a dictionary representation of the Scheduler object. + + Returns: + SchedulerDict: A dictionary representation of the Scheduler object. + """ + + return { + "parameters": list(self.parameters), + "desired_retention": self.desired_retention, + "learning_steps": [ + int(learning_step.total_seconds()) + for learning_step in self.learning_steps + ], + "relearning_steps": [ + int(relearning_step.total_seconds()) + for relearning_step in self.relearning_steps + ], + "maximum_interval": self.maximum_interval, + "enable_fuzzing": self.enable_fuzzing, + } + + @classmethod + def from_dict(cls, source_dict: SchedulerDict) -> Self: + """ + Creates a Scheduler object from an existing dictionary. + + Args: + source_dict: A dictionary representing an existing Scheduler object. + + Returns: + Self: A Scheduler object created from the provided dictionary. + """ + + return cls( + parameters=source_dict["parameters"], + desired_retention=source_dict["desired_retention"], + learning_steps=[ + timedelta(seconds=learning_step) + for learning_step in source_dict["learning_steps"] + ], + relearning_steps=[ + timedelta(seconds=relearning_step) + for relearning_step in source_dict["relearning_steps"] + ], + maximum_interval=source_dict["maximum_interval"], + enable_fuzzing=source_dict["enable_fuzzing"], + ) + + def to_json(self, indent: int | str | None = None) -> str: + """ + Returns a JSON-serialized string of the Scheduler object. + + Args: + indent: Equivalent argument to the indent in json.dumps() + + Returns: + str: A JSON-serialized string of the Scheduler object. + """ + + return json.dumps(self.to_dict(), indent=indent) + + @classmethod + def from_json(cls, source_json: str) -> Self: + """ + Creates a Scheduler object from a JSON-serialized string. + + Args: + source_json: A JSON-serialized string of an existing Scheduler object. + + Returns: + Self: A Scheduler object created from the JSON string. + """ + + source_dict: SchedulerDict = json.loads(source_json) + return cls.from_dict(source_dict=source_dict) + + @overload + def _clamp_difficulty(self, *, difficulty: float) -> float: ... + @overload + def _clamp_difficulty(self, *, difficulty: Tensor) -> Tensor: ... + def _clamp_difficulty(self, *, difficulty: float | Tensor) -> float | Tensor: + if isinstance(difficulty, (int, float)): + difficulty = min(max(difficulty, MIN_DIFFICULTY), MAX_DIFFICULTY) + else: + difficulty = difficulty.clamp(min=MIN_DIFFICULTY, max=MAX_DIFFICULTY) + + return difficulty + + @overload + def _clamp_stability(self, *, stability: float) -> float: ... + @overload + def _clamp_stability(self, *, stability: Tensor) -> Tensor: ... + def _clamp_stability(self, *, stability: float | Tensor) -> float | Tensor: + if isinstance(stability, (int, float)): + stability = max(stability, STABILITY_MIN) + else: + stability = stability.clamp(min=STABILITY_MIN) + + return stability + + def _initial_stability(self, *, rating: Rating) -> float: + initial_stability = self.parameters[rating - 1] + + initial_stability = self._clamp_stability(stability=initial_stability) + + return initial_stability + + def _initial_difficulty(self, *, rating: Rating, clamp: bool) -> float: + initial_difficulty = ( + self.parameters[4] - (math.e ** (self.parameters[5] * (rating - 1))) + 1 + ) + + if clamp: + initial_difficulty = self._clamp_difficulty(difficulty=initial_difficulty) + + return initial_difficulty + + def _next_interval(self, *, stability: float) -> int: + next_interval = (stability / self._FACTOR) * ( + (self.desired_retention ** (1 / self._DECAY)) - 1 + ) + + if not isinstance(next_interval, (int, float)): + next_interval = next_interval.detach().item() + + next_interval = round(next_interval) # intervals are full days + + # must be at least 1 day long + next_interval = max(next_interval, 1) + + # can not be longer than the maximum interval + next_interval = min(next_interval, self.maximum_interval) + + return next_interval + + def _short_term_stability(self, *, stability: float, rating: Rating) -> float: + short_term_stability_increase = ( + math.e ** (self.parameters[17] * (rating - 3 + self.parameters[18])) + ) * (stability ** -self.parameters[19]) + + if rating in (Rating.Good, Rating.Easy): + if isinstance(short_term_stability_increase, (int, float)): + short_term_stability_increase = max(short_term_stability_increase, 1.0) + else: + short_term_stability_increase = short_term_stability_increase.clamp( + min=1.0 + ) + + short_term_stability = stability * short_term_stability_increase + + short_term_stability = self._clamp_stability(stability=short_term_stability) + + return short_term_stability + + def _next_difficulty(self, *, difficulty: float, rating: Rating) -> float: + def _linear_damping(*, delta_difficulty: float, difficulty: float) -> float: + return (10.0 - difficulty) * delta_difficulty / 9.0 + + def _mean_reversion(*, arg_1: float, arg_2: float) -> float: + return self.parameters[7] * arg_1 + (1 - self.parameters[7]) * arg_2 + + arg_1 = self._initial_difficulty(rating=Rating.Easy, clamp=False) + + delta_difficulty = -(self.parameters[6] * (rating - 3)) + arg_2 = difficulty + _linear_damping( + delta_difficulty=delta_difficulty, difficulty=difficulty + ) + + next_difficulty = _mean_reversion(arg_1=arg_1, arg_2=arg_2) + + next_difficulty = self._clamp_difficulty(difficulty=next_difficulty) + + return next_difficulty + + def _next_stability( + self, + *, + difficulty: float, + stability: float, + retrievability: float, + rating: Rating, + ) -> float: + if rating == Rating.Again: + next_stability = self._next_forget_stability( + difficulty=difficulty, + stability=stability, + retrievability=retrievability, + ) + + elif rating in (Rating.Hard, Rating.Good, Rating.Easy): + next_stability = self._next_recall_stability( + difficulty=difficulty, + stability=stability, + retrievability=retrievability, + rating=rating, + ) + + else: + raise ValueError(f"Unknown rating: {rating}") + + next_stability = self._clamp_stability(stability=next_stability) + + return next_stability + + def _next_forget_stability( + self, *, difficulty: float, stability: float, retrievability: float + ) -> float: + next_forget_stability_long_term_params = ( + self.parameters[11] + * (difficulty ** -self.parameters[12]) + * (((stability + 1) ** (self.parameters[13])) - 1) + * (math.e ** ((1 - retrievability) * self.parameters[14])) + ) + + next_forget_stability_short_term_params = stability / ( + math.e ** (self.parameters[17] * self.parameters[18]) + ) + + return min( + next_forget_stability_long_term_params, + next_forget_stability_short_term_params, + ) + + def _next_recall_stability( + self, + *, + difficulty: float, + stability: float, + retrievability: float, + rating: Rating, + ) -> float: + hard_penalty = self.parameters[15] if rating == Rating.Hard else 1 + easy_bonus = self.parameters[16] if rating == Rating.Easy else 1 + + return stability * ( + 1 + + (math.e ** (self.parameters[8])) + * (11 - difficulty) + * (stability ** -self.parameters[9]) + * ((math.e ** ((1 - retrievability) * self.parameters[10])) - 1) + * hard_penalty + * easy_bonus + ) + + def _get_fuzzed_interval(self, *, interval: timedelta) -> timedelta: + """ + Takes the current calculated interval and adds a small amount of random fuzz to it. + For example, a card that would've been due in 50 days, after fuzzing, might be due in 49, or 51 days. + + Args: + interval: The calculated next interval, before fuzzing. + + Returns: + timedelta: The new interval, after fuzzing. + """ + + interval_days = interval.days + + if interval_days < 2.5: # fuzz is not applied to intervals less than 2.5 + return interval + + def _get_fuzz_range(*, interval_days: int) -> tuple[int, int]: + """ + Helper function that computes the possible upper and lower bounds of the interval after fuzzing. + """ + + delta = 1.0 + for fuzz_range in FUZZ_RANGES: + delta += fuzz_range["factor"] * max( + min(float(interval_days), fuzz_range["end"]) - fuzz_range["start"], + 0.0, + ) + + min_ivl = int(round(interval_days - delta)) + max_ivl = int(round(interval_days + delta)) + + # make sure the min_ivl and max_ivl fall into a valid range + min_ivl = max(2, min_ivl) + max_ivl = min(max_ivl, self.maximum_interval) + min_ivl = min(min_ivl, max_ivl) + + return min_ivl, max_ivl + + min_ivl, max_ivl = _get_fuzz_range(interval_days=interval_days) + + fuzzed_interval_days = ( + random() * (max_ivl - min_ivl + 1) + ) + min_ivl # the next interval is a random value between min_ivl and max_ivl + + fuzzed_interval_days = min(round(fuzzed_interval_days), self.maximum_interval) + + fuzzed_interval = timedelta(days=fuzzed_interval_days) + + return fuzzed_interval + + +__all__ = ["Scheduler"] diff --git a/src/heurams/vendor/pyfsrs/state.py b/src/heurams/vendor/pyfsrs/state.py new file mode 100644 index 0000000..e4157c0 --- /dev/null +++ b/src/heurams/vendor/pyfsrs/state.py @@ -0,0 +1,14 @@ +from enum import IntEnum + + +class State(IntEnum): + """ + Enum representing the learning state of a Card object. + """ + + Learning = 1 + Review = 2 + Relearning = 3 + + +__all__ = ["State"] diff --git a/uv.lock b/uv.lock index 7581f96..16a170f 100644 --- a/uv.lock +++ b/uv.lock @@ -183,21 +183,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/21/6ebbc7fc6a4e58bcd49130273a072f7c2e4e6dc03735e078895b47148e30/edge_tts-7.0.2-py3-none-any.whl", hash = "sha256:effc554c249f02bd5013f28cd1faa22802e0757b031a7759be5960084ccb8d76", size = 26274, upload-time = "2025-05-03T10:34:15.872Z" }, ] -[[package]] -name = "flet" -version = "0.80.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx", marker = "platform_system != 'Pyodide'" }, - { name = "msgpack" }, - { name = "oauthlib", marker = "platform_system != 'Pyodide'" }, - { name = "repath" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/80/0dbf92f0d829729be0f22721fa7dd6cffbdaca6017e51379f96666f20d65/flet-0.80.1.tar.gz", hash = "sha256:1ecfa713e46051c3b4b856ac9d46bb69aa476c51d35823b518387cfb2d415d64", size = 349528, upload-time = "2026-01-02T21:40:32.697Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/20/085201355f6525756ab32fc766e26559983ca6cbc0bd24e073846cf5492f/flet-0.80.1-py3-none-any.whl", hash = "sha256:645dfa7e0ff9648b94a3a47b6e0f26944046200e631e25f397bd4c5295067b9d", size = 440587, upload-time = "2026-01-02T21:40:30.988Z" }, -] - [[package]] name = "frozenlist" version = "1.8.0" @@ -306,18 +291,12 @@ dependencies = [ { name = "openai" }, { name = "playsound" }, { name = "psutil" }, - { name = "pygobject" }, { name = "tabulate" }, { name = "textual" }, { name = "toml" }, { name = "transitions" }, ] -[package.dev-dependencies] -dev = [ - { name = "flet" }, -] - [package.metadata] requires-dist = [ { name = "edge-tts", specifier = "==7.0.2" }, @@ -325,16 +304,12 @@ requires-dist = [ { name = "openai", specifier = "==1.0.0" }, { name = "playsound", specifier = "==1.2.2" }, { name = "psutil", specifier = ">=7.2.1" }, - { name = "pygobject", specifier = ">=3.54.5" }, { name = "tabulate", specifier = ">=0.9.0" }, { name = "textual", specifier = "==7.0.0" }, { name = "toml", specifier = "==0.10.2" }, { name = "transitions", specifier = "==0.9.3" }, ] -[package.metadata.requires-dev] -dev = [{ name = "flet", specifier = ">=0.80.1" }] - [[package]] name = "httpcore" version = "1.0.9" @@ -428,50 +403,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "msgpack" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, - { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, - { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, - { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, - { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, - { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, - { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, - { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, - { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, - { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, - { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, - { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, - { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, - { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, - { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, - { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, - { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, - { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, - { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, - { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, - { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, - { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, - { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, - { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, - { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, - { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, -] - [[package]] name = "multidict" version = "6.7.0" @@ -571,15 +502,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, ] -[[package]] -name = "oauthlib" -version = "3.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, -] - [[package]] name = "openai" version = "1.0.0" @@ -726,25 +648,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, ] -[[package]] -name = "pycairo" -version = "1.29.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/28/6363087b9e60af031398a6ee5c248639eefc6cc742884fa2789411b1f73b/pycairo-1.29.0-cp312-cp312-win32.whl", hash = "sha256:91bcd7b5835764c616a615d9948a9afea29237b34d2ed013526807c3d79bb1d0", size = 751486, upload-time = "2025-11-11T19:11:54.451Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d2/d146f1dd4ef81007686ac52231dd8f15ad54cf0aa432adaefc825475f286/pycairo-1.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f01c3b5e49ef9411fff6bc7db1e765f542dc1c9cfed4542958a5afa3a8b8e76", size = 845383, upload-time = "2025-11-11T19:12:01.551Z" }, - { url = "https://files.pythonhosted.org/packages/01/16/6e6f33bb79ec4a527c9e633915c16dc55a60be26b31118dbd0d5859e8c51/pycairo-1.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:eafe3d2076f3533535ad4a361fa0754e0ee66b90e548a3a0f558fed00b1248f2", size = 694518, upload-time = "2025-11-11T19:12:06.561Z" }, - { url = "https://files.pythonhosted.org/packages/f0/21/3f477dc318dd4e84a5ae6301e67284199d7e5a2384f3063714041086b65d/pycairo-1.29.0-cp313-cp313-win32.whl", hash = "sha256:3eb382a4141591807073274522f7aecab9e8fa2f14feafd11ac03a13a58141d7", size = 750949, upload-time = "2025-11-11T19:12:12.198Z" }, - { url = "https://files.pythonhosted.org/packages/43/34/7d27a333c558d6ac16dbc12a35061d389735e99e494ee4effa4ec6d99bed/pycairo-1.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:91114e4b3fbf4287c2b0788f83e1f566ce031bda49cf1c3c3c19c3e986e95c38", size = 844149, upload-time = "2025-11-11T19:12:19.171Z" }, - { url = "https://files.pythonhosted.org/packages/15/43/e782131e23df69e5c8e631a016ed84f94bbc4981bf6411079f57af730a23/pycairo-1.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:09b7f69a5ff6881e151354ea092137b97b0b1f0b2ab4eb81c92a02cc4a08e335", size = 693595, upload-time = "2025-11-11T19:12:23.445Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, - { url = "https://files.pythonhosted.org/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, - { url = "https://files.pythonhosted.org/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, - { url = "https://files.pythonhosted.org/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, -] - [[package]] name = "pydantic" version = "2.12.5" @@ -840,27 +743,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] -[[package]] -name = "pygobject" -version = "3.54.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycairo" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d3/a5/68f883df1d8442e3b267cb92105a4b2f0de819bd64ac9981c2d680d3f49f/pygobject-3.54.5.tar.gz", hash = "sha256:b6656f6348f5245606cf15ea48c384c7f05156c75ead206c1b246c80a22fb585", size = 1274658, upload-time = "2025-10-18T13:45:03.121Z" } - -[[package]] -name = "repath" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/65/e1/824989291d0f01886074fdf9504ba54598f5665bc4dd373b589b87e76608/repath-0.9.0.tar.gz", hash = "sha256:8292139bac6a0e43fd9d70605d4e8daeb25d46672e484ed31a24c7ce0aef0fb7", size = 5492, upload-time = "2019-10-08T00:25:22.3Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/ed/92e9b8a3ffc562f21df14ef2538f54e911df29730e1f0d79130a4edc86e7/repath-0.9.0-py3-none-any.whl", hash = "sha256:ee079d6c91faeb843274d22d8f786094ee01316ecfe293a1eb6546312bb6a318", size = 4738, upload-time = "2019-10-08T00:25:20.842Z" }, -] - [[package]] name = "rich" version = "14.2.0" From 215a8648c28e5d97d6d0d09e9f3188db24824039 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 16 Apr 2026 13:20:12 +0800 Subject: [PATCH 29/79] =?UTF-8?q?style:=20=E7=A7=BB=E9=99=A4=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E4=B8=8D=E5=BD=93=E7=9A=84=E9=83=A8=E5=88=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/config/config.toml | 0 src/heurams/context.py | 20 +- src/heurams/interface/__init__.py | 8 - src/heurams/interface/css/main.tcss | 29 -- src/heurams/interface/screens/about.py | 20 +- src/heurams/interface/screens/dashboard.py | 3 +- src/heurams/interface/screens/llmchat.py | 330 ------------------ src/heurams/interface/screens/navigator.py | 10 +- src/heurams/interface/screens/radio.py | 217 ------------ src/heurams/interface/screens/repocreator.py | 166 --------- src/heurams/interface/screens/repoeditor.py | 267 -------------- src/heurams/kernel/README.md | 3 +- src/heurams/kernel/particles/atom.py | 2 +- src/heurams/kernel/reactor/README.md | 54 ++- src/heurams/kernel/reactor/fission.py | 2 +- src/heurams/kernel/repolib/navi.py | 3 - src/heurams/services/audio_service.py | 2 +- src/heurams/services/config.py | 2 +- src/heurams/services/llm_service.py | 228 ------------ src/heurams/services/sync_service.py | 0 src/heurams/services/tts_service.py | 2 +- src/heurams/services/version.py | 2 +- 22 files changed, 87 insertions(+), 1283 deletions(-) rename src/heurams/interface/screens/configure.py => examples/data/config/config.toml (100%) delete mode 100644 src/heurams/interface/screens/llmchat.py delete mode 100644 src/heurams/interface/screens/radio.py delete mode 100644 src/heurams/interface/screens/repocreator.py delete mode 100644 src/heurams/interface/screens/repoeditor.py delete mode 100644 src/heurams/kernel/repolib/navi.py delete mode 100644 src/heurams/services/llm_service.py delete mode 100644 src/heurams/services/sync_service.py diff --git a/src/heurams/interface/screens/configure.py b/examples/data/config/config.toml similarity index 100% rename from src/heurams/interface/screens/configure.py rename to examples/data/config/config.toml diff --git a/src/heurams/context.py b/src/heurams/context.py index d4d4521..c4c7af8 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -9,29 +9,31 @@ from contextvars import ContextVar from heurams.services.config import ConfigFile from heurams.services.logger import get_logger -# 默认配置文件路径规定: 以包目录为准 -# 用户配置文件路径规定: 以运行目录为准 -# 数据文件路径规定: 以运行目录为准 +# 默认数据目录, 以包目录下的 data 为准 +# 用户数据目录, 以运行目录下的 data 为准 + +rootdir: pathlib.Path = pathlib.Path(__file__).parent +"""包目录路径, 也就是 heurams 目录.""" -rootdir = pathlib.Path(__file__).parent workdir = pathlib.Path.cwd() -#print(f"项目根目录: {rootdir}") -#print(f"工作目录: {workdir}") +"""工作目录路径.""" + logger = get_logger(__name__) -logger.debug(f"项目根目录: {rootdir}") +logger.debug(f"包目录: {rootdir}") logger.debug(f"工作目录: {workdir}") (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) -config_var: ContextVar[ConfigFile] = ContextVar( +config_var: ContextVar[ConfigFile].get = ContextVar( "config_var", default=ConfigFile(workdir / "data" / "config" / "config.toml"), ) +"""配置对象的全局引用对象.""" class ConfigContext: """ 功能完备的上下文管理器 - 用于临时切换配置的作用域, 支持嵌套使用 + 用于临时切换配置引用对象的作用域, 支持嵌套使用 Example: >>> with ConfigContext(test_config): diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 2bb3171..f02130e 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -18,12 +18,8 @@ print("加载用户界面布局... ", end="", flush=True) _start = perf_counter() from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen -from .screens.llmchat import LLMChatScreen from .screens.navigator import NavigatorScreen from .screens.precache import PrecachingScreen -from .screens.radio import RadioScreen -from .screens.repocreator import RepoCreatorScreen -from .screens.repoeditor import RepoEditorScreen from .screens.synctool import SyncScreen _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -44,14 +40,10 @@ class HeurAMSApp(App): ] SCREENS = { "dashboard": DashboardScreen, - "repo_creator": RepoCreatorScreen, "precache_all": PrecachingScreen, "synctool": SyncScreen, "about": AboutScreen, "navigator": NavigatorScreen, - "radio": RadioScreen, - "repo_editor": RepoEditorScreen, - "llmchat": LLMChatScreen, # "config": ConfigScreen, } diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index 347966d..ac93bce 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -1,5 +1,3 @@ - - NavigatorScreen { align: center middle; } @@ -32,33 +30,6 @@ NavigatorScreen { background: $surface; } -/* LLM 聊天界面样式 */ -LLMChatScreen { - background: $surface; -} - -#chat-container { - height: 100%; - padding: 1; -} - -#toolbar { - height: 3; - margin-bottom: 1; - align: center middle; -} - -#toolbar Button { - margin: 0 1; -} - -#chat-log { - height: 1fr; - border: solid $primary; - padding: 1; - background: $surface; -} - #dashboardtop { height: 4 } diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index beff979..f7d6b19 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -35,24 +35,26 @@ class AboutScreen(Screen): about_text = f""" # 关于 "潜进" -版本 {version.ver} {version.stage.capitalize()} - -开发代号: {version.codename.capitalize()} {version.codename_cn} +主程序库版本: `{version.ver}-python` +用户界面分支: `Textual TUI (基本用户界面)` +用户界面版本: `{version.ver}` +API 版本代号: `{version.codename.capitalize()}` -一个基于启发式算法的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. +一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. 以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. -您可在项目主页 https://ams.imwangzhiyu.xyz 获取用户指南, 开发文档与软件更新. +您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 作为基本的全功能前端实现与程序库测试, 如果您想去除它, 请移除程序库根目录中的 interface 文件夹. -如果您觉得这个软件有用, 可以给它添加一个星标 :) +您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新. -> 此软件, 以及它作为一个"程序库"是自由且免费的, 但是开发工作必须投入大量精力 -> 即使您不是软件开发人员, 我们也欢迎您加入 HeurAMS 的队伍! +如果您觉得这个软件有用, 可以在它的源代码仓库给它添加一个星标 :) + +> 潜进(HeurAMS), 以及它作为一个"程序库"是自由且免费的, 但是开发工作必须投入大量精力. > 您可以加入各种语言的翻译团队来翻译软件的界面, 您还可以制作图像、主题、音效, 或者改进软件配套的文档…… > 不管您来自何方, 我们都欢迎您加入社区并做出贡献. > 我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. -> 您的慷慨支持, 我们必当涌泉相报. +> 您的慷慨支持, 我们必当涌泉相报. 开发人员列表: diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index cf8b9ce..3827214 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -22,7 +22,6 @@ from heurams.services.logger import get_logger from .about import AboutScreen from .navigator import NavigatorScreen from .preparation import PreparationScreen -from .radio import RadioScreen logger = get_logger(__name__) @@ -90,7 +89,7 @@ class DashboardScreen(Screen): is_due = 0 unit_sum = len(repo) activated_sum = 0 - nextdate = 0x3F3F3F3F + nextdate = float('inf') for i in repo.ident_index: nucleon = pt.Nucleon.create_on_nucleonic_data( nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) diff --git a/src/heurams/interface/screens/llmchat.py b/src/heurams/interface/screens/llmchat.py deleted file mode 100644 index bd54e04..0000000 --- a/src/heurams/interface/screens/llmchat.py +++ /dev/null @@ -1,330 +0,0 @@ -from pathlib import Path -from typing import Optional - -from textual.app import ComposeResult -from textual.containers import Container, Horizontal -from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Input, Label, RichLog, Static - -from heurams.context import * -from heurams.services.llm_service import ChatSession, get_chat_manager -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -class LLMChatScreen(Screen): - """LLM 聊天屏幕""" - - SUB_TITLE = "语言模型集成" - BINDINGS = [ - ("q", "go_back", "返回"), - ("ctrl+s", "save_session", "保存会话"), - ("ctrl+l", "load_session", "加载会话"), - ("ctrl+n", "new_session", "新建会话"), - ("ctrl+c", "clear_history", "清空历史"), - ("escape", "focus_input", "聚焦输入"), - ] - - def __init__( - self, - session_id: Optional[str] = None, - name: str | None = None, - id: str | None = None, - classes: str | None = None, - ) -> None: - super().__init__(name, id, classes) - self.session_id = session_id - self.chat_manager = get_chat_manager() - self.current_session: Optional[ChatSession] = None - self.is_streaming = False - - def compose(self) -> ComposeResult: - """组合界面组件""" - yield Header(show_clock=True) - - with Container(id="chat-container"): - # 顶部工具栏 - with Horizontal(id="toolbar"): - yield Button("新建会话", id="new-session", variant="primary") - yield Button("保存会话", id="save-session", variant="default") - yield Button("加载会话", id="load-session", variant="default") - yield Button("清空历史", id="clear-history", variant="default") - yield Button("设置系统提示", id="set-system-prompt", variant="default") - yield Static(" | ", classes="separator") - yield Label("当前会话:", classes="label") - yield Static(id="current-session-label", classes="session-label") - - # 聊天记录显示区域 - yield RichLog( - id="chat-log", - wrap=True, - highlight=True, - markup=True, - classes="chat-log", - ) - - # 输入区域 - with Horizontal(id="input-container"): - yield Input( - id="message-input", - placeholder="输入消息... (按 Ctrl+Enter 发送, Esc 聚焦)", - classes="message-input", - ) - yield Button( - "发送", id="send-button", variant="primary", classes="send-button" - ) - - # 状态栏 - yield Static(id="status-bar", classes="status-bar") - - yield Footer() - - def on_mount(self) -> None: - """挂载组件时初始化""" - # 获取或创建会话 - self.current_session = self.chat_manager.get_session(self.session_id) - if self.current_session is None: - self.notify("无法创建 LLM 会话,请检查配置", severity="error") - return - - # 更新会话标签 - self.query_one("#current-session-label", Static).update( - f"{self.current_session.session_id}" - ) - - # 加载历史消息到聊天记录 - self._display_history() - - # 聚焦输入框 - self.query_one("#message-input", Input).focus() - - # 检查配置 - self._check_config() - - def _check_config(self): - """检查 LLM 配置""" - config = config_var.get() - provider_name = config["services"]["llm"] - provider_config = config["providers"]["llm"][provider_name] - - if provider_name == "openai": - if not provider_config.get("key") and not provider_config.get("url"): - self.notify( - "未配置 OpenAI API key 或 URL,请在 config.toml 中配置 [providers.llm.openai]", - severity="warning", - ) - - def _display_history(self): - """显示当前会话的历史消息""" - if not self.current_session: - return - - chat_log = self.query_one("#chat-log", RichLog) - chat_log.clear() - - for msg in self.current_session.get_history(): - role = msg["role"] - content = msg["content"] - - if role == "user": - chat_log.write(f"[bold cyan]你:[/bold cyan] {content}") - elif role == "assistant": - chat_log.write(f"[bold green]AI:[/bold green] {content}") - elif role == "system": - # 系统消息不显示在聊天记录中 - pass - - def _add_message_to_log(self, role: str, content: str): - """添加消息到聊天记录显示""" - chat_log = self.query_one("#chat-log", RichLog) - if role == "user": - chat_log.write(f"[bold cyan]你:[/bold cyan] {content}") - elif role == "assistant": - chat_log.write(f"[bold green]AI:[/bold green] {content}") - chat_log.scroll_end() - - async def on_input_submitted(self, event: Input.Submitted): - """处理输入提交""" - if event.input.id == "message-input": - await self._send_message() - - async def on_button_pressed(self, event: Button.Pressed): - """处理按钮点击""" - button_id = event.button.id - - if button_id == "send-button": - await self._send_message() - elif button_id == "new-session": - self.action_new_session() - elif button_id == "save-session": - self.action_save_session() - elif button_id == "load-session": - self.action_load_session() - elif button_id == "clear-history": - self.action_clear_history() - elif button_id == "set-system-prompt": - self.action_set_system_prompt() - - async def _send_message(self): - """发送当前输入的消息""" - if not self.current_session or self.is_streaming: - return - - input_widget = self.query_one("#message-input", Input) - message = input_widget.value.strip() - - if not message: - return - - # 清空输入框 - input_widget.value = "" - - # 显示用户消息 - self._add_message_to_log("user", message) - - # 禁用输入和按钮 - self._set_input_state(disabled=True) - self.is_streaming = True - - # 更新状态 - self.query_one("#status-bar", Static).update("AI 正在思考...") - - try: - # 发送消息并获取响应 - response = await self.current_session.send_message(message) - - # 显示AI响应 - self._add_message_to_log("assistant", response) - - except Exception as e: - error_msg = f"请求失败: {str(e)}" - logger.error(error_msg) - self._add_message_to_log("assistant", f"[red]{error_msg}[/red]") - self.notify(error_msg, severity="error") - - finally: - # 恢复输入和按钮 - self._set_input_state(disabled=False) - self.is_streaming = False - self.query_one("#status-bar", Static).update("就绪") - input_widget.focus() - - def _set_input_state(self, disabled: bool): - """设置输入控件状态""" - self.query_one("#message-input", Input).disabled = disabled - self.query_one("#send-button", Button).disabled = disabled - - async def action_save_session(self): - """保存当前会话到文件""" - if not self.current_session: - self.notify("无当前会话", severity="error") - return - - # 默认保存到 data/chat_sessions/ 目录 - save_dir = Path(config_var.get()["paths"]["data"]) / "chat_sessions" - save_dir.mkdir(exist_ok=True, parents=True) - - file_path = save_dir / f"{self.current_session.session_id}.json" - self.current_session.save_to_file(file_path) - - self.notify(f"会话已保存到 {file_path}", severity="information") - - async def action_load_session(self): - """从文件加载会话""" - # 简化实现:加载默认目录下的第一个会话文件 - save_dir = Path(config_var.get()["paths"]["data"]) / "chat_sessions" - if not save_dir.exists(): - self.notify(f"目录不存在: {save_dir}", severity="error") - return - - session_files = list(save_dir.glob("*.json")) - if not session_files: - self.notify("未找到会话文件", severity="error") - return - - # 使用第一个文件(在实际应用中可以让用户选择) - file_path = session_files[0] - - try: - # 获取 LLM 提供者 - provider_name = config_var.get()["services"]["llm"] - provider_config = config_var.get()["providers"]["llm"][provider_name] - from heurams.providers.llm import providers as prov - - llm_provider = prov[provider_name](provider_config) - - # 加载会话 - self.current_session = ChatSession.load_from_file(file_path, llm_provider) - - # 更新聊天管理器 - self.chat_manager.sessions[self.current_session.session_id] = ( - self.current_session - ) - - # 更新UI - self.query_one("#current-session-label", Static).update( - f"{self.current_session.session_id}" - ) - self._display_history() - - self.notify(f"已加载会话: {file_path.name}", severity="information") - - except Exception as e: - logger.error("加载会话失败: %s", e) - self.notify(f"加载失败: {str(e)}", severity="error") - - async def action_new_session(self): - """创建新会话""" - # 简单实现:使用时间戳作为会话ID - import time - - new_session_id = f"session_{int(time.time())}" - - self.current_session = self.chat_manager.get_session(new_session_id) - - # 更新UI - self.query_one("#current-session-label", Static).update( - f"{self.current_session.session_id}" - ) - self._display_history() - - self.notify(f"已创建新会话: {new_session_id}", severity="information") - self.query_one("#message-input", Input).focus() - - async def action_clear_history(self): - """清空当前会话历史""" - if not self.current_session: - return - - self.current_session.clear_history() - self._display_history() - self.notify("历史已清空", severity="information") - - async def action_set_system_prompt(self): - """设置系统提示词""" - if not self.current_session: - return - - # 使用输入框获取新提示词 - input_widget = self.query_one("#message-input", Input) - current_value = input_widget.value - - # 临时修改输入框提示 - input_widget.placeholder = "输入系统提示词... (按 Enter 确认, Esc 取消)" - input_widget.value = self.current_session.system_prompt - - # 等待用户输入 - self.notify("请输入系统提示词,按 Enter 确认", severity="information") - - # 实际应用中需要更复杂的交互,这里简化处理 - # 用户手动输入后按 Enter 会触发 on_input_submitted - # 这里我们只修改占位符,实际系统提示词设置需要额外界面 - - def action_focus_input(self): - """聚焦到输入框""" - self.query_one("#message-input", Input).focus() - - def action_go_back(self): - """返回上级屏幕""" - self.app.pop_screen() diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index cedb038..cd4907c 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -24,15 +24,13 @@ class NavigatorScreen(ModalScreen): SCREENS = [ ("仪表盘", "dashboard"), - ("电台", "radio"), - ("语言模型集成", "llmchat"), # ("创建仓库", "repo_creator"), ("缓存管理器", "precache_all"), - ("收藏夹管理器", FavoriteManagerScreen), - ("配置设置", "config"), + ("收藏夹", FavoriteManagerScreen), + # ("配置设置", "config"), + # ("调试日志", "logviewer"), + ("同步工具", "synctool"), ("关于此软件", "about"), - ("调试日志", "logviewer"), - # ("同步工具", "synctool"), # ("仓库编辑器", "repo_editor"), ] diff --git a/src/heurams/interface/screens/radio.py b/src/heurams/interface/screens/radio.py deleted file mode 100644 index 6d0b610..0000000 --- a/src/heurams/interface/screens/radio.py +++ /dev/null @@ -1,217 +0,0 @@ -"""用于筛选当日记忆的条目 以音频形式重放""" - -""" "前进电台" 界面""" -import os -from pathlib import Path -from typing import List, Optional - -from textual.app import ComposeResult -from textual.containers import Container, ScrollableContainer -from textual.reactive import reactive -from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, Static - -import heurams.kernel.particles as pt -from heurams.kernel.repolib import Repo -from heurams.context import config_var -from heurams.services.audio_service import play_by_path -from heurams.services.hasher import get_md5 -from heurams.services.logger import get_logger -from heurams.services.tts_service import convertor - -logger = get_logger(__name__) - - -class RadioScreen(Screen): - SUB_TITLE = "电台" - - BINDINGS = [ - ("q", "go_back", "返回"), - ("space", "toggle_play", "播放/暂停"), - ] - - # 当前播放的原子索引 - current_index = reactive(0) - # 播放状态: 'stopped', 'playing', 'paused' - play_state = reactive("stopped") - - def __init__( - self, - name: str | None = None, - id: str | None = None, - classes: str | None = None, - ) -> None: - super().__init__(name, id, classes) - self._organizer() - - def _organizer(self): - repodirs = Repo.probe_valid_repos_in_dir(Path(config_var.get()['paths']['data']) / 'repo') - repos = list(map(lambda repodir: Repo.create_from_repodir(repodir), repodirs)) - for repo in repos: - last_modify = 0.0 - for i in repo.ident_index: - e = pt.Electron.create_on_electonic_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i) - ) - last_modify = max(last_modify, e.las()) - - - def compose(self) -> ComposeResult: - yield Header(show_clock=True) - with Container(id="main"): - yield Label("[b]前进电台[/b]", classes="title") - yield Static(f"共 {len(self.atoms)} 条当日记忆", id="status") - with Container(id="controls"): - yield Button("播放", id="play", variant="success") - yield Button("暂停", id="pause", variant="primary") - yield Button("上一首", id="prev", variant="default") - yield Button("下一首", id="next", variant="default") - yield Button("停止", id="stop", variant="error") - yield ScrollableContainer(id="playlist") - yield Footer() - - def on_mount(self) -> None: - """挂载后更新播放列表显示""" - self._update_playlist() - - def _filter_due_atoms(self) -> List[pt.Atom]: - """筛选当日需要复习的原子(已激活且到期)""" - atoms = [] - for ident in self.repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data( - nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(ident) - ) - e = pt.Electron.create_on_electonic_data( - electronic_data=self.repo.electronic_data_lict.get_itemic_unit(ident) - ) - a = pt.Atom(n, e, self.repo.orbitic_data) - # 仅选择已激活且到期的原子 - if ( - a.registry["electron"].is_activated() - and a.registry["electron"].is_due() - ): - atoms.append(a) - return atoms - - def _update_playlist(self) -> None: - """更新播放列表显示""" - container = self.query_one("#playlist") - container.remove_children() - for idx, atom in enumerate(self.atoms): - content = atom.registry["nucleon"].get("content", "无内容") - prefix = "▶ " if idx == self.current_index else " " - widget = Static(f"{prefix}{idx+1}. {content[:50]}...") - widget.set_class(idx == self.current_index, "current") - container.mount(widget) - - def _get_audio_path(self, atom: pt.Atom) -> Path: - """返回音频文件路径,若不存在则生成""" - tts_text = atom.registry["nucleon"].get("tts_text", "") - if not tts_text: - tts_text = atom.registry["nucleon"].get("content", "") - voice_dir = Path(config_var.get()["paths"]["data"]) / "cache" / "voice" - voice_dir.mkdir(parents=True, exist_ok=True) - path = voice_dir / f"{get_md5(tts_text)}.wav" - if not path.exists(): - convertor(tts_text, path) - return path - - async def _play_atom(self, idx: int) -> None: - """播放指定索引的原子(异步)""" - if idx < 0 or idx >= len(self.atoms): - return - atom = self.atoms[idx] - try: - path = self._get_audio_path(atom) - self._current_path = path - # 在后台线程中播放,避免阻塞UI - await self.run_worker( - lambda: play_by_path(path), exclusive=True, thread=True - ) - except Exception as e: - logger.error("播放失败: %s", e) - - def _stop_playback(self) -> None: - """停止当前播放""" - if self._play_task and not self._play_task.done(): - self._play_task.cancel() - self._play_task = None - self._current_path = None - self.play_state = "stopped" - - async def _play_current(self) -> None: - """播放当前索引的原子""" - self._stop_playback() - self.play_state = "playing" - self._play_task = asyncio.create_task(self._play_atom(self.current_index)) - try: - await self._play_task - except asyncio.CancelledError: - pass - finally: - if self.play_state == "playing": - self.play_state = "stopped" - - # 按钮事件处理 - def on_button_pressed(self, event: Button.Pressed) -> None: - button_id = event.button.id - if button_id == "play": - self.action_toggle_play() - elif button_id == "pause": - self.action_pause() - elif button_id == "prev": - self.action_prev() - elif button_id == "next": - self.action_next() - elif button_id == "stop": - self.action_stop() - - # 键盘动作 - def action_toggle_play(self) -> None: - if self.play_state == "playing": - self.action_pause() - else: - self.action_play() - - def action_play(self) -> None: - if self.play_state != "playing": - if self.play_state == "paused": - # 恢复播放(目前暂停功能简单实现为停止) - self.play_state = "playing" - else: - asyncio.create_task(self._play_current()) - - def action_pause(self) -> None: - if self.play_state == "playing": - self._stop_playback() - self.play_state = "paused" - - def action_stop(self) -> None: - self._stop_playback() - self.play_state = "stopped" - - def action_next(self) -> None: - if self.current_index < len(self.atoms) - 1: - self.current_index += 1 - self._update_playlist() - if self.play_state == "playing": - asyncio.create_task(self._play_current()) - - def action_prev(self) -> None: - if self.current_index > 0: - self.current_index -= 1 - self._update_playlist() - if self.play_state == "playing": - asyncio.create_task(self._play_current()) - - def action_go_back(self) -> None: - self._stop_playback() - self.app.pop_screen() - - # 响应式更新 - def watch_current_index(self, old: int, new: int) -> None: - self._update_playlist() - - def watch_play_state(self, old: str, new: str) -> None: - # 更新按钮状态(可在此添加样式变化) - pass diff --git a/src/heurams/interface/screens/repocreator.py b/src/heurams/interface/screens/repocreator.py deleted file mode 100644 index d60a9ec..0000000 --- a/src/heurams/interface/screens/repocreator.py +++ /dev/null @@ -1,166 +0,0 @@ -"""仓库创建向导界面""" - -from pathlib import Path - -import toml -from textual.app import ComposeResult -from textual.containers import ScrollableContainer -from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Input, Label, Markdown, Select - -from heurams.context import config_var -from heurams.services.version import ver - - -class RepoCreatorScreen(Screen): - BINDINGS = [("q", "go_back", "返回")] - SUB_TITLE = "仓库创建向导" - - def __init__(self) -> None: - super().__init__(name=None, id=None, classes=None) - - def search_templates(self): - from pathlib import Path - - from heurams.context import config_var - - template_dir = Path(config_var.get()["paths"]["data"]) / "templates" - templates = list() - for i in template_dir.iterdir(): - if i.name.endswith(".toml"): - try: - import toml - - with open(i, "r") as f: - dic = toml.load(f) - desc = dic["__metadata__.attribution"]["desc"] - templates.append(desc + " (" + i.name + ")") - except Exception as e: - templates.append(f"无描述模板 ({i.name})") - print(e) - return templates - - def compose(self) -> ComposeResult: - yield Header(show_clock=True) - with ScrollableContainer(id="vice_container"): - yield Label(f"[b]空白单元集创建向导\n") - yield Markdown( - "> 提示: 你可能注意到当选中文本框时底栏和操作按键绑定将被覆盖 \n只需选中(使用鼠标或 Tab)选择框即可恢复底栏功能" - ) - yield Markdown("1. 键入单元集名称") - yield Input(placeholder="单元集名称", id="name_input") - yield Markdown( - "> 单元集名称不应与现有单元集重复. \n> 新的单元集文件将创建在 ./nucleon/你输入的名称.toml" - ) - yield Label(f"\n") - yield Markdown("2. 选择单元集模板") - LINES = self.search_templates() - """带有宏支持的空白单元集 ({ver}) -古诗词模板单元集 ({ver}) -英语词汇和短语模板单元集 ({ver}) -""" - yield Select.from_values(LINES, prompt="选择类型", id="template_select") - yield Markdown("> 新单元集的版本号将和主程序版本保持同步") - yield Label(f"\n") - yield Markdown("3. 输入常见附加元数据 (可选)") - yield Input(placeholder="作者", id="author_input") - yield Input(placeholder="内容描述", id="desc_input") - yield Button( - "新建空白单元集", - id="submit_button", - variant="primary", - classes="start-button", - ) - yield Footer() - - def on_mount(self): - self.query_one("#submit_button").focus() - - def action_go_back(self): - self.app.pop_screen() - - def action_quit_app(self): - self.app.exit() - - def on_button_pressed(self, event) -> None: - event.stop() - if event.button.id == "submit_button": - # 获取输入值 - name_input = self.query_one("#name_input") - template_select = self.query_one("#template_select") - author_input = self.query_one("#author_input") - desc_input = self.query_one("#desc_input") - - name = name_input.value.strip() # type: ignore - author = author_input.value.strip() # type: ignore - desc = desc_input.value.strip() # type: ignore - selected = template_select.value # type: ignore - - # 验证 - if not name: - self.notify("单元集名称不能为空", severity="error") - return - - # 获取配置路径 - config = config_var.get() - nucleon_dir = Path(config["paths"]["nucleon_dir"]) - template_dir = Path(config["paths"]["template_dir"]) - - # 检查文件是否已存在 - nucleon_path = nucleon_dir / f"{name}.toml" - if nucleon_path.exists(): - self.notify(f"单元集 '{name}' 已存在", severity="error") - return - - # 确定模板文件 - if selected is None: - self.notify("请选择一个模板", severity="error") - return - # selected 是描述字符串, 格式如 "描述 (filename.toml)" - # 提取文件名 - import re - - match = re.search(r"\(([^)]+)\)$", selected) - if not match: - self.notify("模板选择格式无效", severity="error") - return - template_filename = match.group(1) - template_path = template_dir / template_filename - if not template_path.exists(): - self.notify(f"模板文件不存在: {template_filename}", severity="error") - return - - # 加载模板 - try: - with open(template_path, "r", encoding="utf-8") as f: - template_data = toml.load(f) - except Exception as e: - self.notify(f"加载模板失败: {e}", severity="error") - return - - # 更新元数据 - metadata = template_data.get("__metadata__", {}) - attribution = metadata.get("attribution", {}) - if author: - attribution["author"] = author - if desc: - attribution["desc"] = desc - attribution["name"] = name - # 可选: 设置版本 - attribution["version"] = ver - metadata["attribution"] = attribution - template_data["__metadata__"] = metadata - - # 确保 nucleon_dir 存在 - nucleon_dir.mkdir(parents=True, exist_ok=True) - - # 写入新文件 - try: - with open(nucleon_path, "w", encoding="utf-8") as f: - toml.dump(template_data, f) - except Exception as e: - self.notify(f"保存单元集失败: {e}", severity="error") - return - - self.notify(f"单元集 '{name}' 创建成功") - self.app.pop_screen() diff --git a/src/heurams/interface/screens/repoeditor.py b/src/heurams/interface/screens/repoeditor.py deleted file mode 100644 index ec3f92c..0000000 --- a/src/heurams/interface/screens/repoeditor.py +++ /dev/null @@ -1,267 +0,0 @@ -"""仓库编辑器, 使用TextArea控件等实现仓库配置编辑""" - -import json -from pathlib import Path -from typing import Optional - -import toml -from textual.app import ComposeResult -from textual.containers import Container, Horizontal, ScrollableContainer, Vertical -from textual.reactive import reactive -from textual.screen import Screen -from textual.widgets import ( - Button, - Footer, - Header, - Label, - ListItem, - ListView, - Static, - TextArea, -) - -from heurams.context import config_var -from heurams.kernel.repolib import Repo -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -class RepoEditorScreen(Screen): - """仓库编辑器屏幕""" - - SUB_TITLE = "仓库编辑器" - - BINDINGS = [ - ("q", "go_back", "返回"), - ("s", "save_file", "保存"), - ("r", "reload_file", "重载"), - ("d", "toggle_dark", ""), - ] - - # 当前选择的仓库路径 - selected_repo_path: reactive[Optional[Path]] = reactive(None) - # 当前选择的文件名 - selected_filename: reactive[Optional[str]] = reactive(None) - # 文件内容 - file_content: reactive[str] = reactive("") - - def __init__( - self, - repo: Optional[Repo] = None, - name: str | None = None, - id: str | None = None, - classes: str | None = None, - ) -> None: - super().__init__(name, id, classes) - self.repo = repo - self.repo_dir: Optional[Path] = None - self.file_list = [] - if repo is not None and repo.source is not None: - self.repo_dir = repo.source - self._load_file_list() - # selected_repo_path 将在 on_mount 中设置,避免触发watch时组件未就绪 - - def _load_file_list(self) -> None: - """加载仓库目录下的文件列表""" - if self.repo_dir is None: - return - self.file_list = [] - for fname in Repo.file_mapping.values(): - fpath = self.repo_dir / fname - if fpath.exists(): - self.file_list.append(fname) - # 也可能存在其他文件,但暂时只支持标准文件 - self.file_list.sort() - - def compose(self) -> ComposeResult: - """组合界面组件""" - yield Header(show_clock=True) - with Container(id="main_container"): - with Horizontal(id="top_panel"): - # 左侧: 仓库选择 - with Vertical(id="repo_selector", classes="panel"): - yield Label("仓库列表", classes="panel-title") - yield ListView( - *[ - ListItem(Label(repo_dir.name)) - for repo_dir in self._get_repo_dirs() - ], - id="repo_list", - classes="list-view", - ) - # 中间: 文件列表 - with Vertical(id="file_selector", classes="panel"): - yield Label("文件列表", classes="panel-title") - yield ListView( - *[ListItem(Label(fname)) for fname in self.file_list], - id="file_list", - classes="list-view", - ) - # 右侧: 编辑区域 - with Vertical(id="editor_panel", classes="panel"): - yield Label("编辑文件", classes="panel-title") - yield TextArea( - id="text_editor", - language="plaintext", - classes="text-editor", - ) - with Horizontal(id="button_bar"): - yield Button("保存", id="save_button", variant="primary") - yield Button("重载", id="reload_button", variant="default") - yield Button("返回", id="back_button", variant="error") - yield Footer() - - def _get_repo_dirs(self) -> list[Path]: - """获取data/repo/下所有有效仓库目录""" - repo_root = Path(config_var.get()["paths"]["data"]) / "repo" - repo_dirs = [] - if repo_root.exists(): - for entry in repo_root.iterdir(): - if entry.is_dir(): - # 检查是否存在 manifest.toml - if (entry / "manifest.toml").exists(): - repo_dirs.append(entry) - return repo_dirs - - def on_mount(self) -> None: - """挂载组件时初始化""" - # 如果已有仓库,设置 selected_repo_path 以触发watch(此时组件已就绪) - if self.repo_dir is not None: - self.selected_repo_path = self.repo_dir - # 焦点放在仓库列表 - self.query_one("#repo_list", ListView).focus() - - def watch_selected_repo_path( - self, old_path: Optional[Path], new_path: Optional[Path] - ) -> None: - """当选择的仓库路径变化时,加载文件列表""" - if new_path is None: - self.file_list = [] - self.selected_filename = None - self.file_content = "" - return - self.repo_dir = new_path - self._load_file_list() - # 如果组件已挂载,更新UI - if self.is_mounted: - file_list_view = self.query_one("#file_list", ListView) - file_list_view.clear() - for fname in self.file_list: - file_list_view.append(ListItem(Label(fname))) - # 清空编辑器 - self.query_one("#text_editor", TextArea).text = "" - self.selected_filename = None - - def watch_selected_filename( - self, old_name: Optional[str], new_name: Optional[str] - ) -> None: - """当选择的文件名变化时,加载文件内容""" - if new_name is None or self.repo_dir is None: - self.file_content = "" - return - file_path = self.repo_dir / new_name - if not file_path.exists(): - self.notify(f"文件不存在: {new_name}", severity="error") - return - try: - content = file_path.read_text(encoding="utf-8") - self.file_content = content - # 如果组件已挂载,更新编辑器 - if self.is_mounted: - editor = self.query_one("#text_editor", TextArea) - editor.text = content - # 根据文件后缀设置语言 - if new_name.endswith(".toml"): - editor.language = "toml" - elif new_name.endswith(".json"): - editor.language = "json" - else: - editor.language = "plaintext" - except Exception as e: - logger.error(f"读取文件失败: {e}") - self.notify(f"读取文件失败: {e}", severity="error") - - def watch_file_content(self, old_content: str, new_content: str) -> None: - """当文件内容变化时更新编辑器(仅当外部改变时)""" - # 目前不需要做任何事情,因为编辑器内容已绑定 - pass - - def on_list_view_selected(self, event) -> None: - """处理列表项选择事件""" - if not isinstance(event.item, ListItem): - return - list_id = event.list_view.id - selected_label = event.item.query_one(Label) - selected_text = str(selected_label.render()) - - if list_id == "repo_list": - # 用户选择了仓库 - repo_root = Path(config_var.get()["paths"]["data"]) / "repo" - selected_dir = repo_root / selected_text - if selected_dir.exists(): - self.selected_repo_path = selected_dir - elif list_id == "file_list": - # 用户选择了文件 - if self.repo_dir is None: - self.notify("请先选择仓库", severity="warning") - return - self.selected_filename = selected_text - - def on_button_pressed(self, event) -> None: - """处理按钮点击事件""" - event.stop() - if event.button.id == "save_button": - self.action_save_file() - elif event.button.id == "reload_button": - self.action_reload_file() - elif event.button.id == "back_button": - self.action_go_back() - - def action_save_file(self) -> None: - """保存当前编辑的文件""" - if self.repo_dir is None or self.selected_filename is None: - self.notify("未选择仓库或文件", severity="warning") - return - file_path = self.repo_dir / self.selected_filename - editor = self.query_one("#text_editor", TextArea) - new_content = editor.text - # 验证格式 - try: - if self.selected_filename.endswith(".toml"): - toml.loads(new_content) # 验证TOML - elif self.selected_filename.endswith(".json"): - json.loads(new_content) # 验证JSON - except Exception as e: - self.notify(f"格式错误: {e}", severity="error") - return - # 写入文件 - try: - file_path.write_text(new_content, encoding="utf-8") - self.notify("保存成功", severity="information") - except Exception as e: - logger.error(f"保存文件失败: {e}") - self.notify(f"保存文件失败: {e}", severity="error") - - def action_reload_file(self) -> None: - """重新加载当前文件(放弃修改)""" - if self.repo_dir is None or self.selected_filename is None: - self.notify("未选择仓库或文件", severity="warning") - return - file_path = self.repo_dir / self.selected_filename - try: - content = file_path.read_text(encoding="utf-8") - editor = self.query_one("#text_editor", TextArea) - editor.text = content - self.notify("已重载", severity="information") - except Exception as e: - logger.error(f"重载文件失败: {e}") - self.notify(f"重载文件失败: {e}", severity="error") - - def action_go_back(self) -> None: - """返回上一屏幕""" - self.app.pop_screen() - - def action_toggle_dark(self) -> None: - """切换暗色模式""" - self.app.dark = not self.app.dark diff --git a/src/heurams/kernel/README.md b/src/heurams/kernel/README.md index 37eab76..6eb5b8d 100644 --- a/src/heurams/kernel/README.md +++ b/src/heurams/kernel/README.md @@ -1,2 +1,3 @@ # Kernel - HeurAMS 核心 -记忆规划相关算法与数据结构, 可脱离业务层 \ No newline at end of file + +记忆规划相关算法与数据结构, 可脱离业务层 diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index 463add0..cc2baef 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -32,7 +32,7 @@ class Atom: default_runtime = { "locked": False, - "min_rate": 0x3F3F3F3F, + "min_rate": float('inf'), "new_activation": False, } diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index 8aaaaa3..c35073d 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -1,16 +1,24 @@ # Reactor - 记忆流程状态机模块 + Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配. 得益于 Pickle, 状态机模块支持快照! + ## Phaser - 全局阶段控制器 + 在一次队列记忆流程中, Phaser 代表记忆流程本身. + ### 属性 + #### 状态属性 + 其有状态属性: + - unsure - 用于初始化 - *quick_review - 复习逾期的单元 - *recognition - 辨识新单元 - *final_review - 复习所有逾期的和新辨认的单元 -- finished - 表示完成 +- finished - 表示完成 + > 逾期的: 指 SM-2 算法间隔显示应该复习的单元 带 * 的属性表示实际的记忆阶段, 由 repo 中 schedule.toml 中 schedule 列表显式声明, 运行过程中可以选择性执行, "空的" Procession 会被直接跳过. @@ -18,106 +26,148 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实 在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程. 你可以用 state 属性获取 Phaser 的当前状态. + #### Procession 属性 + 储存一个顺序列表, 保存所有构造的 Procession. 顺序与 repo 中 schedule.toml 中 schedule 列表中的顺序完全相同 ### 初始化 + Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料 在内部, 根据是否激活将其分为 new_atoms 与 old_atoms. 因此, 如果你传入的列表中有算法上"无所事事"的 Atom, 流程会对其进行"加强复习" 由此创建 Procession. ### 直接输出呈现形式 + Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. 其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown. 示例: + ```text | Type | State | Processions | Current Procession | |:-------|:--------|:-----------------------|:---------------------| | Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | ``` + | Type | State | Processions | Current Procession | |:-------|:--------|:-----------------------|:---------------------| | Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | ### 方法 + 作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. 除此之外, 它也拥有一些其他方法. + #### current_procession(self) + 用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态. 返回一个 Procession 对象, 是当前阶段的 Procession. 内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性 若所有 Procession 都已完成, 将返回一个"阶段状态"为 finished 的 Procession 占位符对象(它不在 procession 属性中), 并更新自身状态为 finished. ## Procession - 阶段管理器 + ### 属性 + #### 状态属性 + 其有状态属性: + - active - 标识未完成, 初始化的默认属性 - finished - 完成了 + #### 其他属性 + - current_atom: 当前记忆原子的引用 - atoms: 队列中所有原子列表 - cursor: 指针, 是当前原子在 atoms 列表中的索引 - phase: "阶段属性" + > 注意区分 "Phaser" 和 "Phase", 其中 "Phase" 表示 "Phaser State". + - name_: 阶段的命名 - state: 当前状态属性 + ### 初始化 + 接受一个 atoms 列表与 phase_state (PhaserState Enum 类型)对象 + ### 直接输出呈现形式 + 同 Phaser, 但显示数据有所不同 与 Phaser 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) + ```text | Type | Name | State | Progress | Queue | Current Atom | |:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ``` + | Type | Name | State | Progress | Queue | Current Atom | |:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | + ### 方法 + 作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. 除此之外, 它也拥有一些其他方法. + #### forward(self, step=1) + 移动 cursor 并依情况更新 current_atom 和状态属性 无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启". #### append(self, atom=None) + 追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端 如果这个原子已经处于队列末端, 不会重复追加, 除非队列只剩下这个原子还没完成(此时最多重复两个) #### process(self) + 返回 cursor 值 #### __len__(self) + 返回剩余原子量(而不是原子总量) 可以使用 len 函数调用 获取原子总量请用 len(obj.atoms), 或者 total_length(self) 方法 #### total_length(self) + 返回队列原子总量 #### is_empty(self) + 判断是否为空队列(传入原子列表对象是空列表的队列) #### get_fission(self) + 获取当前原子的 Fission 对象, 用于单原子调度展开 ## Fission - 单原子调度控制器 + ### 属性 + #### 状态属性 + - exammode: 测试模式(默认) - retronly: 仅回顾模式 + #### 其他属性 + - cursor - atom - current_puzzle - orbital_schedule - orbital_puzzles - puzzles + ### 初始化 + 接受 atom 对象和 phase 参数 + ### 方法 -#### get_puzzles(self) \ No newline at end of file + +#### get_puzzles(self) diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index cba67cd..98ef82d 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -74,7 +74,7 @@ class Fission(Machine): self.current_puzzle_inf = self.puzzles_inf[0] for i in range(len(self.puzzles_inf)): - self.min_ratings.append(0x3F3F3F3F) + self.min_ratings.append(float('inf')) Machine.__init__( self, diff --git a/src/heurams/kernel/repolib/navi.py b/src/heurams/kernel/repolib/navi.py deleted file mode 100644 index bbd2449..0000000 --- a/src/heurams/kernel/repolib/navi.py +++ /dev/null @@ -1,3 +0,0 @@ -class Navi: - def __init__(self, init) -> None: - pass diff --git a/src/heurams/services/audio_service.py b/src/heurams/services/audio_service.py index fe801ac..7693156 100644 --- a/src/heurams/services/audio_service.py +++ b/src/heurams/services/audio_service.py @@ -1,4 +1,4 @@ -# 音频服务 +"""音频服务""" from typing import Callable from heurams.context import config_var diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index c71cc6b..e0c6b12 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -1,4 +1,4 @@ -# 配置文件服务 +"""配置文件服务""" import pathlib import typing diff --git a/src/heurams/services/llm_service.py b/src/heurams/services/llm_service.py deleted file mode 100644 index 2fd730e..0000000 --- a/src/heurams/services/llm_service.py +++ /dev/null @@ -1,228 +0,0 @@ -"""LLM 聊天服务""" - -import asyncio -import json -from pathlib import Path -from typing import Any, Dict, List, Optional - -from heurams.context import config_var -from heurams.providers.llm import providers as prov -from heurams.services.logger import get_logger - -logger = get_logger(__name__) - - -class ChatSession: - """聊天会话,管理单个对话的历史和参数""" - - def __init__( - self, session_id: str, llm_provider, system_prompt: str = "", **default_params - ): - """初始化聊天会话 - - Args: - session_id: 会话唯一标识符 - llm_provider: LLM 提供者实例 - system_prompt: 系统提示词 - **default_params: 默认参数(temperature, max_tokens, model 等) - """ - self.session_id = session_id - self.llm_provider = llm_provider - self.system_prompt = system_prompt - self.default_params = default_params - - # 消息历史 - self.messages: List[Dict[str, str]] = [] - if system_prompt: - self.messages.append({"role": "system", "content": system_prompt}) - - logger.debug("创建聊天会话: id=%s", session_id) - - def add_message(self, role: str, content: str): - """添加消息到历史""" - self.messages.append({"role": role, "content": content}) - logger.debug( - "会话 %s 添加消息: role=%s, length=%d", self.session_id, role, len(content) - ) - - def clear_history(self): - """清空消息历史(保留系统提示)""" - self.messages = [] - if self.system_prompt: - self.messages.append({"role": "system", "content": self.system_prompt}) - logger.debug("会话 %s 清空历史", self.session_id) - - def set_system_prompt(self, prompt: str): - """设置系统提示词""" - self.system_prompt = prompt - # 更新消息历史中的系统消息 - if self.messages and self.messages[0]["role"] == "system": - self.messages[0]["content"] = prompt - elif prompt: - self.messages.insert(0, {"role": "system", "content": prompt}) - logger.debug("会话 %s 设置系统提示: length=%d", self.session_id, len(prompt)) - - async def send_message(self, message: str, **override_params) -> str: - """发送消息并获取响应 - - Args: - message: 用户消息内容 - **override_params: 覆盖默认参数 - - Returns: - 模型响应内容 - """ - # 添加用户消息 - self.add_message("user", message) - - # 合并参数 - params = {**self.default_params, **override_params} - - # 发送请求 - logger.debug("会话 %s 发送消息: length=%d", self.session_id, len(message)) - response = await self.llm_provider.chat(self.messages, **params) - - # 添加助手响应 - self.add_message("assistant", response) - - return response - - async def send_message_stream(self, message: str, **override_params): - """流式发送消息 - - Args: - message: 用户消息内容 - **override_params: 覆盖默认参数 - - Yields: - 流式响应的文本块 - """ - # 添加用户消息 - self.add_message("user", message) - - # 合并参数 - params = {**self.default_params, **override_params} - - # 发送流式请求 - logger.debug("会话 %s 发送流式消息: length=%d", self.session_id, len(message)) - - full_response = "" - async for chunk in self.llm_provider.chat_stream(self.messages, **params): - yield chunk - full_response += chunk - - # 添加完整的助手响应到历史 - self.add_message("assistant", full_response) - - def get_history(self) -> List[Dict[str, str]]: - """获取消息历史(不包括系统消息)""" - # 返回用户和助手的消息,可选排除系统消息 - return [msg for msg in self.messages if msg["role"] != "system"] - - def save_to_file(self, file_path: Path): - """保存会话到文件""" - data = { - "session_id": self.session_id, - "system_prompt": self.system_prompt, - "default_params": self.default_params, - "messages": self.messages, - } - with open(file_path, "w", encoding="utf-8") as f: - json.dump(data, f, ensure_ascii=False, indent=2) - logger.debug("会话 %s 保存到: %s", self.session_id, file_path) - - @classmethod - def load_from_file(cls, file_path: Path, llm_provider): - """从文件加载会话""" - with open(file_path, "r", encoding="utf-8") as f: - data = json.load(f) - - session = cls( - session_id=data["session_id"], - llm_provider=llm_provider, - system_prompt=data.get("system_prompt", ""), - **data.get("default_params", {}) - ) - session.messages = data["messages"] - logger.debug("从文件加载会话: %s", file_path) - return session - - -class ChatManager: - """聊天管理器,管理多个会话""" - - def __init__(self): - self.sessions: Dict[str, ChatSession] = {} - self.default_session_id = "default" - logger.debug("聊天管理器初始化完成") - - def get_session( - self, - session_id: Optional[str] = None, - create_if_missing: bool = True, - **session_params - ) -> Optional[ChatSession]: - """获取或创建聊天会话 - - Args: - session_id: 会话标识符,None 则使用默认会话 - create_if_missing: 如果会话不存在则创建 - **session_params: 传递给 ChatSession 的参数 - - Returns: - 聊天会话实例,如果不存在且不创建则返回 None - """ - if session_id is None: - session_id = self.default_session_id - - if session_id in self.sessions: - return self.sessions[session_id] - - if create_if_missing: - # 获取 LLM 提供者 - provider_name = config_var.get()["services"]["llm"] - provider_config = config_var.get()["providers"]["llm"][provider_name] - llm_provider = prov[provider_name](provider_config) - - session = ChatSession( - session_id=session_id, llm_provider=llm_provider, **session_params - ) - self.sessions[session_id] = session - logger.debug("创建新会话: id=%s", session_id) - return session - - return None - - def delete_session(self, session_id: str): - """删除会话""" - if session_id in self.sessions: - del self.sessions[session_id] - logger.debug("删除会话: id=%s", session_id) - - def list_sessions(self) -> List[str]: - """列出所有会话ID""" - return list(self.sessions.keys()) - - -# 全局聊天管理器实例 -_chat_manager: Optional[ChatManager] = None - - -def get_chat_manager() -> ChatManager: - """获取全局聊天管理器实例""" - global _chat_manager - if _chat_manager is None: - _chat_manager = ChatManager() - logger.debug("创建全局聊天管理器") - return _chat_manager - - -def create_chat_session( - session_id: Optional[str] = None, **session_params -) -> ChatSession: - """创建或获取聊天会话(便捷函数)""" - manager = get_chat_manager() - return manager.get_session(session_id, True, **session_params) - - -logger.debug("LLM 服务初始化完成") diff --git a/src/heurams/services/sync_service.py b/src/heurams/services/sync_service.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/services/tts_service.py b/src/heurams/services/tts_service.py index 81b4c70..0c582f5 100644 --- a/src/heurams/services/tts_service.py +++ b/src/heurams/services/tts_service.py @@ -9,5 +9,5 @@ logger = get_logger(__name__) convertor: Callable = prov[config_var.get()["services"]["tts"]].convert logger.debug( - "TTS服务初始化完成, 使用 provider: %s", config_var.get()["services"]["tts"] + "TTS 服务初始化完成, 使用 provider: %s", config_var.get()["services"]["tts"] ) diff --git a/src/heurams/services/version.py b/src/heurams/services/version.py index a8135ba..0a30daf 100644 --- a/src/heurams/services/version.py +++ b/src/heurams/services/version.py @@ -5,7 +5,7 @@ logger = get_logger(__name__) ver = "0.5.0" stage = "prototype" -codename = "fulcrom" +codename = "fulcrum" codename_cn = "支点" logger.info("HeurAMS 版本: %s (%s), 阶段: %s", ver, codename, stage) From 053c4660d0bd8d8455ea1b3b3936accc5b7c4f7e Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 19 Apr 2026 00:05:49 +0800 Subject: [PATCH 30/79] =?UTF-8?q?feat:=20FAST-0=20=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .python-version | 1 - CONTRIBUTING.md | 14 +- README.md | 39 +- data/config/config.toml | 7 +- data/config/data/config/config.toml | 0 data/data/config/config.toml | 0 data/repo/cngk-t/algodata.json | 11402 ++++++++++++++++++++ data/repo/cngk-t/manifest.toml | 3 + data/repo/cngk-t/payload.toml | 5705 ++++++++++ data/repo/cngk-t/schedule.toml | 11 + data/repo/{test => cngk-t}/typedef.toml | 0 data/repo/test/algodata.json | 1 - data/repo/test/manifest.toml | 3 - data/repo/test/payload.toml | 11 - data/repo/test/schedule.toml | 11 - glossary.md | 7 +- pyproject.toml | 25 +- src/heurams/interface/README.md | 1 + src/heurams/kernel/README.md | 2 +- src/heurams/kernel/algorithms/__init__.py | 3 + src/heurams/kernel/algorithms/fast0.py | 91 + src/heurams/kernel/reactor/README.md | 62 +- src/heurams/providers/README.md | 3 +- src/heurams/services/README.md | 3 +- uv.lock | 757 +- 25 files changed, 17580 insertions(+), 582 deletions(-) delete mode 100644 .python-version create mode 100644 data/config/data/config/config.toml create mode 100644 data/data/config/config.toml create mode 100644 data/repo/cngk-t/algodata.json create mode 100644 data/repo/cngk-t/manifest.toml create mode 100644 data/repo/cngk-t/payload.toml create mode 100644 data/repo/cngk-t/schedule.toml rename data/repo/{test => cngk-t}/typedef.toml (100%) delete mode 100644 data/repo/test/algodata.json delete mode 100644 data/repo/test/manifest.toml delete mode 100644 data/repo/test/payload.toml delete mode 100644 data/repo/test/schedule.toml create mode 100644 src/heurams/kernel/algorithms/fast0.py diff --git a/.python-version b/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2d50a01..7853516 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,22 +1,22 @@ # 贡献指南 -欢迎为此项目做出贡献! +欢迎为此项目做出贡献!\ 本项目是一个开源项目, 我们鼓励社区成员参与改进. ## 开发规范 -1. 分支划分: +1. 分支划分: - `main` 分支: 稳定版本 - `dev` 分支: 开发版本 - 功能分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/描述` -2. 代码风格: +1. 代码风格: - 请使用 Black 格式化代码 - 遵循 PEP 8 规范 - - 添加适当的文档字符串 -3. 提交消息: + - 添加适当的文档字符串 +1. 提交消息: - 使用简体中文或英文撰写清晰的提交消息 - 格式: 遵循 Conventional Commits 规范 -4. 合并方式: +1. 合并方式: - 不使用 Fast-forward 合并 - 可以设置 `git config merge.ff false` @@ -39,4 +39,4 @@ pip install -e . ## 许可证 -贡献者同意其贡献将在 AGPL-3.0 许可证下发布. +贡献者同意其贡献将在 AGPL-3.0 许可证下发布. diff --git a/README.md b/README.md index 9cbbfae..58d09bd 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,26 @@ # 潜进 (HeurAMS) - 启发式辅助记忆程序 ## 概述 -"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的开放源代码多用途辅助记忆软件, 提供动态规划的优化记忆方案 + +"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的开放源代码多用途辅助记忆软件, 提供动态规划的优化记忆方案 ## 关于此仓库 -本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现 -除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 + +本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现\ +除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 ## 特性 ### 间隔迭代算法 -> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的, 但不会导致遗忘的间隔**. + +> 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的, 但不会导致遗忘的间隔**. + - 采用经实证的 SM-2 间隔迭代算法, 此算法亦用作 Anki 闪卡记忆软件的默认闪卡调度器 - 动态规划每个记忆单元的记忆间隔时间表 - 动态跟踪记忆反馈数据, 优化长期记忆保留率与稳定性 ### 学习进程优化 + - 元数据配置: 支持配置详细附加数据 - 自然语音: 集成文本转语音 (TTS) 功能, 支持"电台"回顾功能 - 多种谜题类型: 选择题 (MCQ), 填空题 (Cloze), 识别题 (Recognition) @@ -23,6 +28,7 @@ - 云同步支持: 通过多种协议同步数据到远程服务器 ### 实用用户界面 + - 响应式 Textual 框架构建的跨平台 TUI 界面 - 支持触屏/鼠标/键盘多操作模式 - 简洁直观的复习流程设计 @@ -30,39 +36,45 @@ ## 安装 ### 从源码安装 -1. 克隆仓库: + +1. 克隆仓库: + ```bash git clone https://gitea.imwangzhiyu.xyz/ajax/HeurAMS cd HeurAMS ``` -2. 安装依赖: +1. 安装依赖: + ```bash pip install -r requirements.txt ``` -3. 以开发模式安装包: +1. 以开发模式安装包: + ```bash pip install -e . ``` ### 从包管理器安装 -暂时还没有:( + +暂时还没有:( ## 启动应用 + ```bash # 在任一目录(建议是空目录或者包根目录, 将被用作存放数据)下运行 python -m heurams.interface ``` -配置文件位于 `./data/config/config.toml`(相对于工作目录). +配置文件位于 `./data/config/config.toml`(相对于工作目录).\ 如果不存在, 会使用内置的默认配置. ## 项目结构 ### 架构图(待更新 0.5.0) -以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: +以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: ```mermaid graph TB @@ -123,23 +135,24 @@ graph TB ## 贡献 -欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. +欢迎贡献! 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. ## 许可证 ### 项目本身 -本项目基于 AGPL-3.0 许可证开源. 详见根目录下 [LICENSE](LICENSE) 文件. +本项目基于 AGPL-3.0 许可证开源. 详见根目录下 [LICENSE](LICENSE) 文件. ### 第三方代码 项目在 `src/heurams/vendor/` 目录下嵌入了以下第三方代码(可能有修改): #### py-fsrs + - 上游版本: 6.3.1 - 位置: `src/heurams/vendor/pyfsrs/` - 原项目: [py-fsrs](https://github.com/open-spaced-repetition/py-fsrs) - 原许可证: Copyright (c) 2026 Open Spaced Repetition Contributors - 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` -本项目受益于他们无私且优秀的工作 \ No newline at end of file +本项目受益于他们无私且优秀的工作 diff --git a/data/config/config.toml b/data/config/config.toml index d6fd9f2..2e54fee 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -12,7 +12,7 @@ quick_pass = true auto_pass = false # 对于每个项目的默认新记忆原子数量 -scheduled_num = 8 +scheduled_num = 20 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 timezone_offset = +28800 # 中国标准时间 (UTC+8) @@ -20,10 +20,11 @@ timezone_offset = +28800 # 中国标准时间 (UTC+8) [interface] [interface.memorizor] -autovoice = false # 自动语音播放, 仅限于 recognition 组件 +autovoice = true # 自动语音播放, 仅限于 recognition 组件 [algorithm] -default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS +# default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS, FAST-0 +default = 'FAST-0' [puzzles] # 谜题默认配置 diff --git a/data/config/data/config/config.toml b/data/config/data/config/config.toml new file mode 100644 index 0000000..e69de29 diff --git a/data/data/config/config.toml b/data/data/config/config.toml new file mode 100644 index 0000000..e69de29 diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json new file mode 100644 index 0000000..27df993 --- /dev/null +++ b/data/repo/cngk-t/algodata.json @@ -0,0 +1,11402 @@ +{ + "临安春雨初霁": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4164822 + } + }, + "世味年来薄似纱, 谁令骑马客京华.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4167655 + } + }, + "小楼一夜听春雨, 深巷明朝卖杏花.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.417041 + } + }, + "矮纸斜行闲作草, 晴窗细乳戏分茶.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4173286 + } + }, + "素衣莫起风尘叹, 犹及清明可到家.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4176028 + } + }, + "书愤": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4178832 + } + }, + "早岁那知世事艰, 中原北望气如山": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.418158 + } + }, + "楼船夜雪瓜洲渡, 铁马秋风大散关": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.41845 + } + }, + "塞上长城空自许, 镜中衰鬓已先斑": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.418725 + } + }, + "出师一表真名世, 千载谁堪伯仲间": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4190054 + } + }, + "五代史伶官传序": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4192874 + } + }, + "呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4195747 + } + }, + "原庄宗之所以得天下, 与其所以失之者, 可以知之矣": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4198568 + } + }, + "世言晋王之将终也, 以三矢赐庄宗而告之曰:": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4201329 + } + }, + "梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4204254 + } + }, + "此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4207032 + } + }, + "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.420987 + } + }, + "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4212651 + } + }, + "及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4215648 + } + }, + "至于誓天断发, 泣下沾襟, 何其衰也!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20561, + "next_date": 20562, + "is_activated": 1, + "last_modify": 1776527873.4218438 + } + }, + "岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "《书》曰: 满招损, 谦得益.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忧劳可以兴国, 逸豫可以亡身, 自然之理也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故方其盛也, 举天下之豪杰, 莫能与之争;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "及其衰也, 数十伶人困之, 而身死国灭, 为天下笑": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "六国论": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "六国破灭, 非兵不利, 战不善, 弊在赂秦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "赂秦而力亏, 破灭之道也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "或曰: 六国互丧, 率赂秦耶?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曰: 不赂者以赂者丧.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盖失强援, 不能独完.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故曰: 弊在赂秦也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦以攻取之外, 小则获邑, 大则得城.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "较秦之所得, 与战胜而得者, 其实百倍;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "诸侯之所亡, 与战败而亡者, 其实亦百倍.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "则秦之所大欲, 诸侯之所大患, 固不在战矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子孙视之不甚惜, 举以予人, 如弃草芥.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今日割五城, 明日割十城, 然后得一夕安寝.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "起视四境, 而秦兵又至矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故不战而强弱胜负已判矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至于颠覆, 理固宜然.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此言得之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "齐人未尝赂秦, 终继五国迁灭, 何哉?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "与嬴而不助五国也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "五国既丧, 齐亦不免矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "燕赵之君, 始有远略, 能守其土, 义不赂秦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是故燕虽小国而后亡, 斯用兵之效也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至丹以荆卿为计, 始速祸焉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "赵尝五战于秦, 二败而三胜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "后秦击赵者再, 李牧连却之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "则胜负之数, 存亡之理, 当与秦相较, 或未易量.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "则吾恐秦人食之不得下咽也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "为国者无使为积威之所劫哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "劝学": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君子曰: 学不可以已.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "木直中绳, 𫐓以为轮, 其曲中规.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虽有槁暴, 不复挺者, 𫐓使之然也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君子生非异也, 善假于物也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故不积跬步, 无以至千里; 不积小流, 无以成江海.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "骐骥一跃, 不能十步; 驽马十驾, 功在不舍.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "声声慢·寻寻觅觅": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大道之行也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大道之行也, 天下为公.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "选贤与能, 讲信修睦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故人不独亲其亲, 不独子其子.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "使老有所终, 壮有所用, 幼有所长.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "矜寡孤独废疾者皆有所养.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "男有分, 女有归.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是故谋闭不兴, 盗窃乱贼而不作.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故外户而不闭, 是谓大同.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "客至": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舍南舍北皆春水, 但见群鸥日日来.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "花径不曾缘客扫, 蓬门今始为君开.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盘飧市远无兼味, 樽酒家贫只旧醅.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "肯与邻翁相对饮, 隔篱呼取尽余杯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "将进酒": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君不见, 黄河之水天上来, 奔流到海不复回.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君不见, 高堂明镜悲白发, 朝如青丝暮成雪!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人生得意须尽欢, 莫使金樽空对月.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "天生我材必有用, 千金散尽还复来.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "烹羊宰牛且为乐, 会须一饮三百杯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岑夫子, 丹丘生, 将进酒, 杯莫停.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "与君歌一曲, 请君为我倾耳听.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "钟鼓馔玉不足贵, 但愿长醉不复醒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古来圣贤皆寂寞, 惟有饮者留其名.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "陈王昔时宴平乐, 斗酒十千恣欢谑.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "主人何为言少钱, 径须沽取对君酌.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "屈原列传": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "离骚者, 犹离忧也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫天者, 人之始也; 父母者, 人之本也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "信而见疑, 忠而被谤, 能无怨乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "屈平之作《离骚》, 盖自怨生也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "《国风》好色而不淫, 《小雅》怨诽而不乱.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "若《离骚》者, 可谓兼之矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "明道德之广崇, 治乱之条贯, 靡不毕见.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其文约, 其辞微, 其志洁, 其行廉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其称文小而其指极大, 举类迩而见义远.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其志洁, 故其称物芳; 其行廉, 故死而不容.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "推此志也, 虽与日月争光可也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "山居秋暝": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "空山新雨后, 天气晚来秋.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "明月松间照, 清泉石上流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "竹喧归浣女, 莲动下渔舟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "随意春芳歇, 王孙自可留.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "师说": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古之学者必有师.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "师者, 所以传道受业解惑也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人非生而知之者, 孰能无惑?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "惑而不从师, 其为惑也, 终不解矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "生乎吾前, 其闻道也固先乎吾, 吾从而师之;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "生乎吾后, 其闻道也亦先乎吾, 吾从而师之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾师道也, 夫庸知其年之先后生于吾乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是故无贵无贱, 无长无少, 道之所存, 师之所存也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古之圣人, 其出人也远矣, 犹且从师而问焉;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今之众人, 其下圣人也亦远矣, 而耻学于师.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是故圣益圣, 愚益愚.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "巫医乐师百工之人, 不耻相师.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问之, 则曰: “彼与彼年相若也, 道相似也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "位卑则足羞, 官盛则近谀.”": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "呜呼! 师道之不复, 可知矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "郯子之徒, 其贤不及孔子.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "孔子曰: 三人行, 则必有我师.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余嘉其能行古道, 作《师说》以贻之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "归去来兮辞": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "归去来兮, 田园将芜胡不归?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "既自以心为形役, 奚惆怅而独悲?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "悟已往之不谏, 知来者之可追.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "实迷途其未远, 觉今是而昨非.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舟遥遥以轻飏, 风飘飘而吹衣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问征夫以前路, 恨晨光之熹微.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乃瞻衡宇, 载欣载奔.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "僮仆欢迎, 稚子候门.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "三径就荒, 松菊犹存.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "携幼入室, 有酒盈樽.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "引壶觞以自酌, 眄庭柯以怡颜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "倚南窗以寄傲, 审容膝之易安.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "园日涉以成趣, 门虽设而常关.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "策扶老以流憩, 时矫首而遐观.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "云无心以出岫, 鸟倦飞而知还.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "景翳翳以将入, 抚孤松而盘桓.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "归去来兮, 请息交以绝游.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "世与我而相违, 复驾言兮焉求?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "悦亲戚之情话, 乐琴书以消忧.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "农人告余以春及, 将有事于西畴.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "或命巾车, 或棹孤舟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "既窈窕以寻壑, 亦崎岖而经丘.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "木欣欣以向荣, 泉涓涓而始流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "善万物之得时, 感吾生之行休.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "已矣乎! 寓形宇内复几时?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曷不委心任去留?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "胡为乎遑遑欲何之?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "富贵非吾愿, 帝乡不可期.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "怀良辰以孤往, 或植杖而耘耔.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登东皋以舒啸, 临清流而赋诗.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "聊乘化以归尽, 乐夫天命复奚疑!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "归园田居·其一": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "少无适俗韵, 性本爱丘山": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "误落尘网中, 一去三十年": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "羁鸟恋旧林, 池鱼思故渊": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "开荒南野际, 守拙归园田": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "方宅十余亩, 草屋八九间": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "榆柳荫后檐, 桃李罗堂前": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "暧暧远人村, 依依墟里烟": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "狗吠深巷中, 鸡鸣桑树颠": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "户庭无尘杂, 虚室有余闲": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "久在樊笼里, 复得返自然": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "念奴娇·赤壁怀古": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大江东去, 浪淘尽, 千古风流人物.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故垒西边, 人道是, 三国周郎赤壁.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乱石穿空, 惊涛拍岸, 卷起千堆雪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江山如画, 一时多少豪杰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "遥想公瑾当年, 小乔初嫁了, 雄姿英发.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "羽扇纶巾, 谈笑间, 樯橹灰飞烟灭.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故国神游, 多情应笑我, 早生华发.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人生如梦, 一尊还酹江月.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "念奴娇·过洞庭": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "洞庭青草, 近中秋, 更无一点风色.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "玉鉴琼田三万顷, 着我扁舟一叶.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "素月分辉, 明河共影, 表里俱澄澈.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "悠然心会, 妙处难与君说.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "应念岭海经年, 孤光自照, 肝肺皆冰雪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "短发萧骚襟袖冷, 稳泛沧浪空阔.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "尽挹西江, 细斟北斗, 万象为宾客.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "扣舷独啸, 不知今夕何夕!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "扬州慢": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "淮左名都, 竹西佳处, 解鞍少驻初程.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "过春风十里, 尽荠麦青青.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自胡马窥江去后, 废池乔木, 犹厌言兵.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "渐黄昏, 清角吹寒, 都在空城.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "杜郎俊赏, 算而今, 重到须惊.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "纵豆蔻词工, 青楼梦好, 难赋深情.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "二十四桥仍在, 波心荡, 冷月无声.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "念桥边红药, 年年知为谁生?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "报任安书": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "《诗》三百篇, 大底圣贤发愤之所为作也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此人皆意有所郁结, 不得通其道, 故述往事, 思来者.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "亦欲以究天人之际, 通古今之变, 成一家之言.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然此可为智者道, 难为俗人言也!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "拟行路难·其四": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "泻水置平地, 各自东西南北流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人生亦有命, 安能行叹复坐愁?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "酌酒以自宽, 举杯断绝歌路难.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "心非木石岂无感, 吞声踯躅不敢言.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "无衣": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "春江花月夜": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "春江潮水连海平, 海上明月共潮生.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "滟滟随波千万里, 何处春江无月明!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江流宛转绕芳甸, 月照花林皆似霰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "空里流霜不觉飞, 汀上白沙看不见.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江天一色无纤尘, 皎皎空中孤月轮.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江畔何人初见月? 江月何年初照人?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人生代代无穷已, 江月年年望相似.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不知江月待何人, 但见长江送流水.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "白云一片去悠悠, 青枫浦上不胜愁.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谁家今夜扁舟子? 何处相思明月楼?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "可怜楼上月徘徊, 应照离人妆镜台.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "玉户帘中卷不去, 捣衣砧上拂还来.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此时相望不相闻, 愿逐月华流照君.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鸿雁长飞光不度, 鱼龙潜跃水成文.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "昨夜闲潭梦落花, 可怜春半不还家.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江水流春去欲尽, 江潭落月复西斜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "斜月沉沉藏海雾, 碣石潇湘无限路.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不知乘月几人归, 落月摇情满江树.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "望海潮·东南形胜": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "东南形胜, 三吴都会, 钱塘自古繁华.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "烟柳画桥, 风帘翠幕, 参差十万人家.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "云树绕堤沙, 怒涛卷霜雪, 天堑无涯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "市列珠玑, 户盈罗绮, 竞豪奢.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "重湖叠𪩘清嘉, 有三秋桂子, 十里荷花.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "异日图将好景, 归去凤池夸.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "朝天子·咏喇叭": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "喇叭, 唢呐, 曲儿小腔儿大": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "官船来往乱如麻, 全仗你抬声价": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "军听了军愁, 民听了民怕": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "哪里去辨甚么真共假?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "眼见的吹翻了这家, 吹伤了那家,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "只吹的水尽鹅飞罢!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "李凭箜篌引": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吴丝蜀桐张高秋, 空山凝云颓不流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江娥啼竹素女愁, 李凭中国弹箜篌.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "昆山玉碎凤凰叫, 芙蓉泣露香兰笑.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "十二门前融冷光, 二十三丝动紫皇.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "女娲炼石补天处, 石破天惊逗秋雨.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "梦入神山教神妪, 老鱼跳波瘦蛟舞.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吴质不眠倚桂树, 露脚斜飞湿寒兔.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "桂枝香·金陵怀古": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登临送目, 正故国晚秋, 天气初肃.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千里澄江似练, 翠峰如簇.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "归帆去棹残阳里, 背西风, 酒旗斜矗.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "彩舟云淡, 星河鹭起, 画图难足.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "念往昔, 繁华竞逐.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "叹门外楼头, 悲恨相续.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千古凭高对此, 谩嗟荣辱.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "六朝旧事随流水, 但寒烟衰草凝绿.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至今商女, 时时犹唱, 后庭遗曲.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "梦游天姥吟留别": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "天姥连天向天横, 势拔五岳掩赤城.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "天台四万八千丈, 对此欲倒东南倾.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "我欲因之梦吴越, 一夜飞度镜湖月.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "湖月照我影, 送我至剡溪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谢公宿处今尚在, 渌水荡漾清猿啼.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "脚著谢公屐, 身登青云梯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "半壁见海日, 空中闻天鸡.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千岩万转路不定, 迷花倚石忽已暝.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "熊咆龙吟殷岩泉, 栗深林兮惊层巅.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "云青青兮欲雨, 水澹澹兮生烟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "列缺霹雳, 丘峦崩摧.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "洞天石扉, 訇然中开.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青冥浩荡不见底, 日月照耀金银台.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "霓为衣兮风为马, 云之君兮纷纷而来下.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虎鼓瑟兮鸾回车, 仙之人兮列如麻.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忽魂悸以魄动, 恍惊起而长嗟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "惟觉时之枕席, 失向来之烟霞.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "世间行乐亦如此, 古来万事东流水.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "安能摧眉折腰事权贵, 使我不得开心颜?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "永遇乐·京口北固亭怀古": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千古江山, 英雄无觅, 孙仲谋处.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舞榭歌台, 风流总被, 雨打风吹去.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "斜阳草树, 寻常巷陌, 人道寄奴曾住.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "想当年, 金戈铁马, 气吞万里如虎.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "元嘉草草, 封狼居胥, 赢得仓皇北顾.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "四十三年, 望中犹记, 烽火扬州路.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "可堪回首, 佛狸祠下, 一片神鸦社鼓.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "凭谁问: 廉颇老矣, 尚能饭否?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江城子·乙卯正月二十日夜记梦": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "十年生死两茫茫, 不思量, 自难忘": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千里孤坟, 无处话凄凉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "纵使相逢应不识, 尘满面, 鬓如霜": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夜来幽梦忽还乡, 小轩窗, 正梳妆": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "相顾无言, 惟有泪千行": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "料得年年肠断处, 明月夜, 短松冈": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "涉江采芙蓉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "涉江采芙蓉, 兰泽多芳草.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "采之欲遗谁? 所思在远道.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "还顾望旧乡, 长路漫浩浩.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "同心而离居, 忧伤以终老.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "燕歌行": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "汉家烟尘在东北, 汉将辞家破残贼.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "男儿本自重横行, 天子非常赐颜色.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "摐金伐鼓下榆关, 旌旆逶迤碣石间.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "校尉羽书飞瀚海, 单于猎火照狼山.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "山川萧条极边土, 胡骑凭陵杂风雨.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "战士军前半死生, 美人帐下犹歌舞!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大漠穷秋塞草腓, 孤城落日斗兵稀.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "身当恩遇常轻敌, 力尽关山未解围.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "铁衣远戍辛勤久, 玉箸应啼别离后.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "少妇城南欲断肠, 征人蓟北空回首.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "边庭飘飖那可度, 绝域苍茫无所有.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "杀气三时作阵云, 寒声一夜传刁斗.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "相看白刃血纷纷, 死节从来岂顾勋!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君不见沙场征战苦, 至今犹忆李将军.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "琵琶行": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "浔阳江头夜送客, 枫叶荻花秋瑟瑟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "主人下马客在船, 举酒欲饮无管弦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "醉不成欢惨将别, 别时茫茫江浸月.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忽闻水上琵琶声, 主人忘归客不发.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "寻声暗问弹者谁, 琵琶声停欲语迟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "移船相近邀相见, 添酒回灯重开宴.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "千呼万唤始出来, 犹抱琵琶半遮面.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "转轴拨弦三两声, 未成曲调先有情.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "弦弦掩抑声声思, 似诉平生不得志.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "低眉信手续续弹, 说尽心中无限事.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "轻拢慢捻抹复挑, 初为《霓裳》后《六幺》.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大弦嘈嘈如急雨, 小弦切切如私语.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "嘈嘈切切错杂弹, 大珠小珠落玉盘.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "间关莺语花底滑, 幽咽泉流冰下难.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "冰泉冷涩弦凝绝, 凝绝不通声暂歇.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "别有幽愁暗恨生, 此时无声胜有声.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "银瓶乍破水浆迸, 铁骑突出刀枪鸣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曲终收拨当心画, 四弦一声如裂帛.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "东船西舫悄无言, 唯见江心秋月白.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "沉吟放拨插弦中, 整顿衣裳起敛容.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自言本是京城女, 家在虾蟆陵下住.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "十三学得琵琶成, 名属教坊第一部.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曲罢曾教善才服, 妆成每被秋娘妒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "五陵年少争缠头, 一曲红绡不知数.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "钿头银篦击节碎, 血色罗裙翻酒污.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今年欢笑复明年, 秋月春风等闲度.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "弟走从军阿姨死, 暮去朝来颜色故.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "门前冷落鞍马稀, 老大嫁作商人妇.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "商人重利轻别离, 前月浮梁买茶去.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "去来江口守空船, 绕船月明江水寒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夜深忽梦少年事, 梦啼妆泪红阑干.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "我闻琵琶已叹息, 又闻此语重唧唧.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "同是天涯沦落人, 相逢何必曾相识!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "我从去年辞帝京, 谪居卧病浔阳城.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "浔阳地僻无音乐, 终岁不闻丝竹声.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "住近湓江地低湿, 黄芦苦竹绕宅生.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其间旦暮闻何物? 杜鹃啼血猿哀鸣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "春江花朝秋月夜, 往往取酒还独倾.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂无山歌与村笛, 呕哑嘲哳难为听.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今夜闻君琵琶语, 如听仙乐耳暂明.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "莫辞更坐弹一曲, 为君翻作《琵琶行》.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "感我此言良久立, 却坐促弦弦转急.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "凄凄不似向前声, 满座重闻皆掩泣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "座中泣下谁最多? 江州司马青衫湿.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登岳阳楼": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "昔闻洞庭水, 今上岳阳楼.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吴楚东南坼, 乾坤日夜浮.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "亲朋无一字, 老病有孤舟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "戎马关山北, 凭轩涕泗流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登快阁": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "痴儿了却公家事, 快阁东西倚晚晴.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "落木千山天远大, 澄江一道月分明.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "朱弦已为佳人绝, 青眼聊因美酒横.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "万里归船弄长笛, 此心吾与白鸥盟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登泰山记": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "泰山之阳, 汶水西流; 其阴, 济水东流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "阳谷皆入汶, 阴谷皆入济.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "当其南北分者, 古长城也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "最高日观峰, 在长城南十五里.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是月丁未, 与知府朱孝纯子颍由南麓登.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "四十五里, 道皆砌石为磴, 其级七千有余.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "泰山正南面有三谷.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "中谷绕泰安城下, 郦道元所谓环水也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古时登山, 循东谷入, 道有天门.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "东谷者, 古谓之天门溪水, 余所不至也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今所经中岭及山巅, 崖限当道者, 世皆谓之天门云.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "道中迷雾冰滑, 磴几不可登.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "及既上, 苍山负雪, 明烛天南.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "戊申晦, 五鼓, 与子颍坐日观亭, 待日出.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大风扬积雪击面.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "亭东自足下皆云漫.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "稍见云中白若樗蒱数十立者, 山也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "极天云一线异色, 须臾成五采.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "日上, 正赤如丹, 下有红光动摇承之.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "或曰, 此东海也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "亭西有岱祠, 又有碧霞元君祠.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "皇帝行宫在碧霞元君祠东.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "僻不当道者, 皆不及往.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "山多石, 少土.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "石苍黑色, 多平方, 少圜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "少杂树, 多松, 生石罅, 皆平顶.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "冰雪, 无瀑水, 无鸟兽音迹.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至日观数里内无树, 而雪与人膝齐.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "桐城姚鼐记.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "登高": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "风急天高猿啸哀, 渚清沙白鸟飞回.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "无边落木萧萧下, 不尽长江滚滚来.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "万里悲秋常作客, 百年多病独登台.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "艰难苦恨繁霜鬓, 潦倒新停浊酒杯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "短歌行": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "对酒当歌, 人生几何!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "譬如朝露, 去日苦多.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "慨当以慷, 忧思难忘.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "何以解忧? 唯有杜康.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青青子衿, 悠悠我心.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "但为君故, 沉吟至今.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "呦呦鹿鸣, 食野之苹.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "我有嘉宾, 鼓瑟吹笙.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "明明如月, 何时可掇?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忧从中来, 不可断绝.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "越陌度阡, 枉用相存.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "契阔谈讌, 心念旧恩.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "月明星稀, 乌鹊南飞.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "绕树三匝, 何枝可依?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "山不厌高, 海不厌深.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "周公吐哺, 天下归心.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "石钟山记": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "《水经》云:\"彭蠡之口有石钟山焉\"": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是说也, 人常疑之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至唐李渤始访其遗踪, 得双石于潭上": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自以为得之矣": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然是说也, 余尤疑之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "石之铿然有声者, 所在皆是也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而此独以钟名, 何哉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "元丰七年六月丁丑, 余自齐安舟行适临汝": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而长子迈将赴饶之德兴尉, 送之至湖口": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "因得观所谓石钟者": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余固笑而不信也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至暮夜月明, 独与迈乘小舟, 至绝壁下": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "大石侧立千尺, 如猛兽奇鬼, 森然欲搏人": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而山上栖鹘, 闻人声亦惊起, 磔磔云霄间": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "又有若老人咳且笑于山谷中者, 或曰此鹳鹤也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余方心动欲还, 而大声发于水上": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "噌吰如钟鼓不绝": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舟人大恐": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "徐而察之, 则山下皆石穴罅": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不知其浅深, 微波入焉, 涵澹澎湃而为此也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舟回至两山间, 将入港口, 有大石当中流": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "可坐百人, 空中而多窍": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "与风水相吞吐, 有窾坎镗鞳之声": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "与向之噌吰者相应, 如乐作焉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "因笑谓迈曰:\"汝识之乎\"": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "噌吰者, 周景王之无射也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "窾坎镗鞳者, 魏庄子之歌钟也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "古之人不余欺也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "事不目见耳闻, 而臆断其有无, 可乎": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "郦元之所见闻殆与余同, 而言之不详": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "士大夫终不肯以小舟夜泊绝壁之下": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故莫能知": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而渔工水师虽知而不能言": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此世所以不传也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而陋者乃以斧斤考击而求之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自以为得其实": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余是以记之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盖叹郦元之简, 而笑李渤之陋也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "离骚": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "帝高阳之苗裔兮, 朕皇考曰伯庸.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "摄提贞于孟陬兮, 惟庚寅吾以降.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "皇览揆余初度兮, 肇锡余以嘉名.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "名余曰正则兮, 字余曰灵均.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "纷吾既有此内美兮, 又重之以修能.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "扈江离与辟芷兮, 纫秋兰以为佩.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "汩余若将不及兮, 恐年岁之不吾与.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "朝搴阰之木兰兮, 夕揽洲之宿莽.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "日月忽其不淹兮, 春与秋其代序.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "惟草木之零落兮, 恐美人之迟暮.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不抚壮而弃秽兮, 何不改此度?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乘骐骥以驰骋兮, 来吾道夫先路!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "长太息以掩涕兮, 哀民生之多艰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余虽好修姱以鞿羁兮, 謇朝谇而夕替.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "既替余以蕙纕兮, 又申之以揽茝.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "亦余心之所善兮, 虽九死其犹未悔.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "怨灵修之浩荡兮, 终不察夫民心.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "众女嫉余之蛾眉兮, 谣诼谓余以善淫.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "固时俗之工巧兮, 偭规矩而改错.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "背绳墨以追曲兮, 竞周容以为度.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忳郁邑余侘傺兮, 吾独穷困乎此时也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "宁溘死以流亡兮, 余不忍为此态也!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鸷鸟之不群兮, 自前世而固然.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "何方圜之能周兮, 夫孰异道而相安?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "屈心而抑志兮, 忍尤而攘诟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "伏清白以死直兮, 固前圣之所厚.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "悔相道之不察兮, 延伫乎吾将反.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "回朕车以复路兮, 及行迷之未远.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "步余马于兰皋兮, 驰椒丘且焉止息.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "进不入以离尤兮, 退将复修吾初服.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "制芰荷以为衣兮, 集芙蓉以为裳.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不吾知其亦已兮, 苟余情其信芳.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "高余冠之岌岌兮, 长余佩之陆离.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "芳与泽其杂糅兮, 唯昭质其犹亏.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "忽反顾以游目兮, 将往观乎四荒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "佩缤纷其繁饰兮, 芳菲菲其弥章.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "民生各有所乐兮, 余独好修以为常.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虽体解吾犹未变兮, 岂余心之可惩?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "种树郭橐驼传": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "郭橐驼, 不知始何名.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "驼闻之, 曰:'甚善.名我固当.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "因舍其名, 亦自谓橐驼云.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其乡曰丰乐乡, 在长安西.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "他植者虽窥伺效慕, 莫能如也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "既然已, 勿动勿虑, 去不复顾.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其莳也若子, 其置也若弃, 则其天者全而其性得矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾又何能为哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问者曰:'以子之道, 移之官理, 可乎?'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "驼曰:'我知种树而已, 官理, 非吾业也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "'鸣鼓而聚之, 击木而召之.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故病且怠.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "若是, 则与吾业者其亦有类乎?'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "传其事以为官戒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "答司马谏议书": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "辟邪说, 难壬人, 不为拒谏.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "至于怨诽之多, 则固前知其如此也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "如曰今日当一切不事事, 守前所为而已, 则非某之所敢知.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "无由会晤, 不任区区向往之至!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苏幕遮·燎沉香": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "燎沉香, 消溽暑": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鸟雀呼晴, 侵晓窥檐语": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "叶上初阳干宿雨, 水面清圆, 一一风荷举": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "故乡遥, 何日去?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "家住吴门, 久作长安旅": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "五月渔郎相忆否?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "小楫轻舟, 梦入芙蓉浦": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "菩萨蛮·书江西造口壁": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "郁孤台下清江水, 中间多少行人泪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "西北望长安, 可怜无数山.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青山遮不住, 毕竟东流去.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "江晚正愁余, 山深闻鹧鸪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "菩萨蛮·小山重叠金明灭": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鬓云欲度香腮雪": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "懒起画蛾眉, 弄妆梳洗迟": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "照花前后镜, 花面交相映": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "新帖绣罗襦, 双双金鹧鸪": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虞美人": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "春花秋月何时了, 往事知多少.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "小楼昨夜又东风, 故国不堪回首月明中.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "雕阑玉砌应犹在, 只是朱颜改.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问君能有几多愁, 恰是一江春水向东流.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蜀相": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "丞相祠堂何处寻? 锦官城外柏森森.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "映阶碧草自春色, 隔叶黄鹂空好音.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "三顾频烦天下计, 两朝开济老臣心.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "出师未捷身先死, 长使英雄泪满襟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蜀道难": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "噫吁嚱, 危乎高哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蜀道之难, 难于上青天!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蚕丛及鱼凫, 开国何茫然!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "尔来四万八千岁, 不与秦塞通人烟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "西当太白有鸟道, 可以横绝峨眉巅.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "地崩山摧壮士死, 然后天梯石栈相钩连.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "上有六龙回日之高标, 下有冲波逆折之回川.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "黄鹤之飞尚不得过, 猿猱欲度愁攀援.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青泥何盘盘, 百步九折萦岩峦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "扪参历井仰胁息, 以手抚膺坐长叹.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问君西游何时还? 畏途巉岩不可攀.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "但见悲鸟号古木, 雄飞雌从绕林间.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "又闻子规啼夜月, 愁空山.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蜀道之难, 难于上青天, 使人听此凋朱颜!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "连峰去天不盈尺, 枯松倒挂倚绝壁.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "飞湍瀑流争喧豗, 砯崖转石万壑雷.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其险也如此, 嗟尔远道之人胡为乎来哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "所守或匪亲, 化为狼与豺.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "锦城虽云乐, 不如早还家.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蜀道之难, 难于上青天, 侧身西望长咨嗟!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "论语·侍坐": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子路、曾皙、冉有、公西华侍坐": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫子哂之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "求! 尔何如?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "赤! 尔何如?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "点! 尔何如?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子曰: 何伤乎? 亦各言其志也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫子喟然叹曰: 吾与点也!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "子曰: 亦各言其志也已矣": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曰: 夫子何哂由也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "曰: 为国以礼, 其言不让, 是故哂之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "唯求则非邦也与?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "安见方六七十如五六十而非邦也者?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "唯赤则非邦也与?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "论语·学而八佾": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人而不仁, 如礼何? 人而不仁, 如乐何?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "朝闻道, 夕死可矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君子喻于义, 小人喻于利.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "见贤思齐焉, 见不贤而内自省也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "质胜文则野, 文胜质则史. 文质彬彬, 然后君子.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "知者不惑, 仁者不忧, 勇者不惧.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "有一言而可以终身行之者乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其'恕'乎! 己所不欲, 勿施于人.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谏太宗十思疏": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "有善始者实繁, 能克终者盖寡.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "竭诚则胡越为一体, 傲物则骨肉为行路.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "贺新郎·国脉微如缕": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "国脉微如缕": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "问长缨何时入手, 缚将戎主?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "未必人间无好汉, 谁与宽些尺度?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "试看取当年韩五": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "岂有谷城公付授, 也不干曾遇骊山母": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谈笑起, 两河路": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "少时棋柝曾联句": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "叹而今登楼揽镜, 事机频误": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "闻说北风吹面急, 边上冲梯屡舞": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君莫道投鞭虚语": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自古一贤能制难, 有金汤便可无张许?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "快投笔, 莫题柱": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "赤壁赋": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "清风徐来, 水波不兴": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "举酒属客, 诵明月之诗, 歌窈窕之章": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "少焉, 月出于东山之上, 徘徊于斗牛之间": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "白露横江, 水光接天": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "纵一苇之所如, 凌万顷之茫然": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "浩浩乎如冯虚御风, 而不知其所止": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "飘飘乎如遗世独立, 羽化而登仙": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "于是饮酒乐甚, 扣舷而歌之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "歌曰: '桂棹兮兰桨, 击空明兮溯流光'": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "渺渺兮予怀, 望美人兮天一方": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "客有吹洞箫者, 倚歌而和之": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其声呜呜然, 如怨如慕, 如泣如诉": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余音袅袅, 不绝如缕": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舞幽壑之潜蛟, 泣孤舟之嫠妇": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苏子愀然, 正襟危坐而问客曰": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "何为其然也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "西望夏口, 东望武昌, 山川相缪, 郁乎苍苍": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此非孟德之困于周郎者乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "方其破荆州, 下江陵, 顺流而东也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "舳舻千里, 旌旗蔽空": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "酾酒临江, 横槊赋诗": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "固一世之雄也, 而今安在哉?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "驾一叶之扁舟, 举匏樽以相属": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "寄蜉蝣于天地, 渺沧海之一粟": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "哀吾生之须臾, 羡长江之无穷": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "挟飞仙以遨游, 抱明月而长终": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "知不可乎骤得, 托遗响于悲风": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苏子曰: '客亦知夫水与月乎?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "逝者如斯, 而未尝往也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盈虚者如彼, 而卒莫消长也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盖将自其变者而观之, 则天地曾不能以一瞬": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自其不变者而观之, 则物与我皆无尽也": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而又何羡乎!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "且夫天地之间, 物各有主": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "苟非吾之所有, 虽一毫而莫取": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "惟江上之清风, 与山间之明月": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "耳得之而为声, 目遇之而成色": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "取之无禁, 用之不竭": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "是造物者之无尽藏也, 而吾与子之所共适": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "客喜而笑, 洗盏更酌": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "肴核既尽, 杯盘狼籍": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "相与枕藉乎舟中, 不知东方之既白": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "过秦论": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦孝公据崤函之固, 拥雍州之地,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "君臣固守以窥周室,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "当是时也, 商君佐之,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "内立法度, 务耕织, 修守战之具,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "外连衡而斗诸侯.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "于是秦人拱手而取西河之外.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "孝公既没, 惠文、武、昭襄蒙故业, 因遗策,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "诸侯恐惧, 会盟而谋弱秦,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "不爱珍器重宝肥饶之地, 以致天下之士,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "合从缔交, 相与为一.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "尝以十倍之地, 百万之众, 叩关而攻秦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦人开关延敌, 九国之师, 逡巡而不敢进.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦无亡矢遗镞之费, 而天下诸侯已困矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "于是从散约败, 争割地而赂秦.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "因利乘便, 宰割天下, 分裂山河.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "强国请服, 弱国入朝.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "延及孝文王、庄襄王, 享国之日浅, 国家无事.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "及至始皇, 奋六世之余烈, 振长策而御宇内,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吞二周而亡诸侯, 履至尊而制六合,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "执敲扑而鞭笞天下, 威振四海.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "南取百越之地, 以为桂林、象郡; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "百越之君, 俯首系颈, 委命下吏.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "胡人不敢南下而牧马, 士不敢弯弓而报怨.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "于是废先王之道, 焚百家之言, 以愚黔首; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "隳名城, 杀豪杰; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然后践华为城, 因河为池,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "据亿丈之城, 临不测之渊, 以为固.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "良将劲弩守要害之处, 信臣精卒陈利兵而谁何.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "始皇既没, 余威震于殊俗.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蹑足行伍之间, 而倔起阡陌之中,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "率疲弊之卒, 将数百之众, 转而攻秦; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "斩木为兵, 揭竿为旗,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "天下云集响应, 赢粮而景从.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "山东豪俊遂并起而亡秦族矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "且夫天下非小弱也, 雍州之地, 崤函之固, 自若也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "锄櫌棘矜, 非铦于钩戟长铩也; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谪戍之众, 非抗于九国之师也; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "深谋远虑, 行军用兵之道, 非及乡时之士也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然而成败异变, 功业相反, 何也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "试使山东之国与陈涉度长絜大, 比权量力,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "则不可同年而语矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然后以六合为家, 崤函为宫; ": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "仁义不施而攻守之势异也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "锦瑟": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "锦瑟无端五十弦, 一弦一柱思华年.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "庄生晓梦迷蝴蝶, 望帝春心托杜鹃.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "沧海月明珠有泪, 蓝田日暖玉生烟.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此情可待成追忆, 只是当时已惘然.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "长亭送别": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "碧云天, 黄花地, 西风紧, 北雁南飞.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "晓来谁染霜林醉? 总是离人泪.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "阿房宫赋": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "六王毕, 四海一, 蜀山兀, 阿房出.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "覆压三百余里, 隔离天日.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "骊山北构而西折, 直走咸阳.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "二川溶溶, 流入宫墙.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "长桥卧波, 未云何龙?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "复道行空, 不霁何虹?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "高低冥迷, 不知西东.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "一日之内, 一宫之间, 而气候不齐.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "明星荧荧, 开妆镜也;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "绿云扰扰, 梳晓鬟也;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "渭流涨腻, 弃脂水也;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "烟斜雾横, 焚椒兰也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "一肌一容, 尽态极妍, 缦立远视, 而望幸焉.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "有不得见者, 三十六年.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "使负栋之柱, 多于南亩之农夫;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "架梁之椽, 多于机上之工女;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "钉头磷磷, 多于在庾之粟粒;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "瓦缝参差, 多于周身之帛缕;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "直栏横槛, 多于九土之城郭;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "管弦呕哑, 多于市人之言语.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "使天下之人, 不敢言而敢怒.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "独夫之心, 日益骄固.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "戍卒叫, 函谷举, 楚人一炬, 可怜焦土!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "灭六国者六国也, 非秦也; 族秦者秦也, 非天下也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "嗟乎! 使六国各爱其人, 则足以拒秦;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "使秦复爱六国之人, 则递三世可至万世而为君,": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "谁得而族灭也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "秦人不暇自哀, 而后人哀之;": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "后人哀之而不鉴之, 亦使后人而复哀后人也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "陈情表": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣密言: 臣以险衅, 夙遭闵凶.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "生孩六月, 慈父见背; 行年四岁, 舅夺母志.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "祖母刘愍臣孤弱, 躬亲抚养.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣少多疾病, 九岁不行, 零丁孤苦, 至于成立.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "逮奉圣朝, 沐浴清化.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣以供养无主, 辞不赴命.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "猥以微贱, 当侍东宫, 非臣陨首所能上报.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣具以表闻, 辞不就职.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣之进退, 实为狼狈.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣无祖母, 无以至今日, 祖母无臣, 无以终余年.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "母孙二人, 更相为命, 是以区区不能废远.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "乌鸟私情, 愿乞终养.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣生当陨首, 死当结草.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "臣不胜犬马怖惧之情, 谨拜表以闻.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "青玉案·元夕": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "东风夜放花千树, 更吹落、星如雨": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "宝马雕车香满路": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "凤箫声动, 玉壶光转, 一夜鱼龙舞": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蛾儿雪柳黄金缕, 笑语盈盈暗香去": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "众里寻他千百度": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "蓦然回首, 那人却在, 灯火阑珊处": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "静女": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "静女其娈, 贻我彤管. 彤管有炜, 说怿女美.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "自牧归荑, 洵美且异. 匪女之为美, 美人之贻.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "项脊轩志": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "项脊轩, 旧南阁子也.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "室仅方丈, 可容一人居.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "又北向, 不能得日, 日过午已昏.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余稍为修葺, 使不上漏.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "然余居于此, 多可喜, 亦多可悲.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "先是庭中通南北为一.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "迨诸父异爨, 内外多置小门墙, 往往而是.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "东犬西吠, 客逾庖而宴, 鸡栖于厅.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "庭中始为篱, 已为墙, 凡再变矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "家有老妪, 尝居于此.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "妪, 先大母婢也, 乳二世, 先妣抚之甚厚.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "室西连于中闺, 先妣尝一至.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余自束发读书轩中, 一日, 大母过余曰:": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "比去, 以手阖门, 自语曰:": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾家读书久不效, 儿之成, 则可待乎!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "顷之, 持一象笏至, 曰:": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "此吾祖太常公宣德间执此以朝, 他日汝当用之!": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "瞻顾遗迹, 如在昨日, 令人长号不自禁.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余扃牖而居, 久之, 能以足音辨人.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "轩凡四遭火, 得不焚, 殆有神护者.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "吾妻归宁, 述诸小妹语曰:": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "闻姊家有阁子, 且何谓阁子也?": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "其后六年, 吾妻死, 室坏不修.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "鹊桥仙": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "纤云弄巧, 飞星传恨, 银汉迢迢暗度.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "金风玉露一相逢, 便胜却人间无数.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "柔情似水, 佳期如梦, 忍顾鹊桥归路.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + }, + "两情若是久长时, 又岂在朝朝暮暮.": { + "SM-2": { + "efactor": 2.5, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1776527865.8334022 + } + } +} \ No newline at end of file diff --git a/data/repo/cngk-t/manifest.toml b/data/repo/cngk-t/manifest.toml new file mode 100644 index 0000000..4a5e9c3 --- /dev/null +++ b/data/repo/cngk-t/manifest.toml @@ -0,0 +1,3 @@ +title = "高考必背古诗文-0" +author = "__heurams__" +desc = "高考古诗文 60 篇" diff --git a/data/repo/cngk-t/payload.toml b/data/repo/cngk-t/payload.toml new file mode 100644 index 0000000..d97b218 --- /dev/null +++ b/data/repo/cngk-t/payload.toml @@ -0,0 +1,5705 @@ +["临安春雨初霁"] +note = ['陆游〔宋代〕'] +content = "临安/春雨/初霁/" +translation = "临安春雨初霁" +keyword_note = { "临安" = "南宋都城, 今杭州", "霁" = "雨后或雪后转晴" } + +["世味年来薄似纱, 谁令骑马客京华."] +note = [] +content = "世味/年来/薄似纱/, 谁令/骑马/客/京华./" +translation = "这些年世态人情淡薄得似纱, 谁又让我乘马来到京都作客沾染繁华? " +keyword_note = { "世味" = "人世滋味; 社会人情", "客" = "客居", "京华" = "京城之美称, 这里指当时的京城临安" } + +["小楼一夜听春雨, 深巷明朝卖杏花."] +note = [] +content = "小楼/一夜/听/春雨/, 深巷/明朝/卖/杏花./" +translation = "住在小楼听尽了一夜的春雨淅沥滴答, 明日一早, 深幽的小巷便有人叫卖杏花. " +keyword_note = { "深巷" = "很长的巷道", "明朝" = "明日早晨" } + +["矮纸斜行闲作草, 晴窗细乳戏分茶."] +note = [] +content = "矮纸/斜行/闲/作草/, 晴窗/细乳/戏/分茶./" +translation = "铺开小纸从容地斜写着草书, 在小雨初晴的窗边细细地煮水、沏茶、撇沫, 试品名茶. " +keyword_note = { "矮纸" = "短纸、小纸", "斜行" = "倾斜的行列", "草" = "指草书", "晴窗" = "明亮的窗户", "细乳" = "沏茶时水面呈白色的小泡沫", "分茶" = "宋元时煎茶之法" } + +["素衣莫起风尘叹, 犹及清明可到家."] +note = [] +content = "素衣/莫起/风尘/叹/, 犹及/清明/可/到家./" +translation = "不要叹息那京都的尘土会弄脏洁白的衣衫, 清明时节还来得及回到镜湖边的山阴故家. " +keyword_note = { "素衣" = "原指白色的衣服, 这里用作代称. 是诗人对自己的谦称", "风尘叹" = "因风尘而叹息. 暗指不必担心京城的不良风气会污染自己的品质" } + +["书愤"] +note = [] +content = "书愤/" +translation = "书愤" +keyword_note = {} + +["早岁那知世事艰, 中原北望气如山"] +note = [] +content = "早岁/那知/世事/艰/, 中原/北望/气/如山/" +translation = "年轻时就立志北伐中原, 哪想到竟然是如此艰难. 我常常北望那中原大地, 热血沸腾啊怨气如山啊" +keyword_note = { "早岁" = "年轻时", "世事艰" = "世事艰难 (指北伐中原的艰难) ", "气如山" = "豪气如山涌" } + +["楼船夜雪瓜洲渡, 铁马秋风大散关"] +note = ['瓜洲渡: 宋军在东南抗击金兵进犯之地', '大散关: 陆游在南郑参加王炎军幕事时与金兵发生遭遇战之地'] +content = "楼船/夜雪/瓜洲/渡/, 铁马/秋风/大散关/" +translation = "记得在瓜州渡痛击金兵, 雪夜里飞奔着楼船战舰. 秋风中跨战马纵横驰骋, 收复了大散关捷报频传" +keyword_note = { "楼船" = "雄伟的战舰", "铁马" = "披铁甲的战马", "瓜洲渡" = "东南抗金要地", "大散关" = "西北抗金关隘" } + +["塞上长城空自许, 镜中衰鬓已先斑"] +note = ["塞上长城: 用南朝刘宋名将檀道济自称'万里长城'的典故"] +content = "塞上/长城/空/自许/, 镜中/衰鬓/已/先斑/" +translation = "想当初我自比万里长城, 立壮志为祖国扫除边患. 到如今垂垂老鬓发如霜, 盼北伐盼恢复都成空谈" +keyword_note = { "塞上长城" = "自比为保卫国家的长城", "空自许" = "徒然自许", "衰鬓" = "衰老的鬓发", "先斑" = "先已花白" } + +["出师一表真名世, 千载谁堪伯仲间"] +note = ['出师一表: 指诸葛亮的《出师表》', '伯仲间: 相提并论的意思'] +content = "出师/一表/真/名世/, 千载/谁堪/伯仲/间/" +translation = "不由人缅怀那诸葛孔明, 出师表真可谓名不虚传, 有谁像诸葛亮鞠躬尽瘁, 率三军复汉室北定中原" +keyword_note = { "出师一表" = "诸葛亮的《出师表》", "名世" = "名传于世", "伯仲间" = "相提并论" } + +["五代史伶官传序"] +note = [] +content = "五代史伶官传序/" +translation = "五代史伶官传序" +keyword_note = {} + +["呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!"] +note = ['《五代史伶官传序》开篇提出中心论点'] +content = "呜呼! /盛衰/之/理/, 虽/曰/天命/, 岂非/人事/哉!/" +translation = "唉! 盛衰的道理, 虽说是天命决定的, 难道说不是人事造成的吗? " +keyword_note = { "盛衰" = "兴盛和衰败", "理" = "道理", "虽" = "虽然", "天命" = "天意", "岂非" = "难道不是", "人事" = "人的作为" } + +["原庄宗之所以得天下, 与其所以失之者, 可以知之矣"] +note = [] +content = "原/庄宗/之所以/得/天下/, 与/其/所以/失之/者/, 可以/知/之/矣/" +translation = "推究庄宗取得天下的原因, 与他失去天下的原因, 就可以明白了" +keyword_note = { "原" = "推究", "庄宗" = "后唐庄宗李存勖", "所以" = "...的原因", "得" = "取得", "失" = "失去" } + +["世言晋王之将终也, 以三矢赐庄宗而告之曰:"] +note = [] +content = "世言/晋王/之/将终/也/, 以/三矢/赐/庄宗/而/告之/曰/:/" +translation = "世人传说晋王临死时, 把三支箭赐给庄宗, 并告诉他说" +keyword_note = { "世言" = "世人传说", "晋王" = "李克用", "将终" = "临死", "矢" = "箭", "赐" = "赏赐" } + +["梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁"] +note = [] +content = "梁/, 吾/仇/也; /燕王/, 吾/所立; /契丹/与/吾/约/为/兄弟; /而/皆/背/晋/以/归/梁/" +translation = "梁王朱温是我的仇敌, 燕王是我推立的, 契丹与我约为兄弟, 可是后来都背叛我去投靠了梁" +keyword_note = { "梁" = "后梁太祖朱温", "仇" = "仇敌", "燕王" = "刘仁恭", "所立" = "所推立", "契丹" = "北方部族", "约" = "订立盟约", "背" = "背叛", "归" = "归顺" } + +["此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!"] +note = [] +content = "此/三者/, 吾/遗恨/也. /与/尔/三矢/, 尔/其/无忘/乃父/之/志!/" +translation = "这三件事是我的遗恨. 交给你三支箭, 你千万不要忘记你父亲报仇的志向" +keyword_note = { "三者" = "三件事", "遗恨" = "遗留的恨事", "与" = "给", "尔" = "你", "其" = "一定 (表祈使) ", "无忘" = "不要忘记", "乃父" = "你的父亲" } + +["庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之"] +note = [] +content = "庄宗/受/而/藏之/于/庙. /其后/用兵/, 则/遣/从事/以/一少牢/告庙/, 请/其/矢/, 盛/以/锦囊/, 负/而/前驱/, 及/凯旋/而/纳之/" +translation = "庄宗接受了箭, 把它收藏在祖庙里. 以后庄宗出兵打仗, 便派手下的随从官员, 用猪羊去祭告祖先, 从宗庙里恭敬地取出箭来, 用漂亮的锦囊装着, 背着它走在前面, 等到凯旋时再把箭藏入祖庙" +keyword_note = { "受" = "接受", "庙" = "祖庙", "从事" = "随从官员", "少牢" = "用猪羊祭祀", "告庙" = "祭告祖庙", "锦囊" = "丝绸袋子", "负" = "背着", "前驱" = "在前面走", "凯旋" = "胜利归来", "纳" = "收藏" } + +["方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!"] +note = [] +content = "方/其/系/燕/父子/以/组/, 函/梁/君臣/之/首/, 入于/太庙/, 还矢/先王/, 而/告以/成功/, 其/意气/之/盛/, 可谓/壮/哉!/" +translation = "当他用绳子绑住燕王父子, 用小木匣装着梁国君臣的头, 走进祖庙, 把箭交还到晋王的灵座前, 告诉他生前报仇的志向已经完成, 他那神情气概, 是多么威风" +keyword_note = { "方" = "当", "系" = "捆绑", "组" = "绳索", "函" = "用木匣装", "太庙" = "祖庙", "还矢" = "交还箭", "先王" = "指晋王", "意气" = "神情气概", "壮" = "威武" } + +["及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归"] +note = [] +content = "及/仇雠/已/灭/, 天下/已/定/, 一夫/夜呼/, 乱者/四应/, 仓皇/东出/, 未及/见贼/而/士卒/离散/, 君臣/相顾/, 不知/所归/" +translation = "等到仇敌已经消灭, 天下已经安定, 一人在夜里发难, 作乱的人四面响应, 他慌慌张张的出兵向东逃跑, 还没见到乱贼, 部下的兵士就纷纷逃散, 君臣们你看着我, 我看着你, 不知道哪里去好" +keyword_note = { "仇雠" = "仇敌", "一夫" = "一个人", "夜呼" = "在夜里呼喊", "乱者" = "作乱的人", "四应" = "在四面响应", "仓皇" = "慌张", "东出" = "向东出逃", "士卒" = "士兵", "离散" = "分散逃离", "相顾" = "互相看着" } + +["至于誓天断发, 泣下沾襟, 何其衰也!"] +note = [] +content = "至于/誓天/断发/, 泣下/沾襟/, 何其/衰/也!/" +translation = "到了割下头发来对天发誓, 抱头痛哭, 眼泪沾湿衣襟的可怜地步, 怎么那样的衰败差劲呢" +keyword_note = { "誓天" = "对天发誓", "断发" = "割断头发", "泣下" = "眼泪流下", "沾襟" = "沾湿衣襟", "何其" = "多么", "衰" = "衰败" } + +["岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?"] +note = [] +content = "岂/得之/难/而/失之/易/欤? /抑/本/其/成败/之/迹/, 而/皆/自于/人/欤?/" +translation = "难道说是因为取得天下难, 而失去天下容易才像这样的吗? 还是认真推究他成功失败的原因, 都是由于人事呢" +keyword_note = { "岂" = "难道", "得" = "取得", "失" = "失去", "抑" = "还是", "本" = "推究", "成败" = "成功失败", "迹" = "事迹", "自于" = "来自于" } + +["《书》曰: 满招损, 谦得益."] +note = ['引用《尚书》名言'] +content = "《/书/》/曰/: 满/招/损/, 谦/得/益./" +translation = "《尚书》上说: '自满会招来损害, 谦虚能得到益处'" +keyword_note = { "《书》" = "《尚书》", "满" = "自满", "招" = "招来", "损" = "损害", "谦" = "谦虚", "得" = "得到", "益" = "益处" } + +["忧劳可以兴国, 逸豫可以亡身, 自然之理也"] +note = [] +content = "忧劳/可以/兴国/, 逸豫/可以/亡身/, 自然/之/理/也/" +translation = "忧劳可以使国家兴盛, 安乐可以使自身灭亡, 这是自然的道理" +keyword_note = { "忧劳" = "忧虑勤劳", "兴国" = "使国家兴盛", "逸豫" = "安逸享乐", "亡身" = "使自身灭亡", "自然" = "理所当然" } + +["故方其盛也, 举天下之豪杰, 莫能与之争;"] +note = [] +content = "故/方/其/盛/也/, 举/天下/之/豪杰/, 莫/能/与/之/争;/" +translation = "因此, 当他兴盛时, 普天下的豪杰, 没有谁能和他相争" +keyword_note = { "故" = "因此", "方" = "当", "盛" = "兴盛", "举" = "全", "豪杰" = "英雄豪杰", "莫" = "没有谁" } + +["及其衰也, 数十伶人困之, 而身死国灭, 为天下笑"] +note = [] +content = "及/其/衰/也/, 数十/伶人/困之/, 而/身死/国灭/, 为/天下/笑/" +translation = "到他衰败时, 数十个乐官就把他困住, 最后身死国灭, 被天下人耻笑" +keyword_note = { "及" = "等到", "衰" = "衰败", "伶人" = "乐官", "困" = "围困", "身死" = "自身死亡", "国灭" = "国家灭亡", "为" = "被" } + +["夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?"] +note = ['文章结尾点明主旨'] +content = "夫/祸患/常/积/于/忽微/, 而/智勇/多/困/于/所溺/, 岂/独/伶人/也/哉?/" +translation = "祸患常常是由一点一滴极小的错误积累而酿成的, 纵使是聪明有才能和英勇果敢的人, 也多半沉溺于某种爱好之中, 受其迷惑而结果陷于困穷, 难道只有乐工吗" +keyword_note = { "祸患" = "灾祸", "积" = "积累", "忽微" = "极小的事情", "智勇" = "智勇的人", "困" = "受困", "所溺" = "所沉溺的事物", "岂独" = "难道只有", "伶人" = "乐工" } + +["六国论"] +note = [] +content = "六国论/" +translation = "六国论" +keyword_note = {} + +["六国破灭, 非兵不利, 战不善, 弊在赂秦."] +note = [] +content = "六国/破灭/, 非/兵/不利/, 战/不善/, 弊/在/赂秦./" +translation = "六国的灭亡, 不是 (因为他们的) 武器不锋利, 仗打得不好, 弊端在于用土地来贿赂秦国. " +keyword_note = { "兵" = "兵器", "利" = "锋利", "善" = "好", "弊" = "弊端", "赂秦" = "贿赂秦国" } + +["赂秦而力亏, 破灭之道也."] +note = [] +content = "赂秦/而/力亏/, 破灭/之/道/也./" +translation = "拿土地贿赂秦国亏损了自己的力量, (这就) 是灭亡的原因. " +keyword_note = { "力亏" = "力量亏损", "道" = "原因, 途径" } + +["或曰: 六国互丧, 率赂秦耶?"] +note = [] +content = "或/曰:/ 六国/互丧/, 率/赂秦/耶?/" +translation = "有人问: “六国一个接一个的灭亡, 难道全部是因为贿赂秦国吗? ”" +keyword_note = { "或" = "有人", "互丧" = "相继灭亡", "率" = "全都" } + +["曰: 不赂者以赂者丧."] +note = [] +content = "曰:/ 不赂者/以/赂者/丧./" +translation = " (回答) 说: “不贿赂秦国的国家因为有贿赂秦国的国家而灭亡. ”" +keyword_note = { "以" = "因为" } + +["盖失强援, 不能独完."] +note = [] +content = "盖/失/强援/, 不能/独完./" +translation = "原因是不贿赂秦国的国家失掉了强有力的外援, 不能独自保全. " +keyword_note = { "盖" = "承接上文, 表示原因", "强援" = "强有力的外援", "独完" = "独自保全" } + +["故曰: 弊在赂秦也."] +note = [] +content = "故/曰:/ 弊/在/赂秦/也./" +translation = "所以说: 弊病在于贿赂秦国. ”" +keyword_note = { "故" = "所以" } + +["秦以攻取之外, 小则获邑, 大则得城."] +note = [] +content = "秦/以/攻取/之外/, 小/则/获邑/, 大/则/得城./" +translation = "秦国除了用战争夺取土地以外, (还受到诸侯的贿赂) , 小的贿赂就获得邑镇, 大的贿赂就获得城池. " +keyword_note = { "攻取" = "用战争夺取", "邑" = "小城镇", "城" = "大城池" } + +["较秦之所得, 与战胜而得者, 其实百倍;"] +note = [] +content = "较/秦之/所得/, 与/战胜/而/得者/, 其/实/百倍;/" +translation = "比较秦国受贿赂所得到的土地与战胜别国所得到的土地, (前者)实际多百倍. " +keyword_note = { "较" = "比较", "所得" = "得到的土地", "其实" = "它实际的数量" } + +["诸侯之所亡, 与战败而亡者, 其实亦百倍."] +note = [] +content = "诸侯/之/所亡/, 与/战败/而/亡者/, 其/实/亦/百倍./" +translation = "六国诸侯 (贿赂秦国) 所丧失的土地与战败所丧失的土地相比, 实际也要多百倍. " +keyword_note = { "所亡" = "丧失的土地" } + +["则秦之所大欲, 诸侯之所大患, 固不在战矣."] +note = [] +content = "则/秦之/所/大欲/, 诸侯/之/所/大患/, 固/不/在/战/矣./" +translation = "那么秦国最想要的, 与六国诸侯最担心的, 本来就不在于战争. " +keyword_note = { "大欲" = "最想要的", "大患" = "最担心的", "固" = "本来" } + +["思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地."] +note = [] +content = "思/厥/先祖父/, 暴/霜露/, 斩/荆棘/, 以/有/尺寸/之/地./" +translation = "想到他们的祖辈和父辈, 冒着寒霜雨露, 披荆斩棘, 才有了很少的一点土地. " +keyword_note = { "厥" = "他们的", "先祖父" = "祖辈和父辈", "暴霜露" = "暴露在霜露之中, 形容艰苦", "尺寸之地" = "很少的土地" } + +["子孙视之不甚惜, 举以予人, 如弃草芥."] +note = [] +content = "子孙/视之/不/甚惜/, 举/以/予人/, 如/弃/草芥./" +translation = "子孙对那些土地却不很爱惜, 全都拿来送给别人, 就像扔掉小草一样不珍惜. " +keyword_note = { "视" = "对待", "举" = "拿", "予" = "给", "草芥" = "小草, 比喻微不足道的东西" } + +["今日割五城, 明日割十城, 然后得一夕安寝."] +note = [] +content = "今日/割/五城/, 明日/割/十城/, 然后/得/一夕/安寝./" +translation = "今天割掉五座城, 明天割掉十座城, 这才能睡一夜安稳觉. " +keyword_note = { "割" = "割让", "安寝" = "安稳睡觉" } + +["起视四境, 而秦兵又至矣."] +note = [] +content = "起/视/四境/, 而/秦兵/又/至/矣./" +translation = "明天起床一看四周边境, 秦国的军队又来了. " +keyword_note = { "四境" = "四方边境" } + +["然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急."] +note = [] +content = "然则/诸侯/之/地/有限/, 暴秦/之/欲/无厌/, 奉之/弥繁/, 侵之/愈急./" +translation = "既然这样, 那么诸侯的土地有限, 强暴的秦国的欲望永远不会满足, (诸侯) 送给他的越多, 他侵犯得就越急迫. " +keyword_note = { "然则" = "既然这样, 那么", "暴秦" = "强暴的秦国", "无厌" = "不满足", "奉" = "奉献", "弥" = "更加", "繁" = "多", "侵" = "侵犯", "愈" = "越发" } + +["故不战而强弱胜负已判矣."] +note = [] +content = "故/不战/而/强弱/胜负/已/判/矣./" +translation = "所以用不着战争, 谁强谁弱, 谁胜谁负就已经决定了. " +keyword_note = { "判" = "决定, 分清" } + +["至于颠覆, 理固宜然."] +note = [] +content = "至于/颠覆/, 理/固/宜然./" +translation = "到了覆灭的地步,道理本来就是这样子的. " +keyword_note = { "颠覆" = "灭亡", "理" = "道理", "固" = "本来", "宜然" = "应该这样" } + +["古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”"] +note = [] +content = "古人/云:/ “以/地/事秦/, 犹/抱薪/救火/, 薪/不尽/, 火/不灭.”/" +translation = "古人说: “用土地侍奉秦国, 就好像抱柴救火, 柴不烧完, 火就不会灭. ”" +keyword_note = { "事" = "侍奉", "犹" = "好像", "抱薪救火" = "抱着柴草救火" } + +["此言得之."] +note = [] +content = "此/言/得之./" +translation = "这话说的很正确. " +keyword_note = { "得之" = "得其理, 说对了" } + +["齐人未尝赂秦, 终继五国迁灭, 何哉?"] +note = [] +content = "齐人/未尝/赂秦/, 终/继/五国/迁灭/, 何哉?/" +translation = "齐国不曾贿赂秦国, (可是) 最终也随着五国灭亡了, 为什么呢? " +keyword_note = { "未尝" = "不曾", "终" = "最终", "继" = "跟着", "迁灭" = "灭亡" } + +["与嬴而不助五国也."] +note = [] +content = "与嬴/而/不助/五国/也./" +translation = " (是因为齐国) 跟秦国交好而不帮助其他五国. " +keyword_note = { "与嬴" = "亲附秦国 (嬴是秦国的姓) " } + +["五国既丧, 齐亦不免矣."] +note = [] +content = "五国/既丧/, 齐/亦/不免/矣./" +translation = "五国已经灭亡了, 齐国也就没法幸免了. " +keyword_note = { "既" = "已经", "免" = "幸免" } + +["燕赵之君, 始有远略, 能守其土, 义不赂秦."] +note = [] +content = "燕赵/之君/, 始/有/远略/, 能/守/其土/, 义/不/赂秦./" +translation = "燕国和赵国的国君, 起初有长远的谋略, 能够守住他们的国土, 坚持正义, 不贿赂秦国. " +keyword_note = { "始" = "起初", "远略" = "长远的谋略", "义" = "坚持正义 (名词作动词) " } + +["是故燕虽小国而后亡, 斯用兵之效也."] +note = [] +content = "是故/燕/虽/小国/而/后亡/, 斯/用兵/之/效/也./" +translation = "因此燕虽然是个小国, 却后来才灭亡, 这就是用兵抗秦的效果. " +keyword_note = { "是故" = "因此", "斯" = "这", "效" = "效果, 成效" } + +["至丹以荆卿为计, 始速祸焉."] +note = [] +content = "至/丹/以/荆卿/为/计/, 始/速/祸/焉./" +translation = "等到后来燕太子丹用派遣荆轲刺杀秦王作对付秦国的计策, 这才招致了 (灭亡的) 祸患. " +keyword_note = { "丹" = "燕太子丹", "荆卿" = "荆轲", "速" = "招致" } + +["赵尝五战于秦, 二败而三胜."] +note = [] +content = "赵/尝/五战/于秦/, 二败/而/三胜./" +translation = "赵国曾经与秦国交战五次, 打了两次败仗, 三次胜仗. " +keyword_note = { "尝" = "曾经", "于" = "和, 同" } + +["后秦击赵者再, 李牧连却之."] +note = [] +content = "后/秦/击赵/者/再/, 李牧/连/却之./" +translation = "后来秦国又两次打赵国. (赵国大将) 李牧接连打退秦国的进攻. " +keyword_note = { "再" = "两次", "却之" = "使之退却, 打退它" } + +["洎牧以谗诛, 邯郸为郡, 惜其用武而不终也."] +note = [] +content = "洎/牧/以/谗/诛/, 邯郸/为/郡/, 惜/其/用武/而/不终/也./" +translation = "等到李牧因为谗言陷害被诛杀, (赵国都城) 邯郸变成 (秦国的一个) 郡, 可惜赵国用武力抗秦而没能坚持到底. " +keyword_note = { "洎" = "等到", "谗" = "谗言", "诛" = "被杀", "为郡" = "成为 (秦国的) 一个郡", "不终" = "没有坚持到底" } + +["且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已."] +note = [] +content = "且/燕赵/处/秦/革灭/殆尽/之际/, 可谓/智力/孤危/, 战败/而亡/, 诚/不得已./" +translation = "而且燕赵两国正处在秦国把其他国家快要消灭干净的时候, 可以说是智谋穷竭, 国势孤立危急, 战败了而亡国, 确实是不得已的事. " +keyword_note = { "革灭" = "消灭", "殆尽" = "几乎完了", "智力" = "智谋和力量", "孤危" = "孤立危急", "诚" = "确实" } + +["向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,"] +note = [] +content = "向使/三国/各/爱/其地/, 齐人/勿/附/于秦/, 刺客/不行/, 良将/犹在,/" +translation = "假使韩、魏、楚三国都爱惜他们的国土, 齐国不依附秦国. (燕国的) 刺客不去 (刺秦王) , (赵国的) 良将李牧还活着, " +keyword_note = { "向使" = "假使", "附" = "依附", "不行" = "不去", "犹" = "还" } + +["则胜负之数, 存亡之理, 当与秦相较, 或未易量."] +note = [] +content = "则/胜负/之数/, 存亡/之理/, 当/与/秦/相较/, 或/未/易量./" +translation = "那么胜负存亡的命运, 倘若与秦国相比较, 也许还不容易衡量 (出高低来) 呢. " +keyword_note = { "数" = "天数, 命运", "理" = "理数, 命运", "当" = "倘若", "或" = "或许", "易量" = "容易判断" } + +["呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,"] +note = [] +content = "呜呼/! 以/赂秦/之/地/封/天下/之/谋臣/, 以/事秦/之/心/礼/天下/之/奇才/, 并力/西向,/" +translation = "唉! (如果六国诸侯) 用贿赂秦国的土地来封给天下的谋臣, 用侍奉秦国的心来礼遇天下的奇才, 齐心合力地向西 (对付秦国) , " +keyword_note = { "呜呼" = "叹词, 唉", "封" = "封赏", "礼" = "礼遇 (名词作动词) ", "并力" = "合力", "西向" = "向西 (对抗秦国) " } + +["则吾恐秦人食之不得下咽也."] +note = [] +content = "则/吾/恐/秦人/食之/不得/下咽/也./" +translation = "那么, 我恐怕秦国人饭也不能咽下去. " +keyword_note = { "恐" = "恐怕", "下咽" = "咽下" } + +["悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡."] +note = [] +content = "悲夫/! 有/如此/之势/, 而/为/秦人/积威/之/所劫/, 日/削/月/割/, 以/趋于/亡./" +translation = "真可悲啊! 有这样的有利形势, 却被秦国积久的威势所胁迫, 每日每月割让土地, 以至于走向灭亡. " +keyword_note = { "悲夫" = "可悲啊", "积威" = "积久而成的威势", "劫" = "胁迫", "日削月割" = "一天天地削减, 一月月地割让" } + +["为国者无使为积威之所劫哉!"] +note = [] +content = "为/国者/无/使/为/积威/之/所劫/哉!/" +translation = "治理国家的人不要被积久的威势所胁迫啊! " +keyword_note = { "为国者" = "治理国家的人", "无使" = "不要让自己" } + +["夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势."] +note = [] +content = "夫/六国/与/秦/皆/诸侯/, 其/势/弱于/秦/, 而/犹有/可以/不赂/而/胜之/之/势./" +translation = "六国和秦国都是诸侯之国, 他们的势力比秦国弱, 却还有可以不贿赂秦国而战胜它的优势. " +keyword_note = { "夫" = "句首发语词", "势" = "势力", "弱于秦" = "比秦国弱", "犹" = "仍然", "可以" = "可以凭借" } + +["苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣."] +note = [] +content = "苟/以/天下/之/大/, 下/而/从/六国/破亡/之/故事/, 是/又/在/六国/下/矣./" +translation = "如果凭借偌大国家, 却追随六国灭亡的前例, 这就比不上六国了. " +keyword_note = { "苟" = "如果", "天下之大" = "偌大的天下 (指宋朝) ", "下" = "降低身份, 这里指追随", "从" = "跟随", "故事" = "旧事, 先例", "是" = "这" } + +["劝学"] +note = [] +content = "劝学/" +translation = "劝学" +keyword_note = {} + +["君子曰: 学不可以已."] +note = [] +content = "君子/曰: /学/不可以/已./" +translation = "君子说: 学习是不可以停止的" +keyword_note = { "君子" = "指有学问有修养的人", "已" = "停止" } + +["青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水."] +note = [] +content = "青/, 取之/于蓝/, 而/青/于蓝; /冰/, 水/为之/, 而/寒/于水./" +translation = "靛青是从蓝草里提取的, 可是比蓝草的颜色更深; 冰是水凝结而成的, 却比水还要寒冷" +keyword_note = { "青" = "靛青, 一种染料", "蓝" = "蓼蓝, 一年生草本植物, 叶子含蓝汁, 可以做蓝色染料" } + +["木直中绳, 𫐓以为轮, 其曲中规."] +note = [] +content = "木直/中绳/, 𫐓/以为/轮/, 其曲/中规./" +translation = "一块木材直得合乎墨线, 假如用火烤使它弯曲做成车轮, 它的弧度就可以符合圆规的标准" +keyword_note = { "中绳" = "合乎拉直的墨线", "𫐓" = "通'煣', 古代用火烤使木条弯曲的一种工艺", "规" = "圆规, 画圆的工具" } + +["虽有槁暴, 不复挺者, 𫐓使之然也."] +note = [] +content = "虽/有/槁暴/, 不复/挺者/, 𫐓/使之/然也./" +translation = "即使又被风吹日晒而干枯了, 木材也不会再挺直, 是因为经过加工使它成为这样的" +keyword_note = { "有" = "通'又'", "槁暴" = "晒干. 槁, 枯. 暴, 同'曝', 晒干", "挺" = "直" } + +["故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣."] +note = [] +content = "故/木/受绳/则直/, 金/就砺/则利/, 君子/博学/而/日/参省/乎己/, 则/知明/而/行/无过矣./" +translation = "所以木材用墨线量过再经辅具加工就能取直, 刀剑在磨刀石上磨过就能变得锋利, 君子广泛地学习并且每天检验反省自己, 那么他就会智慧明达而且行为没有过失了" +keyword_note = { "受绳" = "用墨线量过", "金" = "指金属制的刀剑等", "就砺" = "拿到磨刀石上去磨", "博学" = "广泛地学习", "参省" = "检验反省. 参, 一译检验, 检查; 二译同'叁', 多次", "知" = "同'智', 见识" } + +["吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也."] +note = [] +content = "吾尝/终日/而思矣/, 不如/须臾/之所学也; /吾尝/跂/而望矣/, 不如/登高/之博见也./" +translation = "我曾经整天思索, 却不如片刻学到的知识多; 我曾经踮起脚远望, 却不如登到高处看得广阔" +keyword_note = { "须臾" = "片刻, 一会儿", "跂" = "踮起脚后跟", "博见" = "看见的范围广, 见得广" } + +["登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰."] +note = [] +content = "登高/而招/, 臂/非加长也/, 而/见者/远; /顺风/而呼/, 声/非加疾也/, 而/闻者/彰./" +translation = "登到高处招手, 胳膊没有加长, 可是别人在远处也能看见; 顺着风呼叫, 声音没有变得洪亮, 可是听的人在远处也能听得很清楚" +keyword_note = { "疾" = "声音洪大", "彰" = "明显, 清楚. 这里指听得更清楚" } + +["假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河."] +note = [] +content = "假/舆马者/, 非/利足也/, 而/致/千里; /假/舟楫者/, 非/能水也/, 而/绝/江河./" +translation = "借助车马的人, 并不是脚走得快, 却可以达到千里之外; 借助舟船的人, 并不善于游泳, 却可以横渡江河" +keyword_note = { "假" = "凭借, 利用", "舆" = "车厢, 这里指车", "利足" = "脚走得快", "水" = "游泳", "绝" = "横渡" } + +["君子生非异也, 善假于物也."] +note = [] +content = "君子/生/非异也/, 善/假于/物也./" +translation = "君子的资质秉性跟一般人没有不同, 只是君子善于借助外物罢了" +keyword_note = { "生" = "通'性', 天赋, 资质" } + +["积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉."] +note = [] +content = "积土/成山/, 风雨/兴焉; /积水/成渊/, 蛟龙/生焉; /积善/成德/, 而/神明/自得/, 圣心/备焉./" +translation = "堆积土石成了高山, 风雨从这里兴起; 汇积水流成为深渊, 蛟龙从这儿产生; 积累善行养成高尚的道德, 精神得到提升, 圣人的心境由此具备" +keyword_note = { "神明" = "精神", "圣心" = "圣人的心境" } + +["故不积跬步, 无以至千里; 不积小流, 无以成江海."] +note = [] +content = "故/不积/跬步/, 无以/至/千里; /不积/小流/, 无以/成/江海./" +translation = "所以不积累一步半步的行程, 就没有办法达到千里之远; 不积累细小的流水, 就没有办法汇成江河大海" +keyword_note = { "跬" = "行走时两脚之间的距离, 等于现在所说的一步、古人所说的半步", "步" = "古人说一步, 指左右脚都向前迈一次的距离, 等于现在的两步" } + +["骐骥一跃, 不能十步; 驽马十驾, 功在不舍."] +note = [] +content = "骐骥/一跃/, 不能/十步; /驽马/十驾/, 功在/不舍./" +translation = "骏马一跨跃, 也不足十步远; 劣马连走十天, 它的成功在于不停止" +keyword_note = { "骐骥" = "骏马, 千里马", "驽马" = "劣马", "十驾" = "劣马拉车连走十天也能到达. 驾, 古代马拉车时, 早晨套一上车, 晚上卸去. 套车叫驾, 所以这里用'驾'指代马车一天的行程", "舍" = "舍弃. 指不放弃行路" } + +["锲而舍之, 朽木不折; 锲而不舍, 金石可镂."] +note = [] +content = "锲/而舍之/, 朽木/不折; /锲/而不舍/, 金石/可镂./" +translation = "如果刻几下就停下来了, 那么腐朽的木头也刻不断. 如果不停地刻下去, 那么金石也能雕刻成功" +keyword_note = { "锲" = "用刀雕刻", "镂" = "原指在金属上雕刻, 泛指雕刻" } + +["蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也."] +note = [] +content = "蚓/无/爪牙/之利/, 筋骨/之强/, 上/食/埃土/, 下/饮/黄泉/, 用心/一也./" +translation = "蚯蚓没有锐利的爪子和牙齿, 强健的筋骨, 却能向上吃到泥土, 向下喝到地下的泉水, 这是由于它用心专一" +keyword_note = { "黄泉" = "地下的泉水", "一" = "专一" } + +["蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也."] +note = [] +content = "蟹/六跪/而/二螯/, 非/蛇鳝/之穴/无可/寄托者/, 用心/躁也./" +translation = "螃蟹有六条腿, 两个蟹钳, 但是没有蛇、鳝的洞穴它就无处藏身, 这是因为它用心浮躁" +keyword_note = { "六跪" = "六条腿. 蟹实际上是八条腿. 跪, 蟹脚", "螯" = "螃蟹等节肢动物身前的大爪, 形如钳", "蛇鳝" = "异文'蛇蟮'", "躁" = "浮躁, 不专心" } + +["声声慢·寻寻觅觅"] +note = [] +content = "声声慢·寻寻觅觅/" +translation = "声声慢·寻寻觅觅" +keyword_note = {} + +["寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识."] +note = [] +content = "寻寻觅觅/, 冷冷清清/, 凄凄惨惨戚戚. /乍暖还寒时候/, 最难将息. /三杯两盏淡酒/, 怎敌他/、晚来风急/! /雁过也/, 正伤心/, 却是旧时相识./" +translation = "苦苦寻觅, 却只见冷冷清清, 怎不让人凄惨悲戚. 秋天的天气, 总是忽然变暖又转寒, 最难休养调理. 喝几杯淡酒, 怎么能抵挡得住傍晚的寒风紧吹? 一行大雁从头顶上飞过, 更让人伤心, 竟然都是当年为我传递书信的旧相识. " +keyword_note = { "寻寻觅觅" = "意谓想把失去的一切都找回来, 表现非常空虚怅惘、迷茫失落的心态", "凄凄惨惨戚戚" = "忧愁苦闷的样子", "乍暖还寒" = "指秋天的天气, 忽然变暖, 又转寒冷", "将息" = "旧时方言, 休养调理之意", "怎敌他" = "对付, 抵挡" } + +["满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!"] +note = ['守着窗儿 一作: 守著窗儿'] +content = "满地黄花堆积/, 憔悴损/, 如今有谁堪摘? /守着窗儿/, 独自怎生得黑? /梧桐更兼细雨/, 到黄昏/、点点滴滴. /这次第/, 怎一个愁字了得!/" +translation = "园中菊花堆积满地, 唯独我因忧伤而憔悴瘦损, 如今有谁可以摘取? 孤独地守在窗前, 一个人怎样才能熬到天黑? 梧桐叶上细雨淋漓, 到黄昏时分, 那雨声还是点点滴滴. 这般光景, 一个'愁'字怎么能概括得尽! " +keyword_note = { "憔悴损" = "表示程度很深", "堪" = "可以, 能够", "怎生" = "怎样的. 生: 语助词", "梧桐更兼细雨" = "暗用白居易《长恨歌》'秋雨梧桐叶落时'诗意", "这次第" = "这光景、这情形", "怎一个愁字了得" = "一个'愁'字怎么能概括得尽呢" } + +["大道之行也"] +note = [] +content = "大道之行也/" +translation = "大道之行也" +keyword_note = {} + +["大道之行也, 天下为公."] +note = [] +content = "大道/之行/也/, 天下/为公./" +translation = "大道实行的时代, 是以天下为大家所共有" +keyword_note = { "大道" = "上古帝王所遵行的礼乐准则", "天下为公" = "天下成为公共的" } + +["选贤与能, 讲信修睦."] +note = [] +content = "选贤/与能/, 讲信/修睦./" +translation = "选举贤能者共同治理, 人人心口如一, 彼此合作" +keyword_note = { "选贤与能" = "选拔贤才推举能人", "讲信修睦" = "讲求信用增进和睦" } + +["故人不独亲其亲, 不独子其子."] +note = [] +content = "故/人/不独/亲其亲/, 不独/子其子./" +translation = "于是大家不独敬奉自己的父母, 不独扶养自己的儿女" +keyword_note = { "亲其亲" = "敬奉自己的父母", "子其子" = "抚养自己的子女" } + +["使老有所终, 壮有所用, 幼有所长."] +note = [] +content = "使/老/有所终/, 壮/有所用/, 幼/有所长./" +translation = "使社会上的老者各得安享天年, 壮者各能贡献才力, 儿童得到良好的教育" +keyword_note = { "有所终" = "有善终", "有所用" = "有用处", "有所长" = "使成长" } + +["矜寡孤独废疾者皆有所养."] +note = [] +content = "矜寡/孤独/废疾者/皆/有所养./" +translation = "鳏、寡、孤、独以及残疾人都能得到供养" +keyword_note = { "矜" = "同'鳏', 老而无妻", "寡" = "老而无夫", "孤" = "幼而无父", "独" = "老而无子", "废疾" = "残废的人" } + +["男有分, 女有归."] +note = [] +content = "男/有分/, 女/有归./" +translation = "男人各尽自己的职分, 女人各有自己的家庭" +keyword_note = { "分" = "职分", "归" = "女子出嫁" } + +["货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己."] +note = [] +content = "货/恶其/弃于地/也/, 不必/藏于己/; 力/恶其/不出于身/也/, 不必/为己./" +translation = "既不把财物委弃于无用之地, 也不把财物私藏于己身. 既嫌恶有力不肯出力, 也不能为私人出力才算是效劳" +keyword_note = { "货" = "财物", "力" = "劳力" } + +["是故谋闭不兴, 盗窃乱贼而不作."] +note = [] +content = "是故/谋闭/不兴/, 盗窃/乱贼/而不作./" +translation = "因此, 就不会有钩心斗角、损人利己的阴谋发生, 也不会有劫持、偷盗、杀人越货的勾当出现" +keyword_note = { "谋闭" = "阴谋闭藏", "作" = "发生" } + +["故外户而不闭, 是谓大同."] +note = [] +content = "故/外户/而不闭/, 是谓/大同./" +translation = "纵有门窗的设置, 也只是便于起居, 并无需防备歹人. 那样的世界才真是大同的世界" +keyword_note = { "闭" = "关闭", "大同" = "儒家的理想社会, 实际是理想化了的原始社会" } + +["客至"] +note = [] +content = "客至/" +translation = "客至" +keyword_note = {} + +["舍南舍北皆春水, 但见群鸥日日来."] +note = ["杜甫〔唐代']"] +content = "舍南/舍北/皆/春水/, 但见/群鸥/日日/来./" +translation = "草堂的南北绿水缭绕、春意荡漾, 只见鸥群日日结队飞来. " +keyword_note = { "舍" = "指家", "但见" = "只见. 此句意为平时交游很少, 只有鸥鸟不嫌弃能与之相亲" } + +["花径不曾缘客扫, 蓬门今始为君开."] +note = [] +content = "花径/不曾/缘客/扫/, 蓬门/今始/为君/开./" +translation = "长满花草的庭院小路不曾因为迎客而打扫, 只是为了你的到来, 我家草门首次打开. " +keyword_note = { "花径" = "长满花草的小路", "蓬门" = "用蓬草编成的门户, 以示房子的简陋" } + +["盘飧市远无兼味, 樽酒家贫只旧醅."] +note = [] +content = "盘飧/市远/无/兼味/, 樽酒/家贫/只/旧醅./" +translation = "离集市太远盘中没好菜肴, 家境贫寒只有隔年的陈酒招待. " +keyword_note = { "市远" = "离市集远", "兼味" = "多种美味佳肴. 无兼味, 谦言菜少", "樽" = "酒器", "旧醅" = "旧酿之酒. 醅, 没有过滤的酒, 也泛指酒" } + +["肯与邻翁相对饮, 隔篱呼取尽余杯."] +note = [] +content = "肯与/邻翁/相对/饮/, 隔篱/呼取/尽/余杯./" +translation = "如肯与邻家老翁举杯对饮, 那我就隔着篱笆将他唤来. " +keyword_note = { "肯" = "能否允许, 这是向客人征询", "余杯" = "余下来的酒" } + +["将进酒"] +note = [] +content = "将进酒/" +translation = "将进酒" +keyword_note = {} + +["君不见, 黄河之水天上来, 奔流到海不复回."] +note = ['黄河发源于青海, 因那里地势极高, 故称天上来'] +content = "君不见/, 黄河之水/天上来/, 奔流到海/不复回./" +translation = "你没见那黄河之水从天上奔腾而来, 波涛翻滚直奔东海, 再也没有回来" +keyword_note = { "君不见" = "乐府中常用的一种夸语", "天上来" = "黄河发源于青海, 因那里地势极高, 故称" } + +["君不见, 高堂明镜悲白发, 朝如青丝暮成雪!"] +note = [] +content = "君不见/, 高堂明镜/悲白发/, 朝如青丝/暮成雪!/" +translation = "你没见那年迈的父母, 对着明镜感叹自己的白发, 年轻时候的满头青丝如今已是雪白一片" +keyword_note = { "高堂" = "指的是父母", "青丝" = "黑发" } + +["人生得意须尽欢, 莫使金樽空对月."] +note = [] +content = "人生得意/须尽欢/, 莫使金樽/空对月./" +translation = "人生得意之时应当纵情欢乐, 莫要让这金杯无酒空对明月" +keyword_note = { "得意" = "适意高兴的时候", "金樽" = "精美的酒器" } + +["天生我材必有用, 千金散尽还复来."] +note = [] +content = "天生我材/必有用/, 千金散尽/还复来./" +translation = "每个人只要生下来就必有用处, 黄金千两一挥而尽还能够再来" +keyword_note = {} + +["烹羊宰牛且为乐, 会须一饮三百杯."] +note = [] +content = "烹羊宰牛/且为乐/, 会须一饮/三百杯./" +translation = "我们烹羊宰牛姑且作乐, 一次痛饮三百杯也不为多" +keyword_note = { "会须" = "应当" } + +["岑夫子, 丹丘生, 将进酒, 杯莫停."] +note = [] +content = "岑夫子/, 丹丘生/, 将进酒/, 杯莫停./" +translation = "岑夫子和丹丘生啊! 快喝吧! 别停下杯子" +keyword_note = { "岑夫子" = "指岑勋", "丹丘生" = "元丹丘", "将进酒" = "请饮酒", "杯莫停" = "别停下杯子" } + +["与君歌一曲, 请君为我倾耳听."] +note = [] +content = "与君歌/一曲/, 请君为我/倾耳听./" +translation = "我为你们高歌一曲, 请你们都来侧耳倾听" +keyword_note = { "与君" = "给你们, 为你们", "倾耳听" = "侧耳倾听" } + +["钟鼓馔玉不足贵, 但愿长醉不复醒."] +note = [] +content = "钟鼓馔玉/不足贵/, 但愿长醉/不复醒./" +translation = "钟鸣馔食的豪华生活有何珍贵, 只希望长驻醉乡不再清醒" +keyword_note = { "钟鼓" = "富贵人家宴会中奏乐使用的乐器", "馔玉" = "美好的食物", "不复醒" = "不再清醒" } + +["古来圣贤皆寂寞, 惟有饮者留其名."] +note = [] +content = "古来圣贤/皆寂寞/, 惟有饮者/留其名./" +translation = "自古以来圣贤这两种酒是寂寞的, 只有那喝酒的人才能够留传美名" +keyword_note = {} + +["陈王昔时宴平乐, 斗酒十千恣欢谑."] +note = [] +content = "陈王昔时/宴平乐/, 斗酒十千/恣欢谑./" +translation = "陈王曹植当年宴设乐平关你可知道, 斗酒万钱也豪饮宾主尽情欢乐" +keyword_note = { "陈王" = "指陈思王曹植", "平乐" = "观名", "恣" = "放纵, 无拘无束", "谑" = "玩笑" } + +["主人何为言少钱, 径须沽取对君酌."] +note = [] +content = "主人何为/言少钱/, 径须沽取/对君酌./" +translation = "主人呀, 你为何说我的钱不多? 你只管端出酒来让我喝" +keyword_note = { "径须" = "干脆, 只管", "沽" = "买酒" } + +["五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!"] +note = [] +content = "五花马/、千金裘/, 呼儿将出/换美酒/, 与尔同销/万古愁!/" +translation = "五花千里马, 千金狐皮裘, 快叫那侍儿拿去换美酒, 我和你们共同消解这万古愁" +keyword_note = { "五花马" = "指名贵的马", "千金裘" = "珍贵的皮衣", "销" = "同'消'" } + +["屈原列传"] +note = [] +content = "屈原列传/" +translation = "屈原列传" +keyword_note = {} + +["屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》."] +note = [] +content = "屈平/疾/王听之/不聪也/, 谗谄之/蔽明也/, 邪曲之/害公也/, 方正之/不容也/, 故/忧愁/幽思/而作/《离骚》./" +translation = "屈原痛心楚怀王听信谗言, 不能分辨是非, 谄媚国君的人遮蔽了楚怀王的明见, 品行不正的小人损害国家, 端方正直的人不被昏君谗臣所容, 所以忧愁深思, 就创作了《离骚》. " +keyword_note = { "疾" = "痛心", "不聪" = "不能分辨是非", "谗谄" = "说人坏话、奉承献媚", "蔽明" = "蒙蔽明见", "邪曲" = "品行不正", "方正" = "端方正直" } + +["离骚者, 犹离忧也."] +note = [] +content = "离骚者/, 犹/离忧也./" +translation = "'离骚', 就是遭遇忧愁的意思. " +keyword_note = { "离忧" = "遭遇忧患" } + +["夫天者, 人之始也; 父母者, 人之本也."] +note = [] +content = "夫/天者/, 人之/始也/; 父母者/, 人之/本也./" +translation = "上天, 是人的原始; 父母, 是人的根本. " +keyword_note = {} + +["人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也."] +note = [] +content = "人穷/则反本/, 故/劳苦/倦极/, 未尝/不呼天也/; 疾痛/惨怛/, 未尝/不呼/父母也./" +translation = "人处境困难时, 总是要追念上天和父母 (希望给以援助) , 所以劳累疲倦时, 没有不呼叫上天的; 病痛和内心悲伤时, 没有不呼叫父母的. " +keyword_note = { "人穷则反本" = "人困窘没有出路, 就会追念根本", "倦极" = "疲倦困苦", "惨怛" = "忧伤, 悲痛" } + +["屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣."] +note = [] +content = "屈平/正道/直行/, 竭忠/尽智/以事/其君/, 谗人/间之/, 可谓/穷矣./" +translation = "屈原使 (自己) 道德端正, 使 (自己) 品行正直, 竭尽忠心用尽智慧来侍奉他的国君, 却被小人离间, 可以说处境很困难. " +keyword_note = {} + +["信而见疑, 忠而被谤, 能无怨乎?"] +note = [] +content = "信而/见疑/, 忠而/被谤/, 能无/怨乎?/" +translation = "诚信而被怀疑, 尽忠却被诽谤, 能没有怨愤吗? " +keyword_note = { "信而见疑" = "诚实不欺却被怀疑" } + +["屈平之作《离骚》, 盖自怨生也."] +note = [] +content = "屈平/之作/《离骚》/, 盖自/怨生也./" +translation = "屈原作《离骚》, 大概是自己的怨愤所引起的. " +keyword_note = {} + +["《国风》好色而不淫, 《小雅》怨诽而不乱."] +note = [] +content = "《国风》/好色/而不淫/, 《小雅》/怨诽/而不乱./" +translation = "《诗经》中的《国风》, 写男女恋情而不过度, 《小雅》有怨刺之言, 但不直接愤怒. " +keyword_note = { "淫" = "过度、无节制" } + +["若《离骚》者, 可谓兼之矣."] +note = [] +content = "若/《离骚》者/, 可谓/兼之矣./" +translation = "屈原的《离骚》诗, 则两者之美兼而有之. " +keyword_note = {} + +["上称帝喾, 下道齐桓, 中述汤武, 以刺世事."] +note = [] +content = "上称/帝喾/, 下道/齐桓/, 中述/汤/武/, 以刺/世事./" +translation = " (他) 远古提到帝喾, 近古提到齐桓公, 中古提到商汤、周武王, 利用古代帝王这些事用来讽刺当世社会. " +keyword_note = { "帝喾" = "传说中的五帝之一", "汤武" = "商汤、周武王" } + +["明道德之广崇, 治乱之条贯, 靡不毕见."] +note = [] +content = "明/道德之/广崇/, 治乱之/条贯/, 靡不/毕见./" +translation = "阐明道德的广大崇高, 治乱的条理, 没有不全表现出来的. " +keyword_note = { "广崇" = "广大崇高", "条贯" = "条理", "靡" = "无, 没有" } + +["其文约, 其辞微, 其志洁, 其行廉."] +note = [] +content = "其文/约/, 其辞/微/, 其志/洁/, 其行/廉./" +translation = "他的文章简约, 语言含蓄, 他的志趣高洁, 行为正直. " +keyword_note = { "约" = "简约", "微" = "含蓄隐晦" } + +["其称文小而其指极大, 举类迩而见义远."] +note = [] +content = "其称文/小而/其指/极大/, 举类/迩而/见义/远./" +translation = "就其文字来看, 不过是寻常事情, 但是它的旨趣是极大的, 列举的是近事, 而表达的意思却十分深远. " +keyword_note = { "指" = "同'旨', 意旨", "迩" = "近" } + +["其志洁, 故其称物芳; 其行廉, 故死而不容."] +note = [] +content = "其志/洁/, 故其/称物/芳/; 其行/廉/, 故死/而不容./" +translation = "他的志趣高洁, 所以作品中多用美人芳草作比喻; 他的行为正直, 所以至死不容于世. " +keyword_note = { "称物芳" = "多用美人香草来比喻" } + +["自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也."] +note = [] +content = "自疏/濯淖/污泥/之中/, 蝉蜕/于/浊秽/, 以/浮游/尘埃/之外/, 不获/世之/滋垢/, 皭然/泥而/不滓者/也./" +translation = "他自动地远离污泥浊水, 像蝉脱壳那样摆脱污秽环境, 以便超脱世俗之外, 不沾染尘世的污垢, 出于污泥而不染, 依旧保持高洁的品德. " +keyword_note = { "自疏" = "自动地远离", "濯淖污泥" = "污浊", "蝉蜕" = "像蝉脱壳那样摆脱", "浊秽" = "污秽的境地", "滋垢" = "尘世的污垢", "皭然" = "清白、洁净的样子", "泥而不滓" = "出淤泥而不染" } + +["推此志也, 虽与日月争光可也."] +note = [] +content = "推/此志也/, 虽与/日月/争光/可也./" +translation = "推赞这种志行, 即使同日月争光都可以. " +keyword_note = { "推" = "推赞, 推许" } + +["山居秋暝"] +note = [] +content = "山居秋暝/" +translation = "山居秋暝" +keyword_note = {} + +["空山新雨后, 天气晚来秋."] +note = [] +content = "空山/新雨/后/, 天气/晚来/秋./" +translation = "新雨过后山谷里空旷清新, 初秋傍晚的天气特别凉爽. " +keyword_note = { "空山" = "空旷, 空寂的山野", "新" = "刚刚", "晚来秋" = "初秋傍晚的天气特别凉爽" } + +["明月松间照, 清泉石上流."] +note = [] +content = "明月/松间/照/, 清泉/石上/流./" +translation = "明月映照着幽静的松林间, 清澈泉水在山石上淙淙淌流. " +keyword_note = { "清泉石上流" = "写的正是雨后的景色" } + +["竹喧归浣女, 莲动下渔舟."] +note = [] +content = "竹喧/归/浣女/, 莲动/下/渔舟./" +translation = "竹林里传来喧闹声, 知是少女洗衣归来, 莲叶轻摇知是上游荡下轻舟. " +keyword_note = { "竹喧" = "竹林中笑语喧哗", "喧" = "笑语喧哗", "浣女" = "洗衣服的女子", "浣" = "洗涤衣物" } + +["随意春芳歇, 王孙自可留."] +note = [] +content = "随意/春芳/歇/, 王孙/自可/留./" +translation = "任凭春天的花草消失, 眼前的秋景足以让我流连久居. " +keyword_note = { "随意" = "任凭", "春芳" = "春天的花草", "歇" = "消散, 消失", "王孙" = "原指贵族子弟, 此处指诗人自己", "留" = "居" } + +["师说"] +note = [] +content = "师说/" +translation = "师说" +keyword_note = {} + +["古之学者必有师."] +note = ['学者: 求学的人'] +content = "古之/学者/必有/师./" +translation = "古代求学的人一定有老师" +keyword_note = { "学者" = "求学的人" } + +["师者, 所以传道受业解惑也."] +note = ["受: 通'授', 传授, 讲授"] +content = "师者/, 所以/传道/受业/解惑/也./" +translation = "老师是传授道理, 教授学业, 解决疑难问题的人" +keyword_note = { "传道" = "传授道理", "受业" = "教授学业", "解惑" = "解决疑难问题", "受" = "通'授', 传授" } + +["人非生而知之者, 孰能无惑?"] +note = [] +content = "人非/生而/知之/者/, 孰能/无惑?/" +translation = "人不是生下来就懂得道理的, 谁能没有疑惑" +keyword_note = { "孰能" = "谁能" } + +["惑而不从师, 其为惑也, 终不解矣."] +note = [] +content = "惑而/不从/师/, 其/为惑/也/, 终/不解/矣./" +translation = "有疑惑却不跟从老师学习, 他所存在的疑惑, 就始终不能解决" +keyword_note = { "终" = "始终" } + +["生乎吾前, 其闻道也固先乎吾, 吾从而师之;"] +note = [] +content = "生乎/吾前/, 其/闻道/也/固/先乎/吾/, 吾/从而/师之;/" +translation = "在我之前出生的人, 他懂得道理本来就比我早, 我跟从他, 拜他为师" +keyword_note = { "闻道" = "懂得道理", "固" = "本来", "师之" = "以他为师" } + +["生乎吾后, 其闻道也亦先乎吾, 吾从而师之."] +note = [] +content = "生乎/吾后/, 其/闻道/也/亦/先乎/吾/, 吾/从而/师之./" +translation = "在我之后出生的人, 他懂得道理如果也比我早, 我也跟从他学习, 把他当作老师" +keyword_note = { "亦" = "也" } + +["吾师道也, 夫庸知其年之先后生于吾乎?"] +note = [] +content = "吾/师道/也/, 夫/庸知/其年/之/先后/生于/吾乎?/" +translation = "我学习的是道理, 哪里管他的年龄比我大还是比我小呢" +keyword_note = { "师道" = "学习道理", "庸知" = "哪里管" } + +["是故无贵无贱, 无长无少, 道之所存, 师之所存也."] +note = [] +content = "是故/无贵/无贱/, 无长/无少/, 道之/所存/, 师之/所存/也./" +translation = "因此, 不论地位显贵还是地位低下, 不论年长年少, 道理存在的地方, 就是老师存在的地方" +keyword_note = { "是故" = "因此", "所存" = "存在的地方" } + +["嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!"] +note = [] +content = "嗟乎!/ 师道/之/不传/也/久矣!/ 欲人/之/无惑/也/难矣!/" +translation = "唉! 从师学习的风尚没有流传已经很久了, 想要人们没有疑惑很难呐" +keyword_note = { "嗟乎" = "感叹词, 唉", "师道" = "从师学习的风尚" } + +["古之圣人, 其出人也远矣, 犹且从师而问焉;"] +note = [] +content = "古之/圣人/, 其/出人/也/远矣/, 犹且/从师/而问/焉;/" +translation = "古代的圣人, 他们超过一般人很远了, 尚且跟从老师向老师请教" +keyword_note = { "出人" = "超出一般人", "犹且" = "尚且" } + +["今之众人, 其下圣人也亦远矣, 而耻学于师."] +note = [] +content = "今之/众人/, 其/下/圣人/也/亦/远矣/, 而/耻学/于师./" +translation = "现在的一般人, 他们跟圣人相比相差很远了, 却以向老师学为羞耻" +keyword_note = { "众人" = "一般人", "下" = "低于, 不如", "耻学于师" = "以向老师学习为耻" } + +["是故圣益圣, 愚益愚."] +note = [] +content = "是故/圣/益圣/, 愚/益愚./" +translation = "所以圣人就更加圣明, 愚人就更加愚昧" +keyword_note = { "益" = "更加" } + +["圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!"] +note = [] +content = "圣人/之/所以/为圣/, 愚人/之/所以/为愚/, 其/皆/出于/此乎!/" +translation = "圣人之所以成为圣人, 愚人之所以成为愚人, 大概都是这个原因引起的吧" +keyword_note = { "所以" = "...的原因", "其" = "大概" } + +["爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣."] +note = [] +content = "爱/其子/, 择师/而教/之;/ 于/其身/也/, 则/耻师/焉/, 惑矣./" +translation = "众人喜爱他们的孩子, 选择老师教育孩子; 他们自己呢, 却以从师学习为耻, 这真是糊涂啊" +keyword_note = { "其身" = "他们自己", "耻师" = "以从师为耻", "惑" = "糊涂" } + +["彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也."] +note = ['句读: 也叫句逗. 古代称文辞意尽处为句, 语意未尽而须停顿处为读'] +content = "彼/童子/之师/, 授之/书/而习/其/句读/者/, 非/吾/所谓/传其道/解其惑/者也./" +translation = "那孩子的老师, 教他们读书, 学习书中的文句, 并不是我所说的给人传授道理, 给人解释疑惑的老师" +keyword_note = { "句读" = "文句停顿", "所谓" = "所说的" } + +["句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也."] +note = ["不: 通'否', 表否定"] +content = "句读/之/不知/, 惑之/不解/, 或/师焉/, 或/不焉/, 小学/而/大遗/, 吾/未见/其明/也./" +translation = "不理解文句, 疑惑得不到解决, 有的向老师学习, 有的却不向老师求教, 小的方面学习, 大的方面却放弃了, 我看不出他们有什么明智的呢" +keyword_note = { "或" = "有的", "不" = "通'否'", "小学" = "小的方面学习", "大遗" = "大的方面放弃" } + +["巫医乐师百工之人, 不耻相师."] +note = ['巫医: 古代用祝祷、占卜等迷信方法或兼用药物医治疾病为业的人', '百工: 泛指手工业者'] +content = "巫医/乐师/百工/之人/, 不耻/相师./" +translation = "医生, 乐师及各种工匠, 不以互相学习为耻" +keyword_note = { "巫医" = "医生", "乐师" = "音乐师", "百工" = "各种工匠", "不耻相师" = "不以互相学习为耻" } + +["士大夫之族, 曰师曰弟子云者, 则群聚而笑之."] +note = [] +content = "士大夫/之族/, 曰师/曰弟子/云者/, 则/群聚/而笑/之./" +translation = "士大夫这类人中, 如有人称人家为老师, 称自己为学生, 这些人就聚集在一起嘲笑他" +keyword_note = { "族" = "类", "云者" = "如此说" } + +["问之, 则曰: “彼与彼年相若也, 道相似也."] +note = [] +content = "问之/, 则曰/: “彼与/彼年/相若/也/, 道/相似/也./" +translation = "问那些嘲笑者, 他们就说: 那个人与某人年龄相近, 修养和学业也差不多" +keyword_note = { "相若" = "相近", "相似" = "差不多" } + +["位卑则足羞, 官盛则近谀.”"] +note = [] +content = "位卑/则/足羞/, 官盛/则/近谀/.”/" +translation = "以地位低的人为师, 足以感到羞愧, 称官位高的人为师就近于谄媚" +keyword_note = { "位卑" = "地位低", "足羞" = "足以羞愧", "官盛" = "官位高", "近谀" = "近于谄媚" } + +["呜呼! 师道之不复, 可知矣."] +note = [] +content = "呜呼!/ 师道/之/不复/, 可知/矣./" +translation = "啊! 从师学习的风尚不能恢复, 由此就可以知道了" +keyword_note = { "不复" = "不能恢复" } + +["巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!"] +note = ['不齿: 不屑与之同列, 表示鄙视'] +content = "巫医/乐师/百工/之人/, 君子/不齿/, 今/其智/乃/反不能/及/, 其/可怪/也欤!/" +translation = "医生、乐师及各种工匠, 士大夫之类的人是不屑与他们为伍的, 现在士大夫们的智慧反而不如他们. 难道值得奇怪吗" +keyword_note = { "君子" = "士大夫", "不齿" = "不屑为伍", "乃" = "反而", "及" = "如" } + +["圣人无常师. 孔子师郯子、苌弘、师襄、老聃."] +note = ['郯子: 春秋时郯国国君', '苌弘: 周敬王大夫', '师襄: 鲁国乐官', '老聃: 即老子'] +content = "圣人/无常/师./ 孔子/师/郯子/、苌弘/、师襄/、老聃./" +translation = "圣人没有固定的老师, 孔子曾经以郯子、苌弘、师襄、老聃为师" +keyword_note = { "常师" = "固定的老师" } + +["郯子之徒, 其贤不及孔子."] +note = [] +content = "郯子/之徒/, 其/贤/不及/孔子./" +translation = "郯子这一类人, 他们的道德才能不如孔子" +keyword_note = { "之徒" = "这一类人", "贤" = "道德才能", "不及" = "不如" } + +["孔子曰: 三人行, 则必有我师."] +note = [] +content = "孔子/曰/: 三人/行/, 则/必有/我师./" +translation = "孔子说: 几个人走在一起, 其中就一定有我的老师" +keyword_note = { "三人行" = "几个人一起走" } + +["是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已."] +note = [] +content = "是故/弟子/不必/不如/师/, 师/不必/贤于/弟子/, 闻道/有/先后/, 术业/有/专攻/, 如是/而已./" +translation = "因此学生不一定不如老师, 老师也不一定比弟子强, 听闻道理有先有后, 学问和技艺上各有各的主攻方向, 像这样罢了" +keyword_note = { "不必" = "不一定", "贤于" = "比...强", "术业" = "学问技艺", "专攻" = "专门研究", "而已" = "罢了" } + +["李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余."] +note = ['六艺经传: 六经的经文和传文'] +content = "李氏/子蟠/, 年/十七/, 好/古文/, 六艺/经传/皆/通习/之/, 不拘/于时/, 学/于余./" +translation = "李蟠, 十七岁, 爱好古文, 六经的经文和传文都普遍学习了, 不被世俗的限制, 向我学习" +keyword_note = { "好" = "爱好", "古文" = "先秦文章", "六艺经传" = "六经的经文和传文", "通习" = "普遍学习", "不拘于时" = "不被时俗限制" } + +["余嘉其能行古道, 作《师说》以贻之."] +note = [] +content = "余/嘉/其/能行/古道/, 作/《师说》/以/贻之./" +translation = "我赞许他能遵行古人从师学习的风尚, 特别写了这篇《师说》来赠给他" +keyword_note = { "嘉" = "赞许", "古道" = "古人风尚", "贻" = "赠送" } + +["归去来兮辞"] +note = [] +content = "归去来兮辞/" +translation = "归去来兮辞" +keyword_note = {} + +["归去来兮, 田园将芜胡不归?"] +note = [] +content = "归去/来兮/, 田园/将芜/胡不归?/" +translation = "回家去吧! 田园快要荒芜了, 为什么不回去呢? " +keyword_note = { "归去来兮" = "回去吧", "将芜" = "快要荒芜", "胡不归" = "为什么不回去" } + +["既自以心为形役, 奚惆怅而独悲?"] +note = [] +content = "既/自以/心为/形役/, 奚/惆怅/而/独悲?/" +translation = "既然自己使心为身所驱役, 又何必怅惘而独自悲戚呢? " +keyword_note = { "心为形役" = "心神被形体役使", "奚" = "为什么", "惆怅" = "怅惘", "独悲" = "独自悲戚" } + +["悟已往之不谏, 知来者之可追."] +note = [] +content = "悟/已往/之/不谏/, 知/来者/之/可追./" +translation = "我已明悟过去的错误已经不可挽回, 未来的事还来得及补救" +keyword_note = { "已往" = "过去", "不谏" = "不可挽回", "来者" = "未来的事", "可追" = "可以补救" } + +["实迷途其未远, 觉今是而昨非."] +note = [] +content = "实/迷途/其/未远/, 觉/今是/而/昨非./" +translation = "我确实走入了迷途, 但还不算太远, 已觉悟如今的做法是对的, 而曾经的行为是错的" +keyword_note = { "迷途" = "走入迷途", "其" = "但", "未远" = "不算太远", "今是" = "现在正确", "昨非" = "过去错误" } + +["舟遥遥以轻飏, 风飘飘而吹衣."] +note = [] +content = "舟/遥遥/以/轻飏/, 风/飘飘/而/吹衣./" +translation = "船在水面上轻轻地飘荡着前进, 微风吹拂着衣裳, 衣袂翩翩" +keyword_note = { "遥遥" = "飘摇放流", "轻飏" = "轻轻地飘荡", "飘飘" = "微风吹拂" } + +["问征夫以前路, 恨晨光之熹微."] +note = [] +content = "问/征夫/以/前路/, 恨/晨光/之/熹微./" +translation = "向行人打听前面的路程, 遗憾的是天刚刚放亮" +keyword_note = { "征夫" = "行人", "前路" = "前面的路程", "恨" = "遗憾", "熹微" = "天色微明" } + +["乃瞻衡宇, 载欣载奔."] +note = [] +content = "乃/瞻/衡宇/, 载欣/载奔./" +translation = "刚刚看到自己简陋的家门, 心中欣喜, 奔跑过去" +keyword_note = { "乃" = "刚刚", "瞻" = "看见", "衡宇" = "横木为门的简陋房屋", "载欣载奔" = "一边高兴一边奔跑" } + +["僮仆欢迎, 稚子候门."] +note = [] +content = "僮仆/欢迎/, 稚子/候门./" +translation = "家中童仆欢喜地前来迎接, 孩子们守候在门前" +keyword_note = { "僮仆" = "童仆", "欢迎" = "欢喜迎接", "稚子" = "幼儿", "候门" = "在门前等候" } + +["三径就荒, 松菊犹存."] +note = [] +content = "三径/就荒/, 松菊/犹存./" +translation = "院子里的小路快要荒芜了, 松菊还长在那里" +keyword_note = { "三径" = "院中小路", "就荒" = "快要荒芜", "犹存" = "还存在" } + +["携幼入室, 有酒盈樽."] +note = [] +content = "携幼/入室/, 有酒/盈樽./" +translation = "带着孩子们进了屋, 美酒已经盛满了酒樽" +keyword_note = { "携幼" = "带着孩子", "入室" = "进屋", "盈樽" = "满杯" } + +["引壶觞以自酌, 眄庭柯以怡颜."] +note = [] +content = "引/壶觞/以/自酌/, 眄/庭柯/以/怡颜./" +translation = "我端起酒壶酒杯自斟自饮, 看看院子里的树木, 觉得很愉快" +keyword_note = { "引" = "端起", "壶觞" = "酒壶酒杯", "自酌" = "自斟自饮", "眄" = "随便看看", "庭柯" = "院子里的树木", "怡颜" = "使面容愉快" } + +["倚南窗以寄傲, 审容膝之易安."] +note = [] +content = "倚/南窗/以/寄傲/, 审/容膝/之/易安./" +translation = "倚着南窗寄托我的傲世之情, 深知这狭小之地容易使我心安" +keyword_note = { "寄傲" = "寄托傲世之情", "审" = "深知", "容膝" = "仅能容膝的小屋", "易安" = "容易安适" } + +["园日涉以成趣, 门虽设而常关."] +note = [] +content = "园/日涉/以/成趣/, 门/虽设/而/常关./" +translation = "天天到园里行走, 自成一种乐趣, 小园的门经常地关闭着" +keyword_note = { "日涉" = "天天走到", "成趣" = "自成乐趣", "虽设" = "虽然设置", "常关" = "经常关闭" } + +["策扶老以流憩, 时矫首而遐观."] +note = [] +content = "策/扶老/以/流憩/, 时/矫首/而/遐观./" +translation = "拄着拐杖出去走走, 随时随地休息, 时时抬头望着远方 (的天空) " +keyword_note = { "策" = "拄着", "扶老" = "手杖", "流憩" = "到处走走歇歇", "矫首" = "抬头", "遐观" = "远望" } + +["云无心以出岫, 鸟倦飞而知还."] +note = [] +content = "云/无心/以/出岫/, 鸟/倦飞/而/知还./" +translation = "云气自然而然地从山峰飘浮而出, 倦飞的鸟儿也知道飞回巢中" +keyword_note = { "无心" = "自然而然", "出岫" = "从山中冒出", "倦飞" = "飞累了", "知还" = "知道返回" } + +["景翳翳以将入, 抚孤松而盘桓."] +note = [] +content = "景/翳翳/以/将入/, 抚/孤松/而/盘桓./" +translation = "日光暗淡, 太阳快要落下去了, 我手抚着孤松徘徊着不忍离去" +keyword_note = { "景" = "日光", "翳翳" = "阴暗的样子", "将入" = "快要落下", "抚" = "手抚", "孤松" = "孤立的松树", "盘桓" = "徘徊" } + +["归去来兮, 请息交以绝游."] +note = [] +content = "归去/来兮/, 请/息交/以/绝游./" +translation = "回家去吧! 请让我同外界断绝交游" +keyword_note = { "息交" = "停止交往", "绝游" = "断绝交游" } + +["世与我而相违, 复驾言兮焉求?"] +note = [] +content = "世/与我/而/相违/, 复/驾言/兮/焉求?/" +translation = "世事与我所想的相违背, 还要驾车出去追求什么? " +keyword_note = { "相违" = "相违背", "驾言" = "驾车出游", "焉求" = "追求什么" } + +["悦亲戚之情话, 乐琴书以消忧."] +note = [] +content = "悦/亲戚/之/情话/, 乐/琴书/以/消忧./" +translation = "以亲人间的知心话为愉悦, 以弹琴读书为乐来消除忧愁" +keyword_note = { "悦" = "以...为愉悦", "情话" = "知心话", "乐" = "以...为乐", "琴书" = "弹琴读书", "消忧" = "消除忧愁" } + +["农人告余以春及, 将有事于西畴."] +note = [] +content = "农人/告余/以/春及/, 将/有事/于/西畴./" +translation = "农夫告诉我春天到了, 西边田野里要开始耕种了" +keyword_note = { "告余" = "告诉我", "春及" = "春天到了", "有事" = "指耕种之事", "西畴" = "西边田野" } + +["或命巾车, 或棹孤舟."] +note = [] +content = "或/命/巾车/, 或/棹/孤舟./" +translation = "有时驾着有布篷的小车, 有时划着一条小船" +keyword_note = { "或" = "有时", "命" = "叫上", "巾车" = "有帷的小车", "棹" = "划船" } + +["既窈窕以寻壑, 亦崎岖而经丘."] +note = [] +content = "既/窈窕/以/寻壑/, 亦/崎岖/而/经丘./" +translation = "有时经过幽深曲折的山谷, 有时走过高低不平的山路" +keyword_note = { "窈窕" = "幽深曲折", "寻壑" = "经过山谷", "崎岖" = "高低不平", "经丘" = "走过山路" } + +["木欣欣以向荣, 泉涓涓而始流."] +note = [] +content = "木/欣欣/以/向荣/, 泉/涓涓/而/始流./" +translation = "草木茂盛, 细水缓流" +keyword_note = { "欣欣" = "草木茂盛", "向荣" = "滋长茂盛", "涓涓" = "水流细微", "始流" = "开始流动" } + +["善万物之得时, 感吾生之行休."] +note = [] +content = "善/万物/之/得时/, 感/吾生/之/行休./" +translation = " (我) 羡慕自然界的万物一到春天便及时生长茂盛, 感叹自己的一生行将结束" +keyword_note = { "善" = "羡慕", "得时" = "及时生长", "感" = "感叹", "行休" = "行将结束" } + +["已矣乎! 寓形宇内复几时?"] +note = [] +content = "已矣乎/! / 寓形/宇内/复/几时?/" +translation = "算了吧! 活在世上还能有多久? " +keyword_note = { "已矣乎" = "算了吧", "寓形宇内" = "活在世上", "复几时" = "还能有多久" } + +["曷不委心任去留?"] +note = [] +content = "曷不/委心/任/去留?/" +translation = "为什么不随心所欲, 听凭自然的生死? " +keyword_note = { "曷不" = "为什么不", "委心" = "随心所欲", "任去留" = "听凭生死" } + +["胡为乎遑遑欲何之?"] +note = [] +content = "胡为乎/遑遑/欲/何之?/" +translation = "为什么心神不定, 想要到哪里去呢? " +keyword_note = { "胡为乎" = "为什么", "遑遑" = "心神不定", "欲何之" = "想要到哪里去" } + +["富贵非吾愿, 帝乡不可期."] +note = [] +content = "富贵/非/吾愿/, 帝乡/不可/期./" +translation = "富贵不是我所求, 修成神仙是没有希望的" +keyword_note = { "非吾愿" = "不是我的愿望", "帝乡" = "仙境", "不可期" = "不可企及" } + +["怀良辰以孤往, 或植杖而耘耔."] +note = [] +content = "怀/良辰/以/孤往/, 或/植杖/而/耘耔./" +translation = "爱惜那良辰美景我独自去欣赏, 有时放下手杖, 拿起农具除草培土" +keyword_note = { "怀" = "爱惜", "良辰" = "美好时光", "孤往" = "独自外出", "植杖" = "放下手杖", "耘耔" = "除草培土" } + +["登东皋以舒啸, 临清流而赋诗."] +note = [] +content = "登/东皋/以/舒啸/, 临/清流/而/赋诗./" +translation = "登上东边的山坡我放声呼啸, 傍着清清的溪流把诗歌吟唱" +keyword_note = { "东皋" = "东边高地", "舒啸" = "放声长啸", "临" = "面对", "清流" = "清清溪流", "赋诗" = "吟诗" } + +["聊乘化以归尽, 乐夫天命复奚疑!"] +note = [] +content = "聊/乘化/以/归尽/, 乐夫/天命/复/奚疑!/" +translation = "姑且顺随自然的变化, 走到生命的尽头. 乐天安命, 还有什么可疑虑的呢? " +keyword_note = { "聊" = "姑且", "乘化" = "顺随自然变化", "归尽" = "走到生命尽头", "乐夫天命" = "乐天安命", "复奚疑" = "还有什么疑虑" } + +["归园田居·其一"] +note = [] +content = "归园田居·其一/" +translation = "归园田居·其一" +keyword_note = {} + +["少无适俗韵, 性本爱丘山"] +note = [] +content = "少/无/适俗/韵/, 性/本/爱/丘山/" +translation = "年少时就没有适应世俗的性情, 生来就喜爱大自然的风物" +keyword_note = { "少" = "指少年时代", "适俗" = "适应世俗", "韵" = "气质、情致. 一作'愿'", "丘山" = "指山林" } + +["误落尘网中, 一去三十年"] +note = ['误落 一作: 误入'] +content = "误落/尘网/中/, 一去/三十年/" +translation = "错误地陷落到世俗的种种束缚中, 转眼间远离田园已十余年" +keyword_note = { "尘网" = "世俗的种种束缚", "三十年" = "有人认为是'十三年'之误 (陶渊明做官十三年) . 一说, 此处是三又十年之意" } + +["羁鸟恋旧林, 池鱼思故渊"] +note = [] +content = "羁鸟/恋/旧林/, 池鱼/思/故渊/" +translation = "笼中之鸟怀念以前生活的树林, 池塘之鱼思念旧日嬉戏的深潭" +keyword_note = { "羁鸟" = "笼中之鸟", "恋" = "一作'眷'", "池鱼" = "池塘之鱼", "旧林、故渊" = "借喻自己怀恋旧居" } + +["开荒南野际, 守拙归园田"] +note = [] +content = "开荒/南野/际/, 守拙/归/园田/" +translation = "我愿到南面的田野去开荒, 依着拙朴的心性回家耕种田园" +keyword_note = { "南野" = "南面的田野. 一作'南亩', 指农田", "野" = "一作'亩'", "际" = "间", "守拙" = "意思是不随波逐流, 固守节操" } + +["方宅十余亩, 草屋八九间"] +note = [] +content = "方宅/十余/亩/, 草屋/八九/间/" +translation = "围绕着房宅方圆有十余亩地, 还有八九间茅草屋" +keyword_note = { "方宅" = "宅地方圆. 一说, '方'通'旁'" } + +["榆柳荫后檐, 桃李罗堂前"] +note = [] +content = "榆柳/荫/后檐/, 桃李/罗/堂前/" +translation = "生长茂盛的榆树柳树遮蔽了后屋檐, 桃树李树整齐的罗列在屋前" +keyword_note = { "荫" = "遮蔽", "罗" = "罗列" } + +["暧暧远人村, 依依墟里烟"] +note = [] +content = "暧暧/远人/村/, 依依/墟里/烟/" +translation = "远处邻村的屋舍依稀可见, 村落上方轻柔而缓慢的飘升着袅袅炊烟" +keyword_note = { "暧暧" = "迷蒙隐约的样子", "依依" = "轻柔而缓慢的飘升", "墟里" = "村落" } + +["狗吠深巷中, 鸡鸣桑树颠"] +note = [] +content = "狗吠/深巷/中/, 鸡鸣/桑树/颠/" +translation = "深深的街巷中传来了几声狗吠, 桑树顶端有雄鸡不停啼鸣" +keyword_note = { "颠" = "顶端" } + +["户庭无尘杂, 虚室有余闲"] +note = [] +content = "户庭/无/尘杂/, 虚室/有/余闲/" +translation = "庭院内没有尘俗杂事烦扰, 静室里有的是安适悠闲" +keyword_note = { "户庭" = "门户庭院", "尘杂" = "尘俗杂事", "虚室" = "空室, 比喻心境", "余闲" = "闲暇" } + +["久在樊笼里, 复得返自然"] +note = [] +content = "久在/樊笼/里/, 复得/返/自然/" +translation = "久久困于官场生活, 毫无自由, 我今日总算又归耕园田" +keyword_note = { "樊笼" = "蓄鸟工具, 这里比喻官场生活. 樊, 藩篱, 栅栏", "返自然" = "指归耕园田" } + +["念奴娇·赤壁怀古"] +note = [] +content = "念奴娇·赤壁怀古/" +translation = "念奴娇·赤壁怀古" +keyword_note = {} + +["大江东去, 浪淘尽, 千古风流人物."] +note = [] +content = "大江/东去/, 浪/淘尽/, 千古/风流/人物./" +translation = "滚滚长江向东奔流而去, 千百年来奔腾不息的滔滔巨浪淘尽了多少杰出的英雄人物" +keyword_note = { "大江" = "指长江", "淘" = "冲洗, 冲刷", "风流人物" = "指杰出的历史名人" } + +["故垒西边, 人道是, 三国周郎赤壁."] +note = [] +content = "故垒/西边/, 人道是/, 三国/周郎/赤壁./" +translation = "旧日营垒的西边, 有人说, 那儿是三国时周瑜大破曹军的赤壁" +keyword_note = { "故垒" = "过去遗留下来的营垒", "周郎" = "指三国时吴国名将周瑜, 字公瑾" } + +["乱石穿空, 惊涛拍岸, 卷起千堆雪."] +note = ['穿空 一作: 崩云'] +content = "乱石/穿空/, 惊涛/拍岸/, 卷起/千堆雪./" +translation = "只见陡峭纷乱的岩壁耸入云霄, 汹涌澎湃的巨浪拍打着江岸, 卷起无数堆雪白的浪花" +keyword_note = { "雪" = "比喻浪花" } + +["江山如画, 一时多少豪杰."] +note = [] +content = "江山/如画/, 一时/多少/豪杰./" +translation = "雄壮的江山奇丽如画, 一时间涌现了多少英雄豪杰" +keyword_note = { "豪杰" = "英雄豪杰" } + +["遥想公瑾当年, 小乔初嫁了, 雄姿英发."] +note = [] +content = "遥想/公瑾/当年/, 小乔/初嫁了/, 雄姿/英发./" +translation = "我不禁遥想起当年的周公瑾, 美丽的小乔刚嫁给他, 英姿雄健风度翩翩神采照人" +keyword_note = { "公瑾" = "周瑜字公瑾", "小乔" = "周瑜之妻", "雄姿英发" = "谓周瑜体貌不凡, 言谈卓绝" } + +["羽扇纶巾, 谈笑间, 樯橹灰飞烟灭."] +note = ['樯橹 一作: 强虏'] +content = "羽扇/纶巾/, 谈笑间/, 樯橹/灰飞/烟灭./" +translation = "手摇羽扇, 头戴纶巾, 谈笑之间, 就将曹军的战船烧得灰飞烟灭" +keyword_note = { "羽扇纶巾" = "古代儒将的便装打扮", "樯橹" = "这里代指曹操的水军战船" } + +["故国神游, 多情应笑我, 早生华发."] +note = [] +content = "故国/神游/, 多情/应笑我/, 早生/华发./" +translation = "如今我身临古战场神游往昔, 应笑我多愁善感, 以至于过早生出了白发" +keyword_note = { "故国神游" = "'神游故国'的倒文, 指当年的赤壁战场", "华发" = "花白的头发" } + +["人生如梦, 一尊还酹江月."] +note = ['人生 一作: 人间; 尊 同: 樽'] +content = "人生/如梦/, 一尊/还酹/江月./" +translation = "人生在世犹如大梦一场, 还是洒一杯酒祭献给江中伴我的明月吧" +keyword_note = { "尊" = "同'樽', 酒杯", "酹" = "洒酒于地, 表示祭奠或立誓" } + +["念奴娇·过洞庭"] +note = [] +content = "念奴娇·过洞庭/" +translation = "念奴娇·过洞庭" +keyword_note = {} + +["洞庭青草, 近中秋, 更无一点风色."] +note = [] +content = "洞庭/青草/, 近/中秋/, 更/无/一点/风色./" +translation = "洞庭湖与青草湖相连, 浩瀚无边, 在这中秋将至的时节, 更是没有一点风势" +keyword_note = { "洞庭" = "湖名, 在湖南岳阳西南", "青草" = "青草湖, 与洞庭湖相连", "风色" = "风势" } + +["玉鉴琼田三万顷, 着我扁舟一叶."] +note = ['着 同: 著', '玉鉴 一作: 玉界'] +content = "玉鉴/琼田/三万顷/, 着/我/扁舟/一叶./" +translation = "平静清澈的湖面像白玉磨成的镜子, 像美玉铺成的田地, 有几万顷那么宽阔, 湖上只漂浮着我的一叶扁舟" +keyword_note = { "玉鉴" = "像白玉磨成的镜子", "琼田" = "像美玉铺成的田地", "扁舟" = "小船" } + +["素月分辉, 明河共影, 表里俱澄澈."] +note = ['明河 一作: 银河'] +content = "素月/分辉/, 明河/共影/, 表里/俱/澄澈./" +translation = "皎洁的明月和灿烂的银河, 在这浩瀚的玉镜中映出她们的芳姿, 水面上下一片澄明" +keyword_note = { "素月" = "洁白的月亮", "明河" = "天河", "表里" = "里里外外, 此处指天上月亮和银河的光辉映入湖中, 上下一片澄明" } + +["悠然心会, 妙处难与君说."] +note = [] +content = "悠然/心会/, 妙处/难/与/君/说./" +translation = "体会着万物的空明, 这种美妙的体验却不知如何与君分享" +keyword_note = { "悠然" = "闲适自得的样子", "心会" = "内心领会" } + +["应念岭海经年, 孤光自照, 肝肺皆冰雪."] +note = ['岭海 一作: 岭表', '肝肺 一作: 肝胆'] +content = "应念/岭海/经年/, 孤光/自照/, 肝肺/皆/冰雪./" +translation = "感怀这一轮孤光自照的明月啊, 多少年徘徊于岭海之间, 胸襟仍像冰雪一样透明" +keyword_note = { "岭海" = "岭外, 即五岭以南的两广地区, 作者此前为官广西", "孤光" = "指月光", "冰雪" = "比喻心地光明磊落像冰雪般纯洁" } + +["短发萧骚襟袖冷, 稳泛沧浪空阔."] +note = ['短发 一作: 短鬓', '沧浪 一作: 沧冥'] +content = "短发/萧骚/襟袖/冷/, 稳/泛/沧浪/空阔./" +translation = "如今我 (虽) 因年老而深感短发稀疏, 衣襟单薄透着寒意, (但) 我仍能平静地泛舟在这广阔浩淼的苍溟之中" +keyword_note = { "萧骚" = "稀疏", "沧浪" = "青苍色的水" } + +["尽挹西江, 细斟北斗, 万象为宾客."] +note = ['尽挹 一作: 尽吸'] +content = "尽挹/西江/, 细斟/北斗/, 万象/为/宾客./" +translation = "让我捧尽西江清澈的江水, 细细地斟在北斗星做成的酒勺中, 请天地万象统统来做我的宾客" +keyword_note = { "挹" = "舀", "西江" = "长江连通洞庭湖, 中上游在洞庭以西, 故称西江", "北斗" = "星座名. 由七颗星排成像舀酒的斗的形状", "万象" = "万物" } + +["扣舷独啸, 不知今夕何夕!"] +note = ['扣 一作: 叩', '啸 一作: 笑'] +content = "扣舷/独啸/, 不知/今夕/何夕!/" +translation = "我尽情地拍打着我的船舷, 独自地放声高歌啊, 不知道今夕是何年! " +keyword_note = { "扣舷" = "敲击船舷", "啸" = "撮口作声", "不知今夕何夕" = "赞叹夜色美好, 使人沉醉, 竟忘掉一切 (包括时间) " } + +["扬州慢"] +note = [] +content = "扬州慢/" +translation = "扬州慢" +keyword_note = {} + +["淮左名都, 竹西佳处, 解鞍少驻初程."] +note = [] +content = "淮左/名都/, 竹西/佳处/, 解鞍/少驻/初程./" +translation = "扬州自古是著名的都会, 这里有著名游览胜地竹西亭, 初到扬州我解鞍下马停留一会儿. " +keyword_note = { "淮左名都" = "指扬州, 宋朝淮南东路的首府", "竹西" = "竹西亭, 扬州著名游览胜地", "解鞍少驻初程" = "解下马鞍稍作停留, 初段行程" } + +["过春风十里, 尽荠麦青青."] +note = [] +content = "过/春风/十里/, 尽/荠麦/青青./" +translation = "昔日繁华热闹的扬州路, 如今长满了青青荠麦, 一片荒凉. " +keyword_note = { "春风十里" = "借指扬州, 出自杜牧《赠别》诗" } + +["自胡马窥江去后, 废池乔木, 犹厌言兵."] +note = [] +content = "自/胡马/窥江/去后/, 废池/乔木/, 犹厌/言兵./" +translation = "金兵侵略长江流域地区, 洗劫扬州后, 只留下残存的古树和废毁的池台, 都不愿再谈论那残酷的战争. " +keyword_note = { "胡马窥江" = "指金兵侵略长江流域地区", "废池" = "废毁的池台", "乔木" = "残存的古树" } + +["渐黄昏, 清角吹寒, 都在空城."] +note = [] +content = "渐/黄昏/, 清角/吹寒/, 都在/空城./" +translation = "临近黄昏, 凄清的号角声响起, 回荡在这座凄凉残破的空城. " +keyword_note = { "清角" = "凄清的号角声", "空城" = "凄凉残破的空城" } + +["杜郎俊赏, 算而今, 重到须惊."] +note = [] +content = "杜郎/俊赏/, 算/而今/, 重到/须惊./" +translation = "杜牧俊逸清赏, 料想他现在再来的话也会感到震惊. " +keyword_note = { "杜郎" = "杜牧", "俊赏" = "俊逸清赏" } + +["纵豆蔻词工, 青楼梦好, 难赋深情."] +note = [] +content = "纵/豆蔻/词工/, 青楼/梦好/, 难赋/深情./" +translation = "即使'豆蔻'词语精工, 青楼美梦的诗意很好, 也难抒写此刻深沉悲怆感情. " +keyword_note = { "豆蔻词工" = "杜牧《赠别》诗词语精工", "青楼梦好" = "杜牧《遣怀》诗意境很好" } + +["二十四桥仍在, 波心荡, 冷月无声."] +note = [] +content = "二十四桥/仍在/, 波心/荡/, 冷月/无声./" +translation = "二十四桥依然还在, 桥下江水水波荡漾, 月色凄冷, 四周寂静无声. " +keyword_note = { "二十四桥" = "扬州城内古桥" } + +["念桥边红药, 年年知为谁生?"] +note = [] +content = "念/桥边/红药/, 年年/知为/谁生?/" +translation = "想那桥边红色的芍药花年年花叶繁荣, 可它们是为谁生长为谁开放呢? " +keyword_note = { "红药" = "红芍药花, 扬州繁华时期的名花" } + +["报任安书"] +note = [] +content = "报任安书/" +translation = "报任安书" +keyword_note = {} + +["古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉."] +note = ["摩: 通'磨'"] +content = "古者/富贵/而/名/摩灭/, 不可/胜记/, 唯/倜傥/非常/之/人称焉./" +translation = "古时候虽富贵但名字磨灭不传的人, 多得数不清, 只有那些卓异而不平常的人才在世上著称" +keyword_note = { "摩灭" = "磨灭", "胜记" = "尽记", "倜傥" = "卓越豪迈", "非常" = "非同寻常" } + +["盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;"] +note = [] +content = "盖/文王/拘/而/演/《周易》; /仲尼/厄/而/作/《春秋》; /屈原/放逐/, 乃/赋/《离骚》; /左丘/失明/, 厥/有/《国语》;/" +translation = "西伯姬昌被拘禁而扩写《周易》; 孔子受困窘而作《春秋》; 屈原被放逐, 才写了《离骚》; 左丘明失去视力, 才有《国语》" +keyword_note = { "拘" = "被拘禁", "演" = "推演", "厄" = "困厄", "放逐" = "被流放", "厥" = "才" } + +["孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;"] +note = ['膑脚: 名词作动词, 古代剔去膝盖骨的酷刑'] +content = "孙子/膑脚/, 《兵法》/修列; /不韦/迁蜀/, 世传/《吕览》; /韩非/囚秦/, 《说难》《孤愤》;/" +translation = "孙膑被截去膝盖骨, 《兵法》才撰写出来; 吕不韦被贬谪蜀地, 后世才流传着《吕览》; 韩非被囚禁在秦国, 写出《说难》《孤愤》" +keyword_note = { "膑脚" = "剔去膝盖骨", "修列" = "撰写出来", "迁蜀" = "被贬到蜀地" } + +["《诗》三百篇, 大底圣贤发愤之所为作也."] +note = ["底: 通'抵', 大抵, 大都"] +content = "《诗》/三百篇/, 大底/圣贤/发愤/之/所为作也./" +translation = "《诗经》三百篇, 大抵是一些圣贤们抒发愤懑而写作的" +keyword_note = { "大底" = "大抵, 大都", "发愤" = "抒发愤懑" } + +["此人皆意有所郁结, 不得通其道, 故述往事, 思来者."] +note = [] +content = "此人/皆/意/有/所郁结/, 不得/通其道/, 故/述往事/, 思来者./" +translation = "这些人都是心情郁结, 不能实现理想, 所以记述过去的事迹, 让将来的人了解自己的志向" +keyword_note = { "郁结" = "心情郁闷", "通其道" = "实现理想", "思来者" = "让后人思考" } + +["乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见."] +note = ["见: 通'现', 表现"] +content = "乃如/左丘/无目/, 孙子/断足/, 终/不可用/, 退而/论书策/, 以/舒其愤/, 思/垂空文/以/自见./" +translation = "就像左丘明没有了视力, 孙膑断了双脚, 终究不能为世所用, 便退而著书立说来抒发怨愤, 想让文章流传后世来表现自己的志向" +keyword_note = { "论书策" = "著书立说", "舒其愤" = "抒发怨愤", "垂空文" = "流传文章", "自见" = "表现自己" } + +["仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,"] +note = ["失: 通'佚', 散乱的文献"] +content = "仆/窃/不逊/, 近/自托/于/无能之辞/, 网罗/天下/放失旧闻/, 略/考其行事/, 综/其终始/, 稽/其成败兴坏之纪,/" +translation = "我私下里不自量力, 近来用我那不高明的文辞, 收集天下散失的历史传闻, 粗略地考订其事实, 综述其本末, 推究其成败盛衰的道理" +keyword_note = { "不逊" = "不自量力", "网罗" = "收集", "放失" = "散失", "稽" = "考察", "纪" = "规律" } + +["上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇."] +note = [] +content = "上计/轩辕/, 下/至于兹/, 为/十表/, 本纪十二/, 书八章/, 世家三十/, 列传七十/, 凡/百三十篇./" +translation = "上自黄帝, 下至当今, 写成表十篇, 本纪十二篇, 书八篇, 世家三十篇, 列传七十篇, 一共一百三十篇" +keyword_note = { "轩辕" = "黄帝", "兹" = "现在", "凡" = "总共" } + +["亦欲以究天人之际, 通古今之变, 成一家之言."] +note = [] +content = "亦欲/以/究天人之际/, 通/古今之变/, 成/一家之言./" +translation = "也就是想要探究自然和人间的关系, 弄通由古至今的变化规律, 自成一家之见解" +keyword_note = { "究" = "探究", "天人之际" = "自然与人的关系", "通" = "通晓" } + +["草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色."] +note = [] +content = "草创/未就/, 会/遭此祸/, 惜其/不成/, 是以/就极刑/而/无愠色./" +translation = "此书已经起草, 尚未完成, 就碰上这祸事, 惋惜它没有写成, 因此宁愿接受宫刑而没有怨怒的表情" +keyword_note = { "草创" = "起草", "未就" = "未完成", "会" = "恰逢", "极刑" = "宫刑", "愠色" = "怨怒表情" } + +["仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!"] +note = ["责: 通'债', 债务"] +content = "仆/诚/以/著此书/, 藏之/名山/, 传之/其人/, 通邑/大都/, 则/仆/偿前辱之责/, 虽/万被戮/, 岂有/悔哉!/" +translation = "我确实想完成这本书, 把它藏在名山之中, 传给可靠的人, 再让它流传进都市之中, 那么我就偿还了以前受辱的债, 即使一万次遭到杀戮, 哪里有后悔呢!" +keyword_note = { "诚" = "确实", "其人" = "可靠的人", "通邑" = "大都市", "偿" = "偿还", "戮" = "杀戮" } + +["然此可为智者道, 难为俗人言也!"] +note = [] +content = "然/此/可/为/智者道/, 难/为/俗人言也!/" +translation = "然而这些只能向有见识的人诉说, 却很难向世俗之人讲清楚啊!" +keyword_note = { "智者" = "有见识的人", "俗人" = "世俗之人" } + +["拟行路难·其四"] +note = [] +content = "拟行路难·其四/" +translation = "拟行路难·其四" +keyword_note = {} + +["泻水置平地, 各自东西南北流."] +note = [] +content = "泻水/置/平地/, 各自/东西/南北/流./" +translation = "往平地上倒水, 水会向不同方向流散" +keyword_note = { "泻水" = "倒水", "置" = "放置" } + +["人生亦有命, 安能行叹复坐愁?"] +note = [] +content = "人生/亦/有/命/, 安能/行叹/复/坐愁?/" +translation = "人生的际遇是既定的, 怎么能行止间叹息、惆怅呢? " +keyword_note = { "安能" = "怎么能", "行叹" = "行走时叹息", "坐愁" = "坐着发愁" } + +["酌酒以自宽, 举杯断绝歌路难."] +note = [] +content = "酌酒/以/自宽/, 举杯/断绝/歌/路难./" +translation = "喝点酒来自我宽慰, 因要饮酒而中断了《行路难》的歌唱" +keyword_note = { "酌酒" = "斟酒饮酒", "自宽" = "自我宽慰", "断绝" = "中断停止", "歌路难" = "歌唱《行路难》" } + +["心非木石岂无感, 吞声踯躅不敢言."] +note = [] +content = "心/非/木石/岂/无/感/, 吞声/踯躅/不敢/言./" +translation = "人心又不是草木, 怎么会没有感情? 欲说还休欲行又止不敢再多说什么" +keyword_note = { "木石" = "草木石头, 喻无情之物", "吞声" = "欲言又止", "踯躅" = "徘徊不前", "不敢言" = "不敢说出来" } + +["无衣"] +note = [] +content = "无衣/" +translation = "无衣" +keyword_note = {} + +["岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!"] +note = ['诗经·国风·秦风〔先秦〕'] +content = "岂曰/无衣? /与子/同袍. /王于/兴师/, 修我/戈矛/, 与子/同仇!/" +translation = "谁说没有衣服穿? 与你同穿战袍. 君王出兵打仗, 修整我那戈与矛, 与你共同对敌. " +keyword_note = { "袍" = "长袍, 即今之斗篷", "王" = "此指秦君. 一说指周天子", "于" = "语助词", "兴师" = "起兵", "同仇" = "共同对敌" } + +["岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!"] +note = [] +content = "岂曰/无衣? /与子/同泽. /王于/兴师/, 修我/矛戟/, 与子/偕作!/" +translation = "谁说没有衣服穿? 与你同穿内衣. 君王出兵打仗, 修整我那矛与戟, 与你一起出发. " +keyword_note = { "泽" = "通'襗', 内衣, 如今指汗衫", "偕作" = "一起出发" } + +["岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!"] +note = [] +content = "岂曰/无衣? /与子/同裳. /王于/兴师/, 修我/甲兵/, 与子/偕行!/" +translation = "谁说没有衣服穿? 与你同穿战裙. 君王出兵打仗, 修整甲胄与兵器, 杀敌与你共前进. " +keyword_note = { "裳" = "下衣, 此指战袍", "甲兵" = "铠甲与兵器", "偕行" = "一同前往" } + +["春江花月夜"] +note = [] +content = "春江花月夜/" +translation = "春江花月夜" +keyword_note = {} + +["春江潮水连海平, 海上明月共潮生."] +note = ['诗歌开篇描绘春江月夜的壮丽画面'] +content = "春江/潮水/连海/平/, 海上/明月/共潮/生./" +translation = "春天的江潮水势浩荡, 与大海连成一片, 一轮明月从海上升起, 好像与潮水一起涌出来. " +keyword_note = { "春江" = "春天的江水", "连海平" = "与海平面相连", "共潮生" = "与潮水一同升起" } + +["滟滟随波千万里, 何处春江无月明!"] +note = [] +content = "滟滟/随波/千万/里/, 何处/春江/无月/明!/" +translation = "月光照耀着春江, 随着波浪闪耀千万里, 所有地方的春江都有明亮的月光. " +keyword_note = { "滟滟" = "波光荡漾的样子", "随波" = "随着波浪", "何处" = "什么地方" } + +["江流宛转绕芳甸, 月照花林皆似霰."] +note = [] +content = "江流/宛转/绕芳/甸/, 月照/花林/皆似/霰./" +translation = "江水曲曲折折地绕着花草丛生的原野流淌, 月光照射着开遍鲜花的树林好像细密的雪珠在闪烁. " +keyword_note = { "宛转" = "曲折蜿蜒", "芳甸" = "芳草丰茂的原野", "霰" = "白色不透明的小冰粒, 形容月光下的花朵" } + +["空里流霜不觉飞, 汀上白沙看不见."] +note = [] +content = "空里/流霜/不觉/飞/, 汀上/白沙/看不/见./" +translation = "月色如霜, 所以霜飞无从觉察. 洲上的白沙和月色融合在一起, 看不分明. " +keyword_note = { "流霜" = "飞霜, 比喻月光皎洁", "汀" = "水边平地, 小洲", "看不见" = "看不分明" } + +["江天一色无纤尘, 皎皎空中孤月轮."] +note = [] +content = "江天/一色/无纤/尘/, 皎皎/空中/孤月/轮./" +translation = "江水、天空成一色, 没有一点微小灰尘, 明亮的天空中只有一轮孤月高悬空中. " +keyword_note = { "江天一色" = "江水和天空同一个颜色", "无纤尘" = "没有一点灰尘", "皎皎" = "明亮洁白", "孤月轮" = "孤独的月亮" } + +["江畔何人初见月? 江月何年初照人?"] +note = ['诗人开始哲学思考, 追问月亮与人类的关系'] +content = "江畔/何人/初见/月/? 江月/何年/初照/人?/" +translation = "江边上什么人最初看见月亮, 江上的月亮哪一年最初照耀着人? " +keyword_note = { "江畔" = "江边", "初见月" = "第一次看见月亮", "初照人" = "第一次照耀人间" } + +["人生代代无穷已, 江月年年望相似."] +note = [] +content = "人生/代代/无穷/已/, 江月/年年/望相/似./" +translation = "人生一代代地无穷无尽, 只有江上的月亮一年年地总是相像. " +keyword_note = { "代代" = "一代又一代", "无穷已" = "没有穷尽", "望相似" = "看起来相似" } + +["不知江月待何人, 但见长江送流水."] +note = [] +content = "不知/江月/待何/人/, 但见/长江/送流/水./" +translation = "不知江上的月亮等待着什么人, 只见长江不断地一直运输着流水. " +keyword_note = { "待何人" = "等待什么人", "但见" = "只见", "送流水" = "输送着流水" } + +["白云一片去悠悠, 青枫浦上不胜愁."] +note = ['转入游子思妇的离别相思之情'] +content = "白云/一片/去悠/悠/, 青枫/浦上/不胜/愁./" +translation = "游子像一片白云缓缓地离去, 只剩下思妇站在离别的青枫浦不胜忧愁. " +keyword_note = { "去悠悠" = "缓缓离去", "青枫浦" = "泛指离别的地方", "不胜愁" = "承受不住忧愁" } + +["谁家今夜扁舟子? 何处相思明月楼?"] +note = [] +content = "谁家/今夜/扁舟/子/? 何处/相思/明月/楼?/" +translation = "哪家的游子今晚坐着小船在漂流? 什么地方有人在明月照耀的楼上相思? " +keyword_note = { "谁家" = "哪一家", "扁舟子" = "漂泊江湖的游子", "明月楼" = "月夜下的闺楼" } + +["可怜楼上月徘徊, 应照离人妆镜台."] +note = [] +content = "可怜/楼上/月徘/徊/, 应照/离人/妆镜/台./" +translation = "可怜楼上不停移动的月光, 应该照耀着离人的梳妆台. " +keyword_note = { "可怜" = "可爱, 令人怜惜", "月徘徊" = "月光移动徘徊", "离人" = "离别的人, 指思妇", "妆镜台" = "梳妆台" } + +["玉户帘中卷不去, 捣衣砧上拂还来."] +note = [] +content = "玉户/帘中/卷不/去/, 捣衣/砧上/拂还/来./" +translation = "月光照进思妇的门帘, 卷不走, 照在她的捣衣砧上, 拂不掉. " +keyword_note = { "玉户" = "华美的门户", "卷不去" = "卷不走 (月光) ", "捣衣砧" = "捶布石", "拂还来" = "拂去了又回来" } + +["此时相望不相闻, 愿逐月华流照君."] +note = [] +content = "此时/相望/不相/闻/, 愿逐/月华/流照/君./" +translation = "这时互相望着月亮可是互相听不到声音, 我希望随着月光流去照耀着您. " +keyword_note = { "相望" = "互相望着", "不相闻" = "听不到彼此", "愿逐" = "愿意追随", "月华" = "月光" } + +["鸿雁长飞光不度, 鱼龙潜跃水成文."] +note = ['暗含鱼雁不能传信之意, 写月光之清澈无边'] +content = "鸿雁/长飞/光不/度/, 鱼龙/潜跃/水成/文./" +translation = "鸿雁不停地飞翔, 而不能飞出无边的月光; 月照江面, 鱼龙在水中跳跃, 激起阵阵波纹. " +keyword_note = { "鸿雁" = "大雁", "长飞" = "远飞", "光不度" = "飞不出月光", "潜跃" = "潜游跳跃", "水成文" = "水面形成波纹" } + +["昨夜闲潭梦落花, 可怜春半不还家."] +note = [] +content = "昨夜/闲潭/梦落/花/, 可怜/春半/不还/家./" +translation = "昨天夜里梦见花落闲潭, 可惜的是春天过了一半自己还不能回家. " +keyword_note = { "闲潭" = "幽静的水潭", "梦落花" = "梦见花落", "春半" = "春天过半", "不还家" = "不能回家" } + +["江水流春去欲尽, 江潭落月复西斜."] +note = [] +content = "江水/流春/去欲/尽/, 江潭/落月/复西/斜./" +translation = "江水带着春光将要流尽, 水潭上的月亮又要西落. " +keyword_note = { "流春" = "流淌着春光", "去欲尽" = "将要流尽", "复西斜" = "又向西倾斜" } + +["斜月沉沉藏海雾, 碣石潇湘无限路."] +note = ['碣石在北, 潇湘在南, 极言路途遥远'] +content = "斜月/沉沉/藏海/雾/, 碣石/潇湘/无限/路./" +translation = "斜月慢慢下沉, 藏在海雾里, 碣石与潇湘的离人距离无限遥远. " +keyword_note = { "沉沉" = "深沉, 慢慢下沉", "藏海雾" = "隐藏在海雾中", "碣石" = "山名, 在北方", "潇湘" = "水名, 在南方", "无限路" = "极远的道路" } + +["不知乘月几人归, 落月摇情满江树."] +note = ['以景结情, 余韵悠长'] +content = "不知/乘月/几人/归/, 落月/摇情/满江/树./" +translation = "不知有几人能趁着月光回家, 唯有那西落的月亮摇荡着离情, 洒满了江边的树林. " +keyword_note = { "乘月" = "趁着月光", "几人归" = "有几个人回家", "落月" = "西沉的月亮", "摇情" = "激荡情思", "满江树" = "洒满江边的树林" } + +["望海潮·东南形胜"] +note = [] +content = "望海潮·东南形胜/" +translation = "望海潮·东南形胜" +keyword_note = {} + +["东南形胜, 三吴都会, 钱塘自古繁华."] +note = ['开篇总写杭州的地理优势和繁华历史'] +content = "东南/形胜/, 三吴/都会/, 钱塘/自古/繁华./" +translation = "杭州地处东南方, 地理形势优越, 风景优美, 是三吴的都会, 这里自古以来就十分繁华. " +keyword_note = { "形胜" = "地理形势优越", "三吴" = "吴兴、吴郡、会稽三郡的合称", "钱塘" = "杭州的古称", "繁华" = "繁荣热闹" } + +["烟柳画桥, 风帘翠幕, 参差十万人家."] +note = [] +content = "烟柳/画桥/, 风帘/翠幕/, 参差/十万/人家./" +translation = "如烟一般的柳色、装饰华美的桥梁, 挡风的帘子、青绿色的帐幕, 楼阁高高低低, 大约有十万户人家. " +keyword_note = { "烟柳" = "如烟的柳色", "画桥" = "装饰华美的桥", "风帘" = "挡风的帘子", "翠幕" = "青绿色的帷幕", "参差" = "高低不齐的样子" } + +["云树绕堤沙, 怒涛卷霜雪, 天堑无涯."] +note = ['描写钱塘江的壮丽景色'] +content = "云树/绕/堤沙/, 怒涛/卷/霜雪/, 天堑/无涯./" +translation = "高耸入云的树, 环绕着钱塘江沙堤, 又高又急的潮头冲过来, 浪花像霜雪在滚动, 宽广的江面一望无涯. " +keyword_note = { "云树" = "高耸入云的树", "堤沙" = "江边的沙堤", "怒涛" = "汹涌的波涛", "卷霜雪" = "卷起霜雪般的浪花", "天堑" = "天然的壕沟, 指钱塘江", "无涯" = "无边无际" } + +["市列珠玑, 户盈罗绮, 竞豪奢."] +note = ['表现杭州的富庶和奢华'] +content = "市列/珠玑/, 户盈/罗绮/, 竞/豪奢./" +translation = "市场上陈列着琳琅满目的珠玉珍宝, 家家户户都存满了绫罗绸缎, 争相比奢华. " +keyword_note = { "市列" = "市场上陈列", "珠玑" = "珍珠和玉玑, 泛指珍宝", "户盈" = "家家户户充满", "罗绮" = "丝织品, 绫罗绸缎", "竞" = "竞争, 比赛", "豪奢" = "豪华奢侈" } + +["重湖叠𪩘清嘉, 有三秋桂子, 十里荷花."] +note = ['描写西湖的秀丽景色和四季美景'] +content = "重湖/叠𪩘/清嘉/, 有/三秋/桂子/, 十里/荷花./" +translation = "里湖、外湖与重重叠叠的山岭非常清秀美丽. 秋天桂花飘香, 夏季十里荷花. " +keyword_note = { "重湖" = "西湖分里湖和外湖", "叠𪩘" = "重叠的山峰", "清嘉" = "清秀美丽", "三秋" = "秋季, 农历九月", "桂子" = "桂花", "十里荷花" = "绵延十里的荷花" } + +["羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃."] +note = ['描绘杭州人民的游乐生活'] +content = "羌管/弄晴/, 菱歌/泛夜/, 嬉嬉/钓叟/莲娃./" +translation = "晴天欢快地吹奏羌笛, 夜晚划船采菱唱歌, 钓鱼的老翁、采莲的姑娘都喜笑颜开. " +keyword_note = { "羌管" = "羌笛, 泛指乐器", "弄晴" = "在晴日吹奏", "菱歌" = "采菱时唱的歌", "泛夜" = "在夜晚飘荡", "嬉嬉" = "喜笑颜开的样子", "钓叟" = "钓鱼的老翁", "莲娃" = "采莲的姑娘" } + +["千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞."] +note = ['描写孙何出巡的威仪和雅兴'] +content = "千骑/拥/高牙/, 乘醉/听/箫鼓/, 吟赏/烟霞./" +translation = "孙何外出时, 成群的马队簇拥着高高的牙旗, 缓缓而来, 声势煊赫. 在微醺中听着箫鼓管弦, 吟诗作词, 赞赏着美丽的水色山光. " +keyword_note = { "千骑" = "众多的骑从", "拥" = "簇拥", "高牙" = "高大的牙旗", "乘醉" = "趁着醉意", "箫鼓" = "箫和鼓, 泛指音乐", "吟赏" = "吟诗歌赏", "烟霞" = "山水景色" } + +["异日图将好景, 归去凤池夸."] +note = ['结尾表达祝愿之词'] +content = "异日/图将/好景/, 归去/凤池/夸./" +translation = "他日把这美好的景致画出来, 回京升官时向人们夸耀. " +keyword_note = { "异日" = "他日, 日后", "图将" = "描绘出来", "好景" = "美好景致", "归去" = "回去", "凤池" = "凤凰池, 指中书省, 代指朝廷", "夸" = "夸耀" } + +["朝天子·咏喇叭"] +note = [] +content = "朝天子·咏喇叭/" +translation = "朝天子·咏喇叭" +keyword_note = {} + +["喇叭, 唢呐, 曲儿小腔儿大"] +note = ['用喇叭唢呐比喻宦官, 表面写乐器, 实则讽刺宦官本事小却官腔十足'] +content = "喇叭/, 唢呐/, 曲儿/小/腔儿/大/" +translation = "喇叭和唢呐, 吹的曲子虽短, 声音却很响亮" +keyword_note = { "喇叭" = "铜制管乐器, 比喻宦官", "唢呐" = "管乐器, 同'锁呐'", "曲儿小" = "曲子很短", "腔儿大" = "声音很响, 暗指官腔十足" } + +["官船来往乱如麻, 全仗你抬声价"] +note = ['揭露宦官倚仗皇帝权势作威作福的丑态'] +content = "官船/来往/乱如麻/, 全仗/你/抬/声价/" +translation = "官船来往频繁乱如麻, 全凭借你抬高名誉地位" +keyword_note = { "官船" = "官府衙门的船只", "乱如麻" = "形容来往频繁", "仗" = "倚仗, 凭借", "声价" = "名誉地位, 同'身价'" } + +["军听了军愁, 民听了民怕"] +note = ['表现宦官监军扰民, 令军民都感到恐惧和忧愁'] +content = "军/听了/军愁/, 民/听了/民怕/" +translation = "军队听了军队发愁, 百姓听了百姓害怕" +keyword_note = { "军愁" = "军队因受宦官监军搅扰而发愁", "民怕" = "百姓害怕宦官的欺压" } + +["哪里去辨甚么真共假?"] +note = ['讽刺世人无法分辨宦官传达的旨意真假, 暗指宦官常常假传圣旨'] +content = "哪里/去辨/甚么/真共假?/" +translation = "哪里会去辨别什么真和假? " +keyword_note = { "辨" = "分辨、分别", "甚么" = "同'什么'", "真共假" = "真和假" } + +["眼见的吹翻了这家, 吹伤了那家,"] +note = ['具体描写宦官欺压百姓造成的严重后果'] +content = "眼见/的/吹翻了/这家/, 吹伤了/那家,/" +translation = "眼看着使有的人家倾家荡产, 有的人家元气大伤" +keyword_note = { "吹翻了" = "使倾家荡产", "吹伤了" = "使元气大伤" } + +["只吹的水尽鹅飞罢!"] +note = ['用比喻手法表现宦官欺压导致民穷财尽、家破人亡的悲惨结局'] +content = "只吹/的/水尽/鹅飞/罢!/" +translation = "直吹得江水枯竭鹅飞跑, 家破人亡啊! " +keyword_note = { "水尽鹅飞" = "比喻民穷财尽, 家破人亡", "罢" = "语气词, 表示完结" } + +["李凭箜篌引"] +note = [] +content = "李凭箜篌引/" +translation = "李凭箜篌引" +keyword_note = {} + +["吴丝蜀桐张高秋, 空山凝云颓不流."] +note = [] +content = "吴丝/蜀桐/张/高秋/, 空山/凝云/颓/不流./" +translation = "秋夜弹奏起吴丝蜀桐制成的精美箜篌, 听到美妙的乐声, 山上的白云都凝聚起来不再飘游" +keyword_note = { "吴丝蜀桐" = "吴地之丝, 蜀地之桐, 指制作箜篌的材料", "张" = "调好弦, 准备调奏", "高秋" = "指弹奏时间, 深秋天气", "空山" = "一作'空白', 指山中的行云" } + +["江娥啼竹素女愁, 李凭中国弹箜篌."] +note = [] +content = "江娥/啼竹/素女/愁/, 李凭/中国/弹/箜篌./" +translation = "湘娥把点点泪珠洒满斑竹, 九天素女也被牵动满腔忧愁; 这高妙的乐声从哪儿传出? 是乐工李凭在京城弹奏箜篌" +keyword_note = { "江娥" = "一作'湘娥', 指舜的妃子娥皇、女英", "素女" = "传说中的神女", "中国" = "即国之中央, 意谓在京城" } + +["昆山玉碎凤凰叫, 芙蓉泣露香兰笑."] +note = [] +content = "昆山/玉碎/凤凰/叫/, 芙蓉/泣露/香兰/笑./" +translation = "乐声清脆得就像昆仑山的美玉被击碎, 凤凰在鸣叫; 时而又像芙蓉在露水中饮泣, 像兰花迎风开放笑语轻柔" +keyword_note = { "昆山玉碎" = "昆仑玉碎, 形容乐音清脆", "凤凰叫" = "形容乐音和缓", "芙蓉泣露" = "形容乐声低回", "香兰笑" = "形容乐声轻快" } + +["十二门前融冷光, 二十三丝动紫皇."] +note = [] +content = "十二门/前/融/冷光/, 二十三丝/动/紫皇./" +translation = "笼罩整个长安城的月光变得温煦; 高弹轻拨箜篌, 帝王的心弦也被乐声打动" +keyword_note = { "十二门" = "长安城东西南北每一面各三门, 共十二门", "二十三丝" = "竖箜篌有二十三弦", "紫皇" = "道教称天上最尊的神, 这里用来指皇帝" } + +["女娲炼石补天处, 石破天惊逗秋雨."] +note = [] +content = "女娲/炼石/补天/处/, 石破/天惊/逗/秋雨./" +translation = "高亢的乐声直冲云霄, 冲上女娲炼石补过的天际; 好似补天的五彩石被击破, 引落了漫天绵绵秋雨" +keyword_note = { "女娲" = "中华上古之神, 人首蛇身", "石破天惊" = "补天的五色石被震破", "逗" = "引" } + +["梦入神山教神妪, 老鱼跳波瘦蛟舞."] +note = [] +content = "梦入/神山/教/神妪/, 老鱼/跳波/瘦蛟/舞./" +translation = "幻觉中仿佛看见乐工进入了神山, 把技艺向神女传授; 湖中老鱼兴奋得在波中跳跃, 潭中瘦蛟也翩翩起舞乐悠悠" +keyword_note = { "神妪" = "神仙老妇", "老鱼跳波" = "鱼随着乐声跳跃" } + +["吴质不眠倚桂树, 露脚斜飞湿寒兔."] +note = [] +content = "吴质/不眠/倚/桂树/, 露脚/斜飞/湿/寒兔./" +translation = "月宫中吴刚被乐声吸引, 彻夜不眠在桂树下徘徊逗留; 露滴斜斜坠落, 打湿了 (全神贯注聆听箜篌演奏的) 玉兔" +keyword_note = { "吴质" = "即吴刚", "露脚" = "露珠下滴的形象说法", "寒兔" = "指秋月, 传说月中有玉兔" } + +["桂枝香·金陵怀古"] +note = [] +content = "桂枝香·金陵怀古/" +translation = "桂枝香·金陵怀古" +keyword_note = {} + +["登临送目, 正故国晚秋, 天气初肃."] +note = [] +content = "登临/送目/, 正/故国/晚秋/, 天气/初肃./" +translation = "登山临水, 举目望远, 故都金陵正是深秋, 天气已变得飒爽清凉" +keyword_note = { "登临" = "登山临水", "送目" = "举目望远", "故国" = "旧时的都城, 指金陵", "初肃" = "开始变得飒爽清凉" } + +["千里澄江似练, 翠峰如簇."] +note = [] +content = "千里/澄江/似练/, 翠峰/如簇./" +translation = "奔腾千里的长江澄澈得像一匹长长的白绢, 青翠的山峰俊伟峭拔犹如一束束的箭簇" +keyword_note = { "澄江似练" = "清澈的长江像白绢. 语出谢朓《晚登三山还望京邑》", "如簇" = "像箭簇一样丛聚" } + +["归帆去棹残阳里, 背西风, 酒旗斜矗."] +note = ['归帆 一作: 征帆'] +content = "归帆/去棹/残阳里/, 背/西风/, 酒旗/斜矗./" +translation = "船只在夕阳下往来穿梭, 酒楼外斜插的酒旗随着西风飘扬" +keyword_note = { "归帆去棹" = "往来的船只", "酒旗" = "酒楼外悬挂的旗帜", "斜矗" = "斜插着" } + +["彩舟云淡, 星河鹭起, 画图难足."] +note = [] +content = "彩舟/云淡/, 星河/鹭起/, 画图/难足./" +translation = "华丽的画船如同在淡云中浮游, 江中洲上的白鹭时而停歇时而飞起, 这清丽的景色就是丹青妙笔也难描画" +keyword_note = { "彩舟" = "华丽的画船", "星河鹭起" = "白鹭从水中沙洲上飞起", "画图难足" = "用图画也难以完美地表现" } + +["念往昔, 繁华竞逐."] +note = [] +content = "念/往昔/, 繁华/竞逐./" +translation = "遥想当年, 达官贵人争着过豪华的生活" +keyword_note = { "繁华竞逐" = "争着过豪华的生活" } + +["叹门外楼头, 悲恨相续."] +note = [] +content = "叹/门外/楼头/, 悲恨/相续./" +translation = "可叹在朱雀门外结绮阁楼, 亡国的悲剧连续发生" +keyword_note = { "门外楼头" = "指南朝陈亡国惨剧. 语出杜牧《台城曲》", "悲恨相续" = "亡国悲剧连续发生" } + +["千古凭高对此, 谩嗟荣辱."] +note = [] +content = "千古/凭高/对此/, 谩嗟/荣辱./" +translation = "自古多少人在此登高怀古, 无不对历代荣辱喟叹感伤" +keyword_note = { "凭高" = "登高", "谩嗟荣辱" = "空叹什么荣耀耻辱" } + +["六朝旧事随流水, 但寒烟衰草凝绿."] +note = ['衰草 一作: 芳草'] +content = "六朝/旧事/随流水/, 但/寒烟/衰草/凝绿./" +translation = "六朝的风云变化全都随着流水消逝, 唯有江上的烟波与草上凝结的露珠常在" +keyword_note = { "六朝" = "指三国吴、东晋、南朝宋、齐、梁、陈六个朝代", "寒烟衰草" = "江上的烟波与衰败的草" } + +["至今商女, 时时犹唱, 后庭遗曲."] +note = [] +content = "至今/商女/, 时时/犹唱/, 后庭/遗曲./" +translation = "如今的商女, 还不知亡国的悲恨, 时时放声歌唱《玉树后庭花》" +keyword_note = { "商女" = "歌女", "后庭遗曲" = "指歌曲《玉树后庭花》, 传为陈后主所作, 被认为是亡国之音" } + +["梦游天姥吟留别"] +note = [] +content = "梦游天姥吟留别/" +translation = "梦游天姥吟留别" +keyword_note = {} + +["海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹."] +note = [] +content = "海客/谈/瀛洲/, 烟涛/微茫/信/难求; /越人/语/天姥/, 云霞/明灭/或/可睹./" +translation = "听海外来客们谈起瀛洲, 烟波渺茫实在难以寻求. 越中来人说起天姥山, 在云雾忽明忽暗间有时能看见. " +keyword_note = { "海客" = "海外来客", "瀛洲" = "古代传说中的东海三座仙山之一", "烟涛" = "波涛渺茫, 远看像烟雾笼罩的样子", "微茫" = "景象模糊不清", "信" = "确实, 实在", "越人" = "指浙江一带的人", "天姥" = "天姥山, 在浙江新昌东面", "明灭" = "忽明忽暗", "或" = "有时", "睹" = "看见" } + +["天姥连天向天横, 势拔五岳掩赤城."] +note = [] +content = "天姥/连天/向天/横/, 势/拔/五岳/掩/赤城./" +translation = "天姥山仿佛连接着天遮断了天空, 山势高峻超过五岳, 遮掩过赤城山. " +keyword_note = { "向天横" = "遮蔽天空", "拔" = "超出", "五岳" = "指东岳泰山、西岳华山、中岳嵩山、北岳恒山、南岳衡山", "掩" = "遮掩", "赤城" = "山名, 在今浙江天台北部" } + +["天台四万八千丈, 对此欲倒东南倾."] +note = [] +content = "天台/四万/八千/丈/, 对此/欲倒/东南/倾./" +translation = "天台山虽高四万八千丈, 面对着它好像要向东南倾斜拜倒一样. " +keyword_note = { "天台" = "山名, 在今浙江天台北部", "四万八千丈" = "极言其高", "对此" = "对着天姥山", "欲" = "好像要", "东南倾" = "向东南方向倾斜" } + +["我欲因之梦吴越, 一夜飞度镜湖月."] +note = [] +content = "我/欲/因之/梦/吴越/, 一夜/飞度/镜湖/月./" +translation = "我想依据越人说的话梦游到吴越, 一天夜晚飞渡过明月映照下的镜湖. " +keyword_note = { "因之" = "依据越人的话", "梦" = "梦游", "吴越" = "指越地", "飞度" = "飞渡", "镜湖" = "又名鉴湖, 在浙江绍兴南面" } + +["湖月照我影, 送我至剡溪."] +note = [] +content = "湖月/照/我影/, 送我/至/剡溪./" +translation = "镜湖上的月光照着我的身影, 一直送我到了剡溪. " +keyword_note = { "湖月" = "镜湖上的月光", "照我影" = "照着我的身影", "剡溪" = "水名, 在浙江嵊州南面" } + +["谢公宿处今尚在, 渌水荡漾清猿啼."] +note = [] +content = "谢公/宿处/今/尚在/, 渌水/荡漾/清猿/啼./" +translation = "谢灵运住的地方如今还在, 清澈的湖水荡漾, 猿猴凄清啼叫. " +keyword_note = { "谢公" = "指南朝诗人谢灵运", "宿处" = "住宿的地方", "尚" = "还", "渌水" = "清澈的水", "荡漾" = "水波摇动的样子", "清猿" = "叫声凄清的猿猴" } + +["脚著谢公屐, 身登青云梯."] +note = [] +content = "脚/著/谢公/屐/, 身/登/青云/梯./" +translation = "我脚上穿着谢公当年特制的木鞋, 攀登直上云霄的山路. " +keyword_note = { "著" = "穿", "谢公屐" = "谢灵运特制的木屐", "青云梯" = "指直上云霄的山路" } + +["半壁见海日, 空中闻天鸡."] +note = [] +content = "半壁/见/海日/, 空中/闻/天鸡./" +translation = "上到半山腰就看见了从海上升起的太阳, 空中传来天鸡报晓的啼鸣之声. " +keyword_note = { "半壁" = "半山腰", "海日" = "从海上升起的太阳", "天鸡" = "古代传说中的神鸡" } + +["千岩万转路不定, 迷花倚石忽已暝."] +note = [] +content = "千岩/万转/路/不定/, 迷花/倚石/忽/已暝./" +translation = "无数山岩重叠, 山道曲折, 盘旋变化不定. 迷恋着花, 依倚着石, 不觉天色已晚. " +keyword_note = { "千岩万转" = "山岩重叠, 道路曲折", "不定" = "变化不定", "迷花" = "迷恋花草", "倚石" = "倚靠石头", "忽" = "忽然", "暝" = "天黑" } + +["熊咆龙吟殷岩泉, 栗深林兮惊层巅."] +note = [] +content = "熊咆/龙吟/殷/岩泉/, 栗/深林/兮/惊/层巅./" +translation = "熊在怒吼, 龙在长鸣, 岩中的泉水在震响, 使深林战栗, 使高耸而重叠的山峰惊颤. " +keyword_note = { "熊咆" = "熊的怒吼", "龙吟" = "龙的鸣叫", "殷" = "震响", "岩泉" = "山岩中的泉水", "栗" = "使...战栗", "惊" = "使...惊颤", "层巅" = "重叠的山峰" } + +["云青青兮欲雨, 水澹澹兮生烟."] +note = [] +content = "云/青青/兮/欲雨/, 水/澹澹/兮/生烟./" +translation = "云层黑沉沉的, 像是要下雨, 水波动荡生起了薄薄的烟雾. " +keyword_note = { "青青" = "黑沉沉的样子", "欲雨" = "将要下雨", "澹澹" = "水波荡漾的样子", "生烟" = "产生烟雾" } + +["列缺霹雳, 丘峦崩摧."] +note = [] +content = "列缺/霹雳/, 丘峦/崩摧./" +translation = "电光闪闪, 雷声轰鸣, 山峰好像要崩塌似的. " +keyword_note = { "列缺" = "闪电", "霹雳" = "雷声", "丘峦" = "山峰", "崩摧" = "崩塌" } + +["洞天石扉, 訇然中开."] +note = [] +content = "洞天/石扉/, 訇然/中开./" +translation = "仙府的石门, “訇”的一声从中间打开. " +keyword_note = { "洞天" = "仙人居住的洞府", "石扉" = "石门", "訇然" = "巨大的响声", "中开" = "从中间打开" } + +["青冥浩荡不见底, 日月照耀金银台."] +note = [] +content = "青冥/浩荡/不见/底/, 日月/照耀/金银/台./" +translation = "洞中蔚蓝的天空广阔无际, 看不到尽头, 日月照耀着金银做的宫阙. " +keyword_note = { "青冥" = "天空", "浩荡" = "广阔无边的样子", "不见底" = "看不到尽头", "金银台" = "金银铸成的宫阙" } + +["霓为衣兮风为马, 云之君兮纷纷而来下."] +note = [] +content = "霓/为衣/兮/风/为马/, 云之/君兮/纷纷/而来下./" +translation = "用彩虹做衣裳, 将风作为马来乘, 云中的神仙们纷纷下来. " +keyword_note = { "霓" = "彩虹", "为衣" = "做衣裳", "为马" = "作为马", "云之君" = "云中的神仙", "纷纷" = "众多的样子", "来下" = "下来" } + +["虎鼓瑟兮鸾回车, 仙之人兮列如麻."] +note = [] +content = "虎/鼓瑟/兮/鸾/回车/, 仙之/人兮/列/如麻./" +translation = "老虎弹奏着琴瑟, 鸾鸟驾着车. 仙人们排成列, 密密麻麻. " +keyword_note = { "鼓瑟" = "弹奏琴瑟", "鸾" = "传说中的神鸟", "回车" = "驾车", "列如麻" = "排列得像麻一样密集" } + +["忽魂悸以魄动, 恍惊起而长嗟."] +note = [] +content = "忽/魂悸/以/魄动/, 恍/惊起/而/长嗟./" +translation = "忽然魂魄惊动, 我猛然惊醒, 不禁长声叹息. " +keyword_note = { "魂悸" = "魂魄惊动", "魄动" = "精神震动", "恍" = "恍然", "惊起" = "惊醒坐起", "长嗟" = "长声叹息" } + +["惟觉时之枕席, 失向来之烟霞."] +note = [] +content = "惟/觉时/之/枕席/, 失/向来/之/烟霞./" +translation = "醒来时只有身边的枕席, 刚才梦中所见的烟雾云霞全都消失了. " +keyword_note = { "惟" = "只有", "觉时" = "醒来时", "向来" = "刚才", "烟霞" = "指梦中的仙境景象" } + +["世间行乐亦如此, 古来万事东流水."] +note = [] +content = "世间/行乐/亦/如此/, 古来/万事/东流/水./" +translation = "人世间的欢乐也是像梦中的幻境这样, 自古以来万事都像东流的水一样一去不复返. " +keyword_note = { "行乐" = "人世欢乐", "如此" = "像这样", "古来" = "自古以来", "东流水" = "向东流去的水" } + +["别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山."] +note = [] +content = "别君/去兮/何时/还? /且/放/白鹿/青崖/间/, 须/行/即骑/访/名山./" +translation = "告别诸君, 此番远去不知何时才能回来? 暂且把白鹿放牧在青崖间, 等到要远行时就骑上它寻访名山. " +keyword_note = { "别君" = "告别诸君", "去兮" = "离去啊", "还" = "回来", "且" = "暂且", "白鹿" = "传说神仙或隐士多骑白鹿", "青崖" = "青翠的山崖", "须" = "等待", "即" = "就", "访" = "寻访" } + +["安能摧眉折腰事权贵, 使我不得开心颜?"] +note = [] +content = "安能/摧眉/折腰/事/权贵/, 使我/不得/开心/颜?/" +translation = "岂能卑躬屈膝去侍奉权贵, 让自己不能有舒心畅意的笑颜! " +keyword_note = { "安能" = "怎么能", "摧眉折腰" = "低头弯腰", "事" = "侍奉", "权贵" = "有权势的贵族", "开心颜" = "心情愉快, 笑逐颜开" } + +["永遇乐·京口北固亭怀古"] +note = [] +content = "永遇乐·京口北固亭怀古/" +translation = "永遇乐·京口北固亭怀古" +keyword_note = {} + +["千古江山, 英雄无觅, 孙仲谋处."] +note = [] +content = "千古/江山/, 英雄/无觅/, 孙仲谋/处./" +translation = "历经千古的江山, 再也难以寻觅到像孙权那样的英雄" +keyword_note = { "千古" = "年代久远", "无觅" = "难以寻找", "孙仲谋" = "三国时的吴王孙权, 字仲谋" } + +["舞榭歌台, 风流总被, 雨打风吹去."] +note = [] +content = "舞榭/歌台/, 风流/总被/, 雨打/风吹/去./" +translation = "当年的舞榭歌台还在, 英雄人物却早已随着岁月的流逝不复存在了" +keyword_note = { "舞榭歌台" = "歌舞的台榭", "风流" = "指英雄的流风余韵" } + +["斜阳草树, 寻常巷陌, 人道寄奴曾住."] +note = [] +content = "斜阳/草树/, 寻常/巷陌/, 人道/寄奴/曾住./" +translation = "斜阳照着长满草树的普通街道, 人们说那里是刘裕曾经住过的地方" +keyword_note = { "寻常" = "普通", "巷陌" = "街道", "寄奴" = "南朝宋武帝刘裕小名" } + +["想当年, 金戈铁马, 气吞万里如虎."] +note = [] +content = "想/当年/, 金戈/铁马/, 气吞/万里/如虎./" +translation = "遥想当年, 他指挥着强劲精良的兵马, 气吞骄虏一如猛虎" +keyword_note = { "金戈铁马" = "指精锐的部队", "气吞万里" = "形容气势磅礴" } + +["元嘉草草, 封狼居胥, 赢得仓皇北顾."] +note = [] +content = "元嘉/草草/, 封/狼居胥/, 赢得/仓皇/北顾./" +translation = "宋文帝兴兵北伐多么轻率鲁莽, 想建立不朽战功封狼居胥, 却落得仓皇逃命, 北望追兵泪下无数的结果" +keyword_note = { "元嘉" = "刘裕子刘义隆年号", "草草" = "轻率", "封狼居胥" = "指立大功", "赢得" = "剩得, 落得" } + +["四十三年, 望中犹记, 烽火扬州路."] +note = [] +content = "四十/三年/, 望中/犹记/, 烽火/扬州/路./" +translation = "四十三年过去了, 如今瞭望长江北岸, 仍然记得当年扬州地区金兵南侵时烽火连天的情景" +keyword_note = { "四十三年" = "作者于1162年南归, 到写该词时正好为四十三年", "烽火" = "战火", "扬州路" = "扬州地区" } + +["可堪回首, 佛狸祠下, 一片神鸦社鼓."] +note = [] +content = "可堪/回首/, 佛狸/祠下/, 一片/神鸦/社鼓./" +translation = "不堪回首, 拓跋焘的行宫下, 神鸦叫声应和着喧闹的社鼓" +keyword_note = { "可堪" = "怎能忍受", "佛狸祠" = "北魏太武帝拓跋焘小名佛狸, 在瓜步山上建立的行宫", "神鸦" = "在庙里吃祭品的乌鸦", "社鼓" = "祭祀时的鼓声" } + +["凭谁问: 廉颇老矣, 尚能饭否?"] +note = [] +content = "凭谁/问:/ 廉颇/老矣/, 尚能/饭否?/" +translation = "还有谁会询问, 廉颇将军已老, 他的身体是否强健如故" +keyword_note = { "廉颇" = "战国时赵国名将", "尚能饭否" = "还能吃饭吗 (指身体是否强健) " } + +["江城子·乙卯正月二十日夜记梦"] +note = [] +content = "江城子·乙卯正月二十日夜记梦/" +translation = "江城子·乙卯正月二十日夜记梦" +keyword_note = {} + +["十年生死两茫茫, 不思量, 自难忘"] +note = [] +content = "十年/生死/两/茫茫/, 不/思量/, 自/难忘/" +translation = "你我夫妻诀别已经整整十年, 强忍不去思念可终究难以忘怀" +keyword_note = { "十年" = "指结发妻子王弗去世已十年", "思量" = "想念", "茫茫" = "模糊不清的样子" } + +["千里孤坟, 无处话凄凉"] +note = [] +content = "千里/孤坟/, 无处/话/凄凉/" +translation = "你的坟墓远在千里之外, 没有地方能诉说我心中的悲伤凄凉" +keyword_note = { "千里" = "王弗葬地四川眉山与苏轼任所山东密州, 相隔遥远", "孤坟" = "其妻王氏之墓", "凄凉" = "悲伤寂寞" } + +["纵使相逢应不识, 尘满面, 鬓如霜"] +note = [] +content = "纵使/相逢/应/不识/, 尘/满面/, 鬓/如霜/" +translation = "即使你我夫妻相逢怕是也认不出我来了, 我四处奔波早已是灰尘满面两鬓如霜" +keyword_note = { "纵使" = "即使", "尘满面" = "形容奔波劳碌", "鬓如霜" = "两鬓斑白如霜" } + +["夜来幽梦忽还乡, 小轩窗, 正梳妆"] +note = [] +content = "夜来/幽梦/忽/还乡/, 小轩窗/, 正/梳妆/" +translation = "昨夜在梦中回到了家乡, 看见你正在小室的窗前对镜梳妆" +keyword_note = { "幽梦" = "梦境隐约, 故云幽梦", "小轩窗" = "指小室的窗前", "梳妆" = "梳洗打扮" } + +["相顾无言, 惟有泪千行"] +note = [] +content = "相顾/无言/, 惟有/泪/千行/" +translation = "你我二人默默相对无言, 只有泪落千行" +keyword_note = { "相顾" = "互相看着", "无言" = "没有说话", "泪千行" = "形容泪水极多" } + +["料得年年肠断处, 明月夜, 短松冈"] +note = [] +content = "料得/年年/肠断/处/, 明月夜/, 短松冈/" +translation = "料想你年年都为我柔肠寸断, 在那凄冷的月明之夜, 在那长满矮松的山冈上" +keyword_note = { "料得" = "预料到", "肠断" = "形容极度悲痛", "短松冈" = "苏轼葬妻之地, 矮小的松树山冈" } + +["涉江采芙蓉"] +note = [] +content = "涉江采芙蓉/" +translation = "涉江采芙蓉" +keyword_note = {} + +["涉江采芙蓉, 兰泽多芳草."] +note = [] +content = "涉江/采芙蓉/, 兰泽/多芳草./" +translation = "我涉过江水去采荷花, 生有兰草的水泽中长满了香草" +keyword_note = { "芙蓉" = "荷花的别名", "兰泽" = "生有兰草的沼泽地" } + +["采之欲遗谁? 所思在远道."] +note = [] +content = "采之/欲遗谁/? 所思/在远道./" +translation = "采了荷花想要送给谁呢? 想要送给远方的爱人" +keyword_note = { "遗" = "赠", "远道" = "远方" } + +["还顾望旧乡, 长路漫浩浩."] +note = [] +content = "还顾/望旧乡/, 长路/漫浩浩./" +translation = "回头看那一起生活过的故乡, 路途遥远没有尽头" +keyword_note = { "还顾" = "回顾, 回头看", "旧乡" = "故乡", "漫浩浩" = "形容路途的遥远无尽头, 形容无边无际" } + +["同心而离居, 忧伤以终老."] +note = [] +content = "同心/而离居/, 忧伤/以终老./" +translation = "两心相爱却要分隔两地不能在一起, 愁苦忧伤以至终老异乡" +keyword_note = { "同心" = "古代习用的成语, 多用于男女之间的爱情或夫妇感情融洽指感情深厚", "终老" = "度过晚年直至去世" } + +["燕歌行"] +note = [] +content = "燕歌行/" +translation = "燕歌行" +keyword_note = {} + +["开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉."] +note = ['序言部分'] +content = "开元/二十六年/, 客/有/从/元戎/出塞/而还/者/, 作/《燕歌行》/以/示/, 适/感/征戍/之事/, 因而/和/焉./" +translation = "唐玄宗开元二十六年, 有个随从主帅出塞回来的人, 写了一首《燕歌行》给我看. 我感慨于边疆戍守的事, 因而写了这首《燕歌行》应和他. " +keyword_note = { "元戎" = "军事元帅", "征戍" = "边疆戍守", "和" = "应和" } + +["汉家烟尘在东北, 汉将辞家破残贼."] +note = [] +content = "汉家/烟尘/在/东北/, 汉将/辞家/破/残贼./" +translation = "汉朝东北边境战事又起, 将军离家前去征讨贼寇. " +keyword_note = { "汉家" = "汉朝, 唐人诗中经常借汉说唐", "烟尘" = "代指战争", "残贼" = "凶残的敌人" } + +["男儿本自重横行, 天子非常赐颜色."] +note = [] +content = "男儿/本自/重/横行/, 天子/非常/赐/颜色./" +translation = "男儿本来就看重驰骋沙场, 杀敌打仗, 皇帝又特别给予他们丰厚的赏赐. " +keyword_note = { "横行" = "任意驰走, 无所阻挡", "非常赐颜色" = "超过平常的厚赐礼遇" } + +["摐金伐鼓下榆关, 旌旆逶迤碣石间."] +note = [] +content = "摐金/伐鼓/下/榆关/, 旌旆/逶迤/碣石/间./" +translation = "擂响金鼓, 军队浩浩荡荡开出山海关外, 旌旗舒展飘扬在碣石山间. " +keyword_note = { "摐金" = "撞击金属乐器", "伐鼓" = "敲击战鼓", "榆关" = "山海关", "旌旆" = "各种旗帜", "逶迤" = "舒展的样子" } + +["校尉羽书飞瀚海, 单于猎火照狼山."] +note = [] +content = "校尉/羽书/飞/瀚海/, 单于/猎火/照/狼山./" +translation = "校尉飞奔过浩瀚沙海, 紧急传递文书, 匈奴单于打猎时点燃的火光已照到我狼山. " +keyword_note = { "校尉" = "次于将军的武官", "羽书" = "插有鸟羽的紧急文书", "瀚海" = "沙漠", "单于" = "匈奴首领", "猎火" = "打猎时点燃的火光" } + +["山川萧条极边土, 胡骑凭陵杂风雨."] +note = [] +content = "山川/萧条/极/边土/, 胡骑/凭陵/杂/风雨./" +translation = "山河荒芜多萧条, 满目凄凉到边土, 胡人的骑兵来势凶猛, 如风雨交加. " +keyword_note = { "极" = "穷尽", "凭陵" = "仗势侵凌", "杂风雨" = "如风雨交加般凶猛" } + +["战士军前半死生, 美人帐下犹歌舞!"] +note = [] +content = "战士/军前/半/死生/, 美人/帐下/犹/歌舞!/" +translation = "战士在前线杀得昏天黑地, 不辨死生; 将军们依然逍遥自在地在营帐中观赏美人的歌舞! " +keyword_note = { "半死生" = "半生半死, 伤亡惨重" } + +["大漠穷秋塞草腓, 孤城落日斗兵稀."] +note = [] +content = "大漠/穷秋/塞草/腓/, 孤城/落日/斗兵/稀./" +translation = "深秋季节, 塞外沙漠上草木枯萎; 日落时分, 边城孤危, 作战的士兵越打越少. " +keyword_note = { "穷秋" = "深秋", "腓" = "枯萎", "斗兵稀" = "作战的士兵越打越少" } + +["身当恩遇常轻敌, 力尽关山未解围."] +note = ['常轻敌 一作: 恒轻敌'] +content = "身当/恩遇/常/轻敌/, 力尽/关山/未/解围./" +translation = "身受朝廷恩宠厚遇的主将常常不畏惧强敌, 战士筋疲力尽仍难解关山之围. " +keyword_note = { "身当恩遇" = "主将受朝廷的恩宠厚遇" } + +["铁衣远戍辛勤久, 玉箸应啼别离后."] +note = [] +content = "铁衣/远戍/辛勤/久/, 玉箸/应啼/别离/后./" +translation = "身披铁甲的征夫, 不知道守卫边疆多少年了, 那家中的思妇自丈夫被征走后, 应该一直在悲痛啼哭吧. " +keyword_note = { "铁衣" = "铁甲, 代指征夫", "玉箸" = "玉筷, 比喻思妇的泪水如注" } + +["少妇城南欲断肠, 征人蓟北空回首."] +note = [] +content = "少妇/城南/欲/断肠/, 征人/蓟北/空/回首./" +translation = "思妇独守故乡, 悲苦地牵肠挂肚, 征夫在边疆遥望家园空自回头. " +keyword_note = { "城南" = "京城长安的住宅区", "蓟北" = "唐朝东北边地" } + +["边庭飘飖那可度, 绝域苍茫无所有."] +note = ['飘飖 一作: 飘摇; 无所 一作: 更何'] +content = "边庭/飘飖/那/可/度/, 绝域/苍茫/无/所有./" +translation = "边塞战场动荡不安哪里能够轻易归来, 更遥远的边陲更加荒凉不毛. " +keyword_note = { "边庭" = "边塞战场", "飘飖" = "动荡不安", "绝域" = "更遥远的边陲", "无所有" = "更加荒凉不毛" } + +["杀气三时作阵云, 寒声一夜传刁斗."] +note = [] +content = "杀气/三时/作/阵云/, 寒声/一夜/传/刁斗./" +translation = "从早到晚杀气腾腾战云密布, 整夜里只听到巡更的刁斗声声悲伤. " +keyword_note = { "三时" = "晨、午、晚, 从早到夜", "阵云" = "战场上象征杀气的云", "刁斗" = "军中巡更报时和煮饭的两用铜器" } + +["相看白刃血纷纷, 死节从来岂顾勋!"] +note = ['血 一作: 雪'] +content = "相看/白刃/血/纷纷/, 死节/从来/岂/顾/勋!/" +translation = "战士们互相对望, 雪亮的战刀上染满了斑斑血迹; 坚守节操, 为国捐躯, 岂是为了个人的名利功勋? " +keyword_note = { "死节" = "为国捐躯", "岂顾勋" = "难道还顾及自己的功勋" } + +["君不见沙场征战苦, 至今犹忆李将军."] +note = [] +content = "君/不见/沙场/征战/苦/, 至今/犹忆/李将军./" +translation = "你没看见拼杀在沙场战斗多惨苦, 现在还在思念有勇有谋的李将军. " +keyword_note = { "李将军" = "指汉朝李广, 他能捍御强敌, 爱抚士卒" } + +["琵琶行"] +note = [] +content = "琵琶行/" +translation = "琵琶行" +keyword_note = {} + +["浔阳江头夜送客, 枫叶荻花秋瑟瑟."] +note = [] +content = "浔阳/江头/夜/送客/, 枫叶/荻花/秋/瑟瑟./" +translation = "夜晚到浔阳江头送别客人, 枫树、芦荻被秋风吹得飒飒作响" +keyword_note = { "浔阳江" = "万里长江流经江西省九江市北的一段", "瑟瑟" = "形容枫树、芦荻被秋风吹动的声音" } + +["主人下马客在船, 举酒欲饮无管弦."] +note = [] +content = "主人/下马/客/在船/, 举酒/欲饮/无/管弦./" +translation = "我和客人下马在船上设宴饯别, 举起酒杯想要饮酒却无助兴的音乐" +keyword_note = { "管弦" = "指音乐" } + +["醉不成欢惨将别, 别时茫茫江浸月."] +note = [] +content = "醉/不成欢/惨/将别/, 别时/茫茫/江/浸月./" +translation = "酒喝得不痛快更伤心将要分别, 临别时茫茫江水中浸着一轮冷月" +keyword_note = { "不成欢" = "不痛快", "江浸月" = "月亮倒映在江水中" } + +["忽闻水上琵琶声, 主人忘归客不发."] +note = [] +content = "忽闻/水上/琵琶/声/, 主人/忘归/客/不发./" +translation = "忽然听见江面传来阵阵琵琶声, 我忘却了回归, 客人也不想动身" +keyword_note = { "不发" = "不动身" } + +["寻声暗问弹者谁, 琵琶声停欲语迟."] +note = [] +content = "寻声/暗问/弹者/谁/, 琵琶/声停/欲语/迟./" +translation = "寻着声源探问弹琵琶的是何人? 琵琶声停了许久却迟迟不语" +keyword_note = { "暗问" = "轻声询问", "欲语迟" = "想说又迟疑" } + +["移船相近邀相见, 添酒回灯重开宴."] +note = [] +content = "移船/相近/邀/相见/, 添酒/回灯/重/开宴./" +translation = "我们移船靠近邀请她出来相见, 重新拨亮灯光再添酒摆开宴席" +keyword_note = { "回灯" = "重新拨亮灯光" } + +["千呼万唤始出来, 犹抱琵琶半遮面."] +note = [] +content = "千呼/万唤/始/出来/, 犹抱/琵琶/半/遮面./" +translation = "千呼万唤她才缓缓地走出来, 用怀里抱着的琵琶半遮着面" +keyword_note = { "始" = "才", "犹" = "还" } + +["转轴拨弦三两声, 未成曲调先有情."] +note = [] +content = "转轴/拨弦/三两/声/, 未成/曲调/先/有情./" +translation = "她拧转弦轴, 拨动弦丝, 试弹了几声, 还没弹成曲调却先有了感情" +keyword_note = { "转轴拨弦" = "调弦校音" } + +["弦弦掩抑声声思, 似诉平生不得志."] +note = [] +content = "弦弦/掩抑/声声/思/, 似诉/平生/不得/志./" +translation = "一弦弦凄楚悲切的声音隐含着深长的情思, 似乎在诉说着她一生的不如意" +keyword_note = { "掩抑" = "声音低沉", "思" = "深长的情思" } + +["低眉信手续续弹, 说尽心中无限事."] +note = [] +content = "低眉/信手/续续/弹/, 说尽/心中/无限/事./" +translation = "她低着眉头随手慢慢地连续弹奏, 尽情地倾诉心底无限的伤心事" +keyword_note = { "信手" = "随手", "续续" = "连续" } + +["轻拢慢捻抹复挑, 初为《霓裳》后《六幺》."] +note = [] +content = "轻拢/慢捻/抹/复挑/, 初为/《霓裳》/后/《六幺》./" +translation = "轻轻抚拢慢慢捻揉下抹又上挑, 初弹《霓裳羽衣曲》接着再弹《六幺》" +keyword_note = { "拢" = "扣弦", "捻" = "揉弦", "抹" = "顺手下拨", "挑" = "反手回拨", "《霓裳》" = "《霓裳羽衣曲》", "《六幺》" = "大曲名" } + +["大弦嘈嘈如急雨, 小弦切切如私语."] +note = [] +content = "大弦/嘈嘈/如/急雨/, 小弦/切切/如/私语./" +translation = "大弦声音沉重抑扬如暴风骤雨, 小弦细促轻幽、急切细碎, 如人窃窃私语" +keyword_note = { "大弦" = "最粗的弦", "嘈嘈" = "声音沉重抑扬", "小弦" = "最细的弦", "切切" = "细促轻幽" } + +["嘈嘈切切错杂弹, 大珠小珠落玉盘."] +note = [] +content = "嘈嘈/切切/错杂/弹/, 大珠/小珠/落/玉盘./" +translation = "嘈嘈声切切声互为交错地弹奏, 就像大珠小珠一颗颗掉落玉盘" +keyword_note = { "错杂" = "交错" } + +["间关莺语花底滑, 幽咽泉流冰下难."] +note = [] +content = "间关/莺语/花底/滑/, 幽咽/泉流/冰下/难./" +translation = "一会儿像黄鹂在花下啼鸣婉转流利, 一会儿又像泉水在冰下流动滞涩不畅" +keyword_note = { "间关" = "鸟鸣声", "幽咽" = "遏塞不畅状" } + +["冰泉冷涩弦凝绝, 凝绝不通声暂歇."] +note = [] +content = "冰泉/冷涩/弦/凝绝/, 凝绝/不通/声/暂歇./" +translation = "好像冰泉冷涩琵琶声开始凝滞, 凝滞而不通畅声音渐渐地停歇" +keyword_note = { "凝绝" = "凝滞" } + +["别有幽愁暗恨生, 此时无声胜有声."] +note = [] +content = "别有/幽愁/暗恨/生/, 此时/无声/胜/有声./" +translation = "像另有一种愁思幽恨暗暗滋生, 此时闷闷无声却比有声更动人" +keyword_note = { "幽愁" = "深藏的愁思", "暗恨" = "隐秘的怨恨" } + +["银瓶乍破水浆迸, 铁骑突出刀枪鸣."] +note = [] +content = "银瓶/乍破/水浆/迸/, 铁骑/突出/刀枪/鸣./" +translation = "突然间好像银瓶撞破水浆四溅, 又好像铁甲骑兵厮杀刀枪齐鸣" +keyword_note = { "乍破" = "突然破裂", "迸" = "溅射" } + +["曲终收拨当心画, 四弦一声如裂帛."] +note = [] +content = "曲终/收拨/当心/画/, 四弦/一声/如/裂帛./" +translation = "一曲终了拨子从弦索中间划过四弦, 一声轰鸣好像撕裂了布帛" +keyword_note = { "收拨" = "结束弹奏", "当心画" = "在琵琶中部划过四弦" } + +["东船西舫悄无言, 唯见江心秋月白."] +note = [] +content = "东船/西舫/悄/无言/, 唯见/江心/秋月/白./" +translation = "东西面的画舫、游船都静悄悄的, 只看见江心之中映着的秋月泛着白光" +keyword_note = { "舫" = "船" } + +["沉吟放拨插弦中, 整顿衣裳起敛容."] +note = [] +content = "沉吟/放拨/插/弦中/, 整顿/衣裳/起/敛容./" +translation = "她沉吟着收起拨片插在琴弦中; 然后整理一下衣服起身站立, 收敛面部表情" +keyword_note = { "敛容" = "收敛表情" } + +["自言本是京城女, 家在虾蟆陵下住."] +note = [] +content = "自言/本是/京城/女/, 家在/虾蟆陵/下/住./" +translation = "她说她本是京城负有盛名的歌女, 老家住在长安城东南的虾蟆陵" +keyword_note = { "虾蟆陵" = "在长安城东南, 是当时有名的游乐地区" } + +["十三学得琵琶成, 名属教坊第一部."] +note = [] +content = "十三/学得/琵琶/成/, 名属/教坊/第一/部./" +translation = "十三岁就已学会弹奏琵琶技艺, 名字登记在教坊乐团的第一部里" +keyword_note = { "教坊" = "唐代官办管领音乐杂技、教练歌舞的机关" } + +["曲罢曾教善才服, 妆成每被秋娘妒."] +note = [] +content = "曲罢/曾教/善才/服/, 妆成/每被/秋娘/妒./" +translation = "每曲弹罢都令艺术大师们叹服, 每次妆成都被同行歌伎们嫉妒" +keyword_note = { "善才" = "对琵琶师或曲师的通称", "秋娘" = "唐代歌妓女伶的通称" } + +["五陵年少争缠头, 一曲红绡不知数."] +note = [] +content = "五陵/年少/争/缠头/, 一曲/红绡/不知/数./" +translation = "京城的富贵子弟争着赠送财物, 每当一曲弹罢, 不知要给多少彩绸" +keyword_note = { "五陵" = "在长安城外, 汉代五个皇帝的陵墓", "缠头" = "送给歌舞妓女的财物", "红绡" = "精细轻美的丝织品" } + +["钿头银篦击节碎, 血色罗裙翻酒污."] +note = [] +content = "钿头/银篦/击节/碎/, 血色/罗裙/翻酒/污./" +translation = "打拍子敲碎了镶嵌着花钿的篦形发饰, 吃美酒染污了红色罗裙" +keyword_note = { "钿头银篦" = "镶嵌着花钿的篦形发饰", "击节" = "打拍子" } + +["今年欢笑复明年, 秋月春风等闲度."] +note = [] +content = "今年/欢笑/复/明年/, 秋月/春风/等闲/度./" +translation = "年复一年都在欢笑打闹中度过, 秋去春来美好的时光白白消磨" +keyword_note = { "等闲" = "随便, 轻易" } + +["弟走从军阿姨死, 暮去朝来颜色故."] +note = [] +content = "弟走/从军/阿姨/死/, 暮去/朝来/颜色/故./" +translation = "教坊的兄弟参军去了, 当家的阿姨也死了, 暮去朝来我也年老色衰" +keyword_note = { "颜色故" = "容貌衰老" } + +["门前冷落鞍马稀, 老大嫁作商人妇."] +note = [] +content = "门前/冷落/鞍马/稀/, 老大/嫁作/商人/妇./" +translation = "门前车马减少, 光顾者寥寥, 年岁大了我只得嫁给商人为妻" +keyword_note = { "老大" = "年纪大了" } + +["商人重利轻别离, 前月浮梁买茶去."] +note = [] +content = "商人/重利/轻/别离/, 前月/浮梁/买茶/去./" +translation = "商人重利不重情常常轻易别离, 上个月他到浮梁买茶办货去了" +keyword_note = { "浮梁" = "古县名, 在今江西省景德镇市, 盛产茶叶" } + +["去来江口守空船, 绕船月明江水寒."] +note = [] +content = "去来/江口/守/空船/, 绕船/月明/江水/寒./" +translation = "他去了留下我在江口孤守空船, 只有秋月与我作伴, 绕船的秋水凄寒" +keyword_note = { "去来" = "走了以后" } + +["夜深忽梦少年事, 梦啼妆泪红阑干."] +note = [] +content = "夜深/忽梦/少年/事/, 梦啼/妆泪/红/阑干./" +translation = "深夜常常梦到少年时作乐狂欢, 梦中哭醒涕泪纵横污损了粉颜" +keyword_note = { "梦啼妆泪" = "梦中啼哭, 匀过脂粉的脸上带着泪痕", "阑干" = "纵横散乱的样子" } + +["我闻琵琶已叹息, 又闻此语重唧唧."] +note = [] +content = "我闻/琵琶/已/叹息/, 又闻/此语/重/唧唧./" +translation = "我听了琵琶声早已摇头叹息, 又听到她这番诉说更加歔欷" +keyword_note = { "唧唧" = "叹息声" } + +["同是天涯沦落人, 相逢何必曾相识!"] +note = [] +content = "同是/天涯/沦落/人/, 相逢/何必/曾/相识!/" +translation = "同样都是天涯沦落的可怜人, 今日相逢何必问曾经是否相识" +keyword_note = { "天涯" = "指远离家乡的地方", "沦落" = "流落, 漂泊" } + +["我从去年辞帝京, 谪居卧病浔阳城."] +note = [] +content = "我从/去年/辞/帝京/, 谪居/卧病/浔阳/城./" +translation = "自从去年我离开繁华长安京城, 被贬居住在浔阳江畔便一直因病卧床" +keyword_note = { "帝京" = "指长安", "谪居" = "被贬官后居住" } + +["浔阳地僻无音乐, 终岁不闻丝竹声."] +note = [] +content = "浔阳/地僻/无/音乐/, 终岁/不闻/丝竹/声./" +translation = "浔阳这地方荒凉偏僻没有音乐, 一年到头也听不见管弦奏鸣" +keyword_note = { "丝竹" = "指音乐" } + +["住近湓江地低湿, 黄芦苦竹绕宅生."] +note = [] +content = "住近/湓江/地/低湿/, 黄芦/苦竹/绕宅/生./" +translation = "居住在湓江附近, 低洼潮湿, 院子周围, 尽长些黄芦苦竹" +keyword_note = { "湓江" = "河流名", "黄芦" = "芦苇", "苦竹" = "竹的一种" } + +["其间旦暮闻何物? 杜鹃啼血猿哀鸣."] +note = [] +content = "其间/旦暮/闻/何物/? 杜鹃/啼血/猿/哀鸣./" +translation = "在这里早晚能听到的是什么呢? 尽是杜鹃猿猴那些悲凄的哀鸣" +keyword_note = { "杜鹃啼血" = "杜鹃鸟啼声悲切" } + +["春江花朝秋月夜, 往往取酒还独倾."] +note = [] +content = "春江/花朝/秋月/夜/, 往往/取酒/还/独倾./" +translation = "在春天江边花儿开放的早上, 或在秋天明月高悬的夜晚, 我常常取酒独酌独饮" +keyword_note = { "花朝" = "花开的早晨", "独倾" = "独自饮酒" } + +["岂无山歌与村笛, 呕哑嘲哳难为听."] +note = [] +content = "岂无/山歌/与/村笛/, 呕哑/嘲哳/难为/听./" +translation = "难道这里就没有山歌和村笛吗? 只是那音调嘶哑粗涩实在难听" +keyword_note = { "呕哑嘲哳" = "形容声音噪杂" } + +["今夜闻君琵琶语, 如听仙乐耳暂明."] +note = [] +content = "今夜/闻君/琵琶/语/, 如听/仙乐/耳/暂明./" +translation = "今晚我听你弹奏琵琶诉说衷情, 就像听到了天上的仙乐, 让我的耳朵暂时得到了清明" +keyword_note = { "琵琶语" = "琵琶声, 琵琶所弹奏的乐曲", "暂" = "突然" } + +["莫辞更坐弹一曲, 为君翻作《琵琶行》."] +note = [] +content = "莫辞/更坐/弹/一曲/, 为君/翻作/《琵琶行》./" +translation = "请你不要推辞坐下来再弹一曲; 我要为你创作一首新诗《琵琶行》" +keyword_note = { "翻作" = "创作" } + +["感我此言良久立, 却坐促弦弦转急."] +note = [] +content = "感我/此言/良久/立/, 却坐/促弦/弦/转急./" +translation = "被我的话所感动她站立了好久; 回身坐下再转紧琴弦拨出急声" +keyword_note = { "却坐" = "退回原处坐下", "促弦" = "把弦拧紧" } + +["凄凄不似向前声, 满座重闻皆掩泣."] +note = [] +content = "凄凄/不似/向前/声/, 满座/重闻/皆/掩泣./" +translation = "凄凄切切不似刚才奏过的单调, 在座的人重听都掩面哭泣不停" +keyword_note = { "向前声" = "刚才奏过的单调", "掩泣" = "掩面哭泣" } + +["座中泣下谁最多? 江州司马青衫湿."] +note = [] +content = "座中/泣下/谁/最多/? 江州/司马/青衫/湿./" +translation = "要问在座之中谁流的眼泪最多? 江州司马的青衫已被泪水浸湿" +keyword_note = { "青衫" = "唐朝八品、九品文官的服色" } + +["登岳阳楼"] +note = [] +content = "登岳阳楼/" +translation = "登岳阳楼" +keyword_note = {} + +["昔闻洞庭水, 今上岳阳楼."] +note = [] +content = "昔闻/洞庭水/, 今上/岳阳楼./" +translation = "以前就听说洞庭湖波澜壮阔, 今日终于如愿登上岳阳楼" +keyword_note = { "洞庭水" = "即洞庭湖, 在今湖南北部, 长江南岸, 是中国第二淡水湖" } + +["吴楚东南坼, 乾坤日夜浮."] +note = [] +content = "吴楚/东南/坼/, 乾坤/日夜/浮./" +translation = "浩瀚的湖水把吴楚两地分隔开来, 整个天地仿似在湖中日夜浮动" +keyword_note = { "坼" = "分裂", "乾坤" = "天地, 或指日月", "浮" = "日月星辰和大地昼夜都飘浮在洞庭湖上" } + +["亲朋无一字, 老病有孤舟."] +note = [] +content = "亲朋/无/一字/, 老病/有/孤舟./" +translation = "亲朋好友音信全无, 年老多病唯有孤舟一叶飘零无定" +keyword_note = { "一字" = "音讯全无, 这里指书信", "老病" = "杜甫时年五十七岁, 身患肺病, 风痹, 右耳已聋", "孤舟" = "唯有孤舟一叶飘零无定" } + +["戎马关山北, 凭轩涕泗流."] +note = [] +content = "戎马/关山/北/, 凭轩/涕泗/流./" +translation = "北方边境的战争仍未止息, 凭栏遥望, 胸怀家国泪水横流" +keyword_note = { "戎马" = "指战争", "关山北" = "北方边境", "凭轩" = "凭栏", "涕泗流" = "眼泪禁不住地流淌" } + +["登快阁"] +note = [] +content = "登快阁/" +translation = "登快阁" +keyword_note = {} + +["痴儿了却公家事, 快阁东西倚晚晴."] +note = [] +content = "痴儿/了却/公家事/, 快阁/东西/倚/晚晴./" +translation = "我办完了公事, 登上快阁, 在这晚晴的余辉里倚栏远眺" +keyword_note = { "痴儿" = "作者自指", "了却" = "完成", "东西" = "东边和西边, 指在阁中四处周览", "倚" = "倚靠" } + +["落木千山天远大, 澄江一道月分明."] +note = [] +content = "落木/千山/天/远大/, 澄江/一道/月/分明./" +translation = "远望秋山无数, 落叶飘零, 天地更加辽远阔大. 朗朗明月下澄江淙淙流过, 月光下显得更加空明澄澈" +keyword_note = { "落木" = "落叶", "澄江" = "指赣江, 澄澈清澈" } + +["朱弦已为佳人绝, 青眼聊因美酒横."] +note = [] +content = "朱弦/已为/佳人/绝/, 青眼/聊因/美酒/横./" +translation = "友人远离, 早已没有弄弦吹箫的兴致了, 只有见到美酒, 眼中才流露出喜色" +keyword_note = { "朱弦" = "这里指琴", "佳人" = "美人, 引申为知己、知音", "青眼" = "黑色的眼珠在眼眶中间, 表示对人的喜爱或重视", "聊" = "姑且" } + +["万里归船弄长笛, 此心吾与白鸥盟."] +note = [] +content = "万里/归船/弄/长笛/, 此心/吾与/白鸥/盟./" +translation = "我从万里之外的远地乘船归来, 在船上吹起长笛; 我的这颗心, 将愿与白鸥结为朋友" +keyword_note = { "弄" = "演奏", "与白鸥盟" = "指无利禄之心, 借指归隐" } + +["登泰山记"] +note = [] +content = "登泰山记/" +translation = "登泰山记" +keyword_note = {} + +["泰山之阳, 汶水西流; 其阴, 济水东流."] +note = [] +content = "泰山/之阳/, 汶水/西流; /其阴/, 济水/东流./" +translation = "泰山的南面, 汶水向西流; 它的北面, 济水向东流" +keyword_note = { "阳" = "山的南面", "汶水" = "也叫汶河, 发源于山东莱芜东北原山", "西流" = "向西流 (西: 名词作状语) ", "阴" = "山的北面", "济水" = "发源于河南省济源市王屋山" } + +["阳谷皆入汶, 阴谷皆入济."] +note = [] +content = "阳谷/皆入/汶/, 阴谷/皆入/济./" +translation = "南面山谷的水都流入汶水, 北面山谷的水都流入济水" +keyword_note = { "阳谷" = "指山南面谷中的水", "阴谷" = "指山北面谷中的水" } + +["当其南北分者, 古长城也."] +note = [] +content = "当其/南北/分者/, 古长城/也./" +translation = "在那南北山谷分界的地方, 是古长城" +keyword_note = { "当其南北分者" = "在那 (阳谷和阴谷) 南北分界处的", "古长城" = "指春秋时期齐国所筑长城的遗址" } + +["最高日观峰, 在长城南十五里."] +note = [] +content = "最高/日观峰/, 在/长城/南/十五里./" +translation = "最高处的日观峰, 在古长城南面十五里" +keyword_note = { "日观峰" = "在山顶东岩, 是泰山观日出的地方" } + +["余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安."] +note = [] +content = "余/以/乾隆/三十九年/十二月/, 自/京师/乘/风雪/, 历/齐河/、长清/, 穿/泰山/西北/谷/, 越/长城/之限/, 至于/泰安./" +translation = "我在乾隆三十九年十二月, 从京城冒着风雪启程, 经过齐河、长清两县, 穿过泰山西北面的山谷, 越过长城的城墙, 到了泰安" +keyword_note = { "以" = "在", "乾隆三十九年" = "即1774年", "乘" = "趁, 这里有'冒着'的意思", "限" = "门槛, 这里指像一道门槛的城墙", "至于" = "到, 到达 (古今异义) " } + +["是月丁未, 与知府朱孝纯子颍由南麓登."] +note = [] +content = "是月/丁未/, 与/知府/朱孝纯/子颍/由/南麓/登./" +translation = "这月丁未日, 我同知府朱孝纯从南面的山脚上山" +keyword_note = { "丁未" = "丁未日 (十二月二十八日) ", "朱孝纯子颍" = "朱孝纯, 字子颖. 当时是泰安府的知府" } + +["四十五里, 道皆砌石为磴, 其级七千有余."] +note = [] +content = "四十五里/, 道/皆/砌石/为磴/, 其级/七千/有余./" +translation = "四十五里长的路上, 都是石头砌的台阶, 有七千多级" +keyword_note = { "磴" = "石阶", "级" = "石级", "有" = "通'又', 用来连接整数和零数" } + +["泰山正南面有三谷."] +note = [] +content = "泰山/正南面/有/三谷./" +translation = "泰山正南面有三个山谷" +keyword_note = {} + +["中谷绕泰安城下, 郦道元所谓环水也."] +note = [] +content = "中谷/绕/泰安/城下/, 郦道元/所谓/环水/也./" +translation = "中谷的水环绕泰安城, 这就是郦道元书中所说的环水" +keyword_note = { "环水" = "即中溪, 俗称梳洗河, 流出泰山" } + +["余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅."] +note = [] +content = "余/始/循/以入/, 道/少半/, 越/中岭/, 复/循/西谷/, 遂/至/其巅./" +translation = "我起初沿着中间的山谷进山, 走了一小半段, 越过中岭, 又沿着西面的山谷走, 就到了山顶" +keyword_note = { "循以入" = "顺着 (中谷) 进去", "道少半" = "路不到一半", "中岭" = "即黄岘岭, 又名中溪山", "复" = "再, 又 (古今异义) " } + +["古时登山, 循东谷入, 道有天门."] +note = [] +content = "古时/登山/, 循/东谷/入/, 道/有/天门./" +translation = "古时候登泰山, 是沿着东面的山谷进去, 路上有个天门" +keyword_note = { "天门" = "泰山峰名" } + +["东谷者, 古谓之天门溪水, 余所不至也."] +note = [] +content = "东谷者/, 古/谓之/天门/溪水/, 余/所/不至/也./" +translation = "这东边的山谷, 古时候称它为'天门溪水', 我没有到过那里" +keyword_note = {} + +["今所经中岭及山巅, 崖限当道者, 世皆谓之天门云."] +note = [] +content = "今/所经/中岭/及/山巅/, 崖限/当道者/, 世/皆谓/之/天门/云./" +translation = "现在 (我) 经过的中岭和山顶, 有山崖像门槛一样横在路上的, 人们都叫它天门" +keyword_note = { "崖限当道者" = "挡在路上的像门槛一样的山崖 (限: 名词作状语) ", "云" = "语气助词" } + +["道中迷雾冰滑, 磴几不可登."] +note = [] +content = "道中/迷雾/冰滑/, 磴/几/不可/登./" +translation = "一路上大雾弥漫、冰冻溜滑, 石阶几乎无法攀登" +keyword_note = { "几" = "几乎" } + +["及既上, 苍山负雪, 明烛天南."] +note = [] +content = "及/既上/, 苍山/负雪/, 明烛/天南./" +translation = "等到已经登上山顶, 只见青山上覆盖着白雪, (雪) 光照亮了南面的天空" +keyword_note = { "负" = "背", "烛" = "动词, 照" } + +["望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然."] +note = [] +content = "望/晚日/照/城郭/, 汶水/、徂徕/如画/, 而/半山/居雾/若带/然./" +translation = "远望夕阳映照着泰安城, 汶水、徂徕山就像是一幅美丽的山水画, 停留在半山腰处的云雾, 又像是一条舞动的飘带似的" +keyword_note = { "徂徕" = "山名, 在泰安东南", "居" = "停留" } + +["戊申晦, 五鼓, 与子颍坐日观亭, 待日出."] +note = [] +content = "戊申/晦/, 五鼓/, 与/子颍/坐/日观亭/, 待/日出./" +translation = "戊申这一天是月底, 五更的时候, 我和子颍坐在日观亭里, 等待日出" +keyword_note = { "戊申晦" = "戊申这一天是月底. 晦: 农历每月最后一天 (古今异义) ", "五鼓" = "五更", "日观亭" = "亭名, 在日观峰上" } + +["大风扬积雪击面."] +note = [] +content = "大风/扬/积雪/击面./" +translation = "这时大风扬起的积雪扑面打来" +keyword_note = {} + +["亭东自足下皆云漫."] +note = [] +content = "亭东/自/足下/皆/云漫./" +translation = "日观亭东面从脚底往下一片云雾弥漫" +keyword_note = { "漫" = "弥漫" } + +["稍见云中白若樗蒱数十立者, 山也."] +note = [] +content = "稍见/云中/白若/樗蒱/数十/立者/, 山/也./" +translation = "依稀可见云中几十个白色的像骰子似的东西, 那是山峰" +keyword_note = { "樗蒲" = "古代的一种赌博游戏, 这里指博戏用的'五木'. 五木两头尖, 中间广平, 立起来很像山峰" } + +["极天云一线异色, 须臾成五采."] +note = [] +content = "极天/云/一线/异色/, 须臾/成/五采./" +translation = "天边的云彩形成一条线 (呈现出) 奇异的颜色, 一会儿又变成五颜六色的" +keyword_note = { "极天" = "天边", "采" = "通'彩'" } + +["日上, 正赤如丹, 下有红光动摇承之."] +note = [] +content = "日上/, 正赤/如丹/, 下/有/红光/动摇/承之./" +translation = "太阳升上来了, 红的像朱砂一样, 下面有红光晃动摇荡着托着它" +keyword_note = { "丹" = "朱砂" } + +["或曰, 此东海也."] +note = [] +content = "或曰/, 此/东海/也./" +translation = "有人说, 这是东海" +keyword_note = { "东海" = "泛指东面的海. 这里是想象, 实际上在泰山顶上看不见东海" } + +["回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻."] +note = [] +content = "回视/日观/以西/峰/, 或/得日/或否/, 绛皓/驳色/, 而/皆/若偻./" +translation = "回头看日观峰以西的山峰, 有的被日光照到, 有的没照到, 或红或白, 颜色错杂, 都像弯腰曲背鞠躬致敬的样子" +keyword_note = { "或得日或否" = "有的被日光照着, 有的没有照着", "绛皓驳色" = "或红或白, 颜色错杂. 绛, 大红. 皓: 白色. 驳: 杂", "若偻" = "像脊背弯曲的样子. 引申为鞠躬、致敬的样子" } + +["亭西有岱祠, 又有碧霞元君祠."] +note = [] +content = "亭西/有/岱祠/, 又/有/碧霞/元君/祠./" +translation = "日观亭西面有岱祠, 还有碧霞元君祠" +keyword_note = { "岱祠" = "东岳大帝庙", "碧霞元君" = "传说是东岳大帝的女儿" } + +["皇帝行宫在碧霞元君祠东."] +note = [] +content = "皇帝/行宫/在/碧霞/元君/祠/东./" +translation = "皇帝的行宫在碧霞元君祠的东面" +keyword_note = { "行宫" = "皇帝出外巡行时居住的住所" } + +["是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失."] +note = [] +content = "是日/观/道中/石刻/, 自/唐/显庆/以来/, 其/远古/刻/尽/漫失./" +translation = "这一天, (还) 观看了路上的石刻, 都是从唐朝显庆年间以来的, 那些更古老的石碑都已经模糊或缺失了" +keyword_note = { "显庆" = "唐高宗的年号", "漫失" = "模糊或缺失. 漫: 磨灭" } + +["僻不当道者, 皆不及往."] +note = [] +content = "僻/不当/道者/, 皆/不及/往./" +translation = "那些偏僻不对着道路的石刻, 都赶不上去看了" +keyword_note = { "僻不当道者" = "偏僻, 不在道路附近的", "不及" = "赶不上" } + +["山多石, 少土."] +note = [] +content = "山/多石/, 少土./" +translation = "山上石头多, 泥土少" +keyword_note = {} + +["石苍黑色, 多平方, 少圜."] +note = [] +content = "石/苍黑色/, 多/平方/, 少/圜./" +translation = "山石都呈青黑色, 大多是平的、方形的, 很少有圆形的" +keyword_note = { "平方" = "方方整整的, 指山石 (古今异义) ", "圜" = "通'圆'" } + +["少杂树, 多松, 生石罅, 皆平顶."] +note = [] +content = "少/杂树/, 多/松/, 生/石罅/, 皆/平顶./" +translation = "杂树很少, 多是松树, 松树都生长在石头的缝隙里, 树顶是平的" +keyword_note = { "石罅" = "石缝" } + +["冰雪, 无瀑水, 无鸟兽音迹."] +note = [] +content = "冰雪/, 无/瀑水/, 无/鸟兽/音迹./" +translation = "冰天雪地, 没有瀑布, 没有飞鸟走兽的声音和踪迹" +keyword_note = { "瀑水" = "瀑布" } + +["至日观数里内无树, 而雪与人膝齐."] +note = [] +content = "至/日观/数里/内/无树/, 而/雪/与/人膝/齐./" +translation = "日观峰附近几里以内没有树木, 积雪厚得同人的膝盖一样平齐" +keyword_note = {} + +["桐城姚鼐记."] +note = [] +content = "桐城/姚鼐/记./" +translation = "桐城姚鼐记述" +keyword_note = { "姚鼐" = "字姬传, 一字梦谷, 室名惜抱轩, 清代桐城人. 桐城派古文家" } + +["登高"] +note = [] +content = "登高/" +translation = "登高" +keyword_note = {} + +["风急天高猿啸哀, 渚清沙白鸟飞回."] +note = ['诗题一作《九日登高》. 古代农历九月九日有登高习俗. 选自《杜诗详注》. 作于唐代宗大历二年 (767) 秋天的重阳节./'] +content = "风急/天高/猿啸哀/, 渚清/沙白/鸟飞回./" +translation = "风急天高猿猴啼叫显得十分悲哀, 水清沙白的河洲上有鸟儿在急风中飞舞盘旋. " +keyword_note = { "猿啸哀" = "猿凄厉的叫声. 《水经注·江水》引民谣云: '巴东三峡巫峡长, 猿鸣三声泪沾裳. '", "渚" = "水中的小洲; 水中的小块陆地", "鸟飞回" = "鸟在急风中飞舞盘旋. 回: 回旋" } + +["无边落木萧萧下, 不尽长江滚滚来."] +note = [] +content = "无边/落木/萧萧下/, 不尽/长江/滚滚来./" +translation = "无边无际的树木萧萧地飘下落叶, 望不到头的长江水滚滚奔腾而来. " +keyword_note = { "落木" = "指秋天飘落的树叶", "萧萧" = "模拟草木飘落的声音" } + +["万里悲秋常作客, 百年多病独登台."] +note = [] +content = "万里/悲秋/常作客/, 百年/多病/独登台./" +translation = "悲对秋景感慨远离故乡长期漂泊, 晚年疾病缠身今日独上高台. " +keyword_note = { "万里" = "指远离故乡", "常作客" = "长期漂泊他乡", "百年" = "犹言一生, 这里借指晚年" } + +["艰难苦恨繁霜鬓, 潦倒新停浊酒杯."] +note = [] +content = "艰难/苦恨/繁霜鬓/, 潦倒/新停/浊酒杯./" +translation = "艰难至极, 愁苦繁多, 苍白鬓发如霜雪; 生活潦倒失意, 刚停下手里装着浊酒的酒杯. " +keyword_note = { "艰难" = "兼指国运和自身命运", "苦恨" = "极恨, 极其遗憾. 苦, 极", "繁霜鬓" = "像浓霜一样的鬓发", "潦倒" = "衰颓, 失意. 这里指衰老多病, 志不得伸", "新停" = "刚刚停止. 重阳登高, 按惯例应当喝酒. 可杜甫晚年因肺病戒酒, 所以说'新停'" } + +["短歌行"] +note = [] +content = "短歌行/" +translation = "短歌行" +keyword_note = {} + +["对酒当歌, 人生几何!"] +note = ['开篇抒发人生短暂的感慨'] +content = "对酒/当歌/, 人生/几何!/" +translation = "一边喝着酒, 一边唱着歌, 人生的岁月有多少. " +keyword_note = { "对酒" = "面对着酒", "当歌" = "应当唱歌", "几何" = "多少 (指岁月) " } + +["譬如朝露, 去日苦多."] +note = [] +content = "譬如/朝露/, 去日/苦多./" +translation = "好比晨露转瞬即逝, 已经逝去的时光实在太多! " +keyword_note = { "譬如" = "比如, 好比", "朝露" = "早晨的露水", "去日" = "逝去的日子", "苦多" = "实在太多" } + +["慨当以慷, 忧思难忘."] +note = [] +content = "慨当/以慷/, 忧思/难忘./" +translation = "宴会上的歌声激昂慷慨, 心中的忧愁却难以遗忘. " +keyword_note = { "慨当以慷" = "慷慨激昂", "忧思" = "忧愁思绪", "难忘" = "难以忘怀" } + +["何以解忧? 唯有杜康."] +note = ['杜康代指酒, 用具体代抽象'] +content = "何以/解忧/? 唯有/杜康./" +translation = "靠什么来排解忧闷? 唯有豪饮美酒. " +keyword_note = { "何以" = "用什么", "解忧" = "解除忧愁", "杜康" = "传说中造酒的人, 代指酒" } + +["青青子衿, 悠悠我心."] +note = ['化用《诗经》诗句, 表达对贤才的思慕'] +content = "青青/子衿/, 悠悠/我心./" +translation = "有学识的才子们啊, 你们令我朝夕思慕. " +keyword_note = { "子衿" = "读书人的衣领", "青青" = "青色的", "悠悠" = "长久的思念" } + +["但为君故, 沉吟至今."] +note = [] +content = "但为/君故/, 沉吟/至今./" +translation = "只是因为你们的缘故, 让我沉痛吟诵至今. " +keyword_note = { "但为" = "只因为", "君" = "您, 指贤才", "沉吟" = "深沉地吟诵" } + +["呦呦鹿鸣, 食野之苹."] +note = ['再次化用《诗经》, 表达礼遇贤才的诚意'] +content = "呦呦/鹿鸣/, 食野/之苹./" +translation = "阳光下鹿群呦呦欢鸣, 在原野吃着艾蒿. " +keyword_note = { "呦呦" = "鹿鸣声", "食野" = "在野外吃草", "苹" = "艾蒿" } + +["我有嘉宾, 鼓瑟吹笙."] +note = [] +content = "我有/嘉宾/, 鼓瑟/吹笙./" +translation = "一旦四方贤才光临舍下, 我将奏瑟吹笙宴请嘉宾. " +keyword_note = { "嘉宾" = "尊贵的客人", "鼓瑟" = "弹奏瑟", "吹笙" = "吹奏笙" } + +["明明如月, 何时可掇?"] +note = ['以明月喻贤才, 表达求贤若渴的心情'] +content = "明明/如月/, 何时/可掇?/" +translation = "高悬夜空的明月哟, 什么时候可以摘取呢? " +keyword_note = { "明明" = "明亮", "如月" = "像月亮", "可掇" = "可以摘取" } + +["忧从中来, 不可断绝."] +note = [] +content = "忧从/中来/, 不可/断绝./" +translation = "心中深深的忧思, 喷涌而出不能停止. " +keyword_note = { "忧" = "忧愁", "中" = "心中", "断绝" = "停止" } + +["越陌度阡, 枉用相存."] +note = [] +content = "越陌/度阡/, 枉用/相存./" +translation = "远方宾客穿越纵横交错的小路, 屈驾前来探望我. " +keyword_note = { "越陌度阡" = "穿过纵横小路", "枉用" = "屈驾", "相存" = "探望我" } + +["契阔谈讌, 心念旧恩."] +note = [] +content = "契阔/谈讌/, 心念/旧恩./" +translation = "久别重逢谈心宴饮, 重温那往日的恩情. " +keyword_note = { "契阔" = "久别", "谈讌" = "谈心宴饮", "旧恩" = "往日的情谊" } + +["月明星稀, 乌鹊南飞."] +note = ['以乌鹊南飞喻贤才寻找明主'] +content = "月明/星稀/, 乌鹊/南飞./" +translation = "月光明亮星光稀疏, 一群寻巢的喜鹊向南飞去. " +keyword_note = { "月明" = "月光明亮", "星稀" = "星星稀少", "乌鹊" = "乌鸦喜鹊" } + +["绕树三匝, 何枝可依?"] +note = [] +content = "绕树/三匝/, 何枝/可依?/" +translation = "环绕着树反复盘旋, 哪里才有它们栖身之处? " +keyword_note = { "绕树" = "绕着树飞", "三匝" = "三圈", "何枝" = "哪个树枝", "可依" = "可以依靠" } + +["山不厌高, 海不厌深."] +note = ['以山海为喻, 表达广纳贤才的胸怀'] +content = "山不/厌高/, 海不/厌深./" +translation = "高山不辞土石才见巍峨, 大海不弃涓流才见壮阔. " +keyword_note = { "厌" = "满足", "山不厌高" = "山不嫌高", "海不厌深" = "海不嫌深" } + +["周公吐哺, 天下归心."] +note = ['用周公典故, 表明自己礼贤下士的决心'] +content = "周公/吐哺/, 天下/归心./" +translation = "我愿如周公一般礼贤下士, 愿天下的英杰都真心归顺于我. " +keyword_note = { "周公" = "周文王之子", "吐哺" = "吐出食物 (接待贤士) ", "归心" = "真心归顺" } + +["石钟山记"] +note = [] +content = "石钟山记/" +translation = "石钟山记" +keyword_note = {} + +['《水经》云:"彭蠡之口有石钟山焉"'] +note = [] +content = '《水经》/云:/"彭蠡/之口/有/石钟山/焉/"/' +translation = "《水经》中说: '鄱阳湖的湖口有一座石钟山在那里. '" +keyword_note = { "彭蠡" = "鄱阳湖的又一名称", "焉" = "兼词, 相当于'于此', 在那里" } + +["郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟"] +note = [] +content = "郦元/以为/下临/深潭/, 微风/鼓浪/, 水石/相搏/, 声如/洪钟/" +translation = "郦道元认为石钟山下面靠近深潭, 微风振动波浪, 水和石头互相拍打, 发出的声音好像大钟一般. " +keyword_note = { "郦元" = "即郦道元, 《水经注》的作者", "鼓" = "振动", "搏" = "击, 拍", "洪钟" = "大钟" } + +["是说也, 人常疑之"] +note = [] +content = "是/说/也/, 人/常/疑之/" +translation = "这个说法, 人们常常怀疑它. " +keyword_note = { "是说" = "这个说法", "疑之" = "怀疑它" } + +["今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎"] +note = [] +content = "今/以/钟磬/置/水中/, 虽/大风浪/不能/鸣/也/, 而况/石乎/" +translation = "现在如果把钟磬放在水中, 即使大风大浪也不能使它发出声响, 何况是石头呢! " +keyword_note = { "磬" = "古代打击乐器, 形状像曲尺, 用玉或石制成", "鸣" = "使...鸣响 (使动用法) " } + +["至唐李渤始访其遗踪, 得双石于潭上"] +note = [] +content = "至/唐/李渤/始/访/其/遗踪/, 得/双石/于/潭上/" +translation = "到了唐代李渤才访求石钟山的旧址. 在深潭边找到两块山石. " +keyword_note = { "李渤" = "唐朝洛阳人, 写过一篇《辨石钟山记》", "遗踪" = "旧址, 陈迹. 这里指所在地" } + +["扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇"] +note = [] +content = "扣/而/聆之/, 南声/函胡/, 北音/清越/, 桴止/响腾/, 余韵/徐歇/" +translation = "敲击它们, 聆听它们的声音, 南边那座山石的声音重浊而模糊, 北边那座山石的声音清脆而响亮, 鼓槌停止了敲击, 声音还在传播, 余音慢慢地消失. " +keyword_note = { "函胡" = "通'含糊', 重浊而模糊", "清越" = "清脆而响亮", "桴" = "鼓槌", "响腾" = "声音传播", "余韵" = "余音", "徐歇" = "慢慢消失" } + +["自以为得之矣"] +note = [] +content = "自以为/得之/矣/" +translation = "他自己认为找到了这个石钟山命名的原因. " +keyword_note = { "得之" = "找到了这个 (原因) " } + +["然是说也, 余尤疑之"] +note = [] +content = "然/是/说/也/, 余/尤/疑之/" +translation = "但是这个说法, 我更加怀疑. " +keyword_note = { "尤" = "更加" } + +["石之铿然有声者, 所在皆是也"] +note = [] +content = "石之/铿然/有声/者/, 所在/皆是/也/" +translation = "敲击后能发出声响的石头, 到处都是这样. " +keyword_note = { "铿然" = "敲击金石所发出的响亮的声音", "所在皆是" = "到处都 (是) 这样" } + +["而此独以钟名, 何哉"] +note = [] +content = "而/此/独/以/钟/名/, 何哉/" +translation = "可唯独这座山用钟来命名, 这是为什么呢? " +keyword_note = { "名" = "命名, 取名 (名词作动词) " } + +["元丰七年六月丁丑, 余自齐安舟行适临汝"] +note = [] +content = "元丰/七年/六月/丁丑/, 余/自/齐安/舟行/适/临汝/" +translation = "元丰七年六月丁丑日, 我从齐安坐船到临汝去. " +keyword_note = { "元丰" = "宋神宗的年号", "六月丁丑" = "农历六月初九", "齐安" = "在今湖北黄州", "舟行" = "乘船行走 (名词作状语) ", "适" = "往" } + +["而长子迈将赴饶之德兴尉, 送之至湖口"] +note = [] +content = "而/长子/迈/将/赴/饶之/德兴/尉/, 送之/至/湖口/" +translation = "大儿子苏迈将要去就任饶州德兴县的县尉, 我送他到湖口. " +keyword_note = { "赴" = "赴任、就职", "湖口" = "今江西湖口" } + +["因得观所谓石钟者"] +note = [] +content = "因/得/观/所谓/石钟者/" +translation = "因而能够观察这座称为'石钟'的山. " +keyword_note = { "因" = "因而", "得" = "能够" } + +["寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉"] +note = [] +content = "寺僧/使/小童/持斧/, 于/乱石间/择其/一二/扣之/, 硿硿/焉/" +translation = "庙里的和尚叫小孩拿着斧头, 在乱石中间选一两处敲打它, 硿硿地发出的响声. " +keyword_note = { "硿硿焉" = "硿硿地 (发出响声) . 焉, 相当于'然'" } + +["余固笑而不信也"] +note = [] +content = "余/固/笑/而/不信/也/" +translation = "我本来就觉得可笑, 并不相信. " +keyword_note = { "固" = "本来" } + +["至暮夜月明, 独与迈乘小舟, 至绝壁下"] +note = [] +content = "至/暮夜/月明/, 独/与/迈/乘/小舟/, 至/绝壁/下/" +translation = "到了晚上, 月光明亮, 我独自和苏迈坐着小船来到绝壁下面. " +keyword_note = { "暮夜" = "晚上", "独" = "独自" } + +["大石侧立千尺, 如猛兽奇鬼, 森然欲搏人"] +note = [] +content = "大石/侧立/千尺/, 如/猛兽/奇鬼/, 森然/欲/搏人/" +translation = "巨大的山石在旁边耸立着, 高达千尺, 好像凶猛的野兽和奇异的鬼怪, 阴森森地要向人扑过来. " +keyword_note = { "侧立" = "在旁边耸立 (名词作状语) ", "森然" = "阴森森的样子", "搏人" = "扑向人" } + +["而山上栖鹘, 闻人声亦惊起, 磔磔云霄间"] +note = [] +content = "而/山上/栖鹘/, 闻/人声/亦/惊起/, 磔磔/云霄间/" +translation = "山上宿巢的老鹰听到人声, 也受惊飞起来, 在云霄中磔磔地鸣叫. " +keyword_note = { "栖鹘" = "宿巢的老鹰. 鹘, 鹰的一种", "磔磔" = "鸟鸣声" } + +["又有若老人咳且笑于山谷中者, 或曰此鹳鹤也"] +note = [] +content = "又有/若/老人/咳/且/笑/于/山谷中/者/, 或曰/此/鹳鹤/也/" +translation = "又有像老人在山谷中边咳边笑的声音, 有人说这是鹳鹤. " +keyword_note = { "鹳鹤" = "水鸟名, 似鹤而顶不红, 颈和嘴都比鹤长" } + +["余方心动欲还, 而大声发于水上"] +note = [] +content = "余/方/心动/欲还/, 而/大声/发/于/水上/" +translation = "我正心惊想要回去, 忽然巨大的声音从水上发出. " +keyword_note = { "方" = "正", "心动" = "内心惊恐", "欲还" = "想要回去" } + +["噌吰如钟鼓不绝"] +note = [] +content = "噌吰/如/钟鼓/不绝/" +translation = "噌地响着像钟鼓的声音连续不断. " +keyword_note = { "噌吰" = "形容钟声洪亮" } + +["舟人大恐"] +note = [] +content = "舟人/大恐/" +translation = "船夫非常害怕. " +keyword_note = { "舟人" = "船夫" } + +["徐而察之, 则山下皆石穴罅"] +note = [] +content = "徐/而/察之/, 则/山下/皆/石穴/罅/" +translation = "我慢慢地观察, 原来山脚下都是石头的洞穴和裂缝. " +keyword_note = { "徐" = "慢慢地", "察" = "观察", "罅" = "裂缝" } + +["不知其浅深, 微波入焉, 涵澹澎湃而为此也"] +note = [] +content = "不知/其/浅深/, 微波/入焉/, 涵澹/澎湃/而/为此/也/" +translation = "不知它们的深浅, 微微的水波涌进洞穴和裂缝, 激荡撞击便产生这样的声音. " +keyword_note = { "浅深" = "深度 (形容词作名词) ", "涵澹澎湃" = "波浪激荡", "为此" = "形成这种声音" } + +["舟回至两山间, 将入港口, 有大石当中流"] +note = [] +content = "舟/回/至/两山间/, 将/入/港口/, 有/大石/当/中流/" +translation = "船绕到两山之间, 将要进入港口, 有块大石头挡在水流的中央. " +keyword_note = { "中流" = "水流的中心" } + +["可坐百人, 空中而多窍"] +note = [] +content = "可/坐/百人/, 空中/而/多窍/" +translation = "上面可坐百来个人, 中间是空的, 而且有许多窟窿. " +keyword_note = { "空中" = "中间是空的", "窍" = "窟窿" } + +["与风水相吞吐, 有窾坎镗鞳之声"] +note = [] +content = "与/风水/相/吞吐/, 有/窾坎/镗鞳/之/声/" +translation = "把风浪吞进去又吐出来, 发出窾坎镗鞳的声音. " +keyword_note = { "窾坎镗鞳" = "击物声和钟鼓声" } + +["与向之噌吰者相应, 如乐作焉"] +note = [] +content = "与/向之/噌吰者/相应/, 如/乐作/焉/" +translation = "同先前噌吰的声音相互应和, 好像音乐演奏. " +keyword_note = { "向" = "先前", "相应" = "相互应和", "乐作" = "音乐演奏" } + +['因笑谓迈曰:"汝识之乎"'] +note = [] +content = '因/笑/谓/迈/曰:/"汝/识之/乎/"/' +translation = "我于是笑着对苏迈说: '你知道吗? '" +keyword_note = { "因" = "于是", "识" = "知道" } + +["噌吰者, 周景王之无射也"] +note = [] +content = "噌吰/者/, 周景王/之/无射/也/" +translation = "那噌吰的响声, 是周景王无射钟的声音. " +keyword_note = { "无射" = "周景王所铸钟名" } + +["窾坎镗鞳者, 魏庄子之歌钟也"] +note = [] +content = "窾坎/镗鞳/者/, 魏庄子/之/歌钟/也/" +translation = "窾坎镗鞳的响声, 是魏庄子歌钟的声音. " +keyword_note = { "歌钟" = "古乐器" } + +["古之人不余欺也"] +note = [] +content = "古之/人/不余欺/也/" +translation = "古人没有欺骗我啊! " +keyword_note = { "不余欺" = "不欺余 (宾语前置) " } + +["事不目见耳闻, 而臆断其有无, 可乎"] +note = [] +content = "事/不/目见/耳闻/, 而/臆断/其/有无/, 可乎/" +translation = "凡事不亲眼看到亲耳听到, 却根据主观猜测去来判断它的有或没有, 可以吗? " +keyword_note = { "目见" = "用眼睛看 (名词作状语) ", "耳闻" = "用耳朵听 (名词作状语) ", "臆断" = "根据主观猜测来判断" } + +["郦元之所见闻殆与余同, 而言之不详"] +note = [] +content = "郦元/之/所见闻/殆/与/余/同/, 而/言/之/不详/" +translation = "郦道元见到和听到的, 大概和我一样, 但是说得不详细. " +keyword_note = { "殆" = "大概" } + +["士大夫终不肯以小舟夜泊绝壁之下"] +note = [] +content = "士大夫/终/不肯/以/小舟/夜泊/绝壁/之下/" +translation = "士大夫终究不愿夜晚乘着小船停靠在悬崖绝壁下面. " +keyword_note = { "终" = "终究", "夜泊" = "在夜晚停泊 (名词作状语) " } + +["故莫能知"] +note = [] +content = "故/莫/能知/" +translation = "所以不能知道真相. " +keyword_note = { "莫" = "没有人" } + +["而渔工水师虽知而不能言"] +note = [] +content = "而/渔工/水师/虽/知/而/不能/言/" +translation = "而渔人和船工, 虽然知道却又不能用文字表达、记载. " +keyword_note = { "渔工水师" = "渔人和船工", "言" = "用文字表述、记载" } + +["此世所以不传也"] +note = [] +content = "此/世/所以/不传/也/" +translation = "这就是世上没有流传下来 (石钟山得名由来) 的缘故. " +keyword_note = { "所以" = "...的缘故" } + +["而陋者乃以斧斤考击而求之"] +note = [] +content = "而/陋者/乃/以/斧斤/考击/而/求之/" +translation = "而浅陋的人用斧头敲打石头的办法来寻求 (石钟山得名的) 原因. " +keyword_note = { "陋者" = "浅陋的人", "斧斤" = "斧头", "考击" = "敲击" } + +["自以为得其实"] +note = [] +content = "自以为/得/其实/" +translation = "自以为得到了事情的真相. " +keyword_note = { "其实" = "那事情的真相" } + +["余是以记之"] +note = [] +content = "余/是以/记之/" +translation = "我因此记下以上的经过. " +keyword_note = { "是以" = "以是, 因此 (宾语前置) " } + +["盖叹郦元之简, 而笑李渤之陋也"] +note = [] +content = "盖/叹/郦元/之/简/, 而/笑/李渤/之/陋/也/" +translation = "是因为叹惜郦道元的解释过于简略, 也嘲笑李渤的解释太浅陋了. " +keyword_note = { "盖" = "表原因", "叹" = "叹惜", "简" = "简略", "笑" = "嘲笑", "陋" = "浅陋" } + +["离骚"] +note = [] +content = "离骚/" +translation = "离骚" +keyword_note = {} + +["帝高阳之苗裔兮, 朕皇考曰伯庸."] +note = ['高阳: 传说中的古代帝王颛顼', '朕: 我', '皇考: 对已故父亲的美称'] +content = "帝/高阳/之/苗裔/兮/, 朕/皇考/曰/伯庸./" +translation = "我是古帝高阳氏的子孙, 我已去世的父亲字伯庸" +keyword_note = { "高阳" = "颛顼帝", "苗裔" = "远代子孙", "朕" = "我", "皇考" = "对已故父亲的美称" } + +["摄提贞于孟陬兮, 惟庚寅吾以降."] +note = ["摄提: 即'摄提格', 寅年的别称", '孟陬: 孟春正月, 是寅月'] +content = "摄提/贞/于/孟陬/兮/, 惟/庚寅/吾/以/降./" +translation = "摄提那年正当孟陬啊, 就在庚寅那天我降生" +keyword_note = { "摄提" = "寅年的别称", "贞" = "当、正当", "孟陬" = "孟春正月", "降" = "降生" } + +["皇览揆余初度兮, 肇锡余以嘉名."] +note = ["皇: '皇考'的简称", '览揆: 观察衡量'] +content = "皇/览/揆/余/初度/兮/, 肇/锡/余/以/嘉名./" +translation = "父亲仔细揣度我的生辰, 于是赐予我贞祥的美名" +keyword_note = { "皇" = "皇考的简称", "览揆" = "观察衡量", "初度" = "出生时的情况", "肇" = "开始", "锡" = "赐给", "嘉名" = "美名" } + +["名余曰正则兮, 字余曰灵均."] +note = [] +content = "名/余/曰/正则/兮/, 字/余/曰/灵均./" +translation = "父亲把我的名取为正则, 同时把我的字叫作灵均" +keyword_note = { "正则" = "屈原的名", "灵均" = "屈原的字" } + +["纷吾既有此内美兮, 又重之以修能."] +note = ['修能: 美好的容态, 一说指优秀的才能'] +content = "纷/吾/既/有/此/内美/兮/, 又/重之/以/修能./" +translation = "天赋给我很多良好素质, 我不断加强自己的修养" +keyword_note = { "纷" = "盛多", "内美" = "内在的美好品质", "重" = "加", "修能" = "美好的容态" } + +["扈江离与辟芷兮, 纫秋兰以为佩."] +note = ['扈: 楚地方言, 披', '辟芷: 生于幽僻之处的白芷'] +content = "扈/江离/与/辟芷/兮/, 纫/秋兰/以为/佩./" +translation = "我把江离芷草披在肩上, 把秋兰结成索佩挂身旁" +keyword_note = { "扈" = "披", "江离" = "一种香草", "辟芷" = "幽僻处的白芷", "纫" = "连缀", "秋兰" = "秋天的兰花" } + +["汩余若将不及兮, 恐年岁之不吾与."] +note = ['汩: 水流很快的样子, 比喻时间过得飞快'] +content = "汩/余/若将/不及/兮/, 恐/年岁/之/不吾与./" +translation = "光阴似箭我好像跟不上, 岁月不等待人令我心慌" +keyword_note = { "汩" = "水流很快的样子", "不吾与" = "不等待我" } + +["朝搴阰之木兰兮, 夕揽洲之宿莽."] +note = ['搴: 拔取', '宿莽: 一种香草'] +content = "朝/搴/阰/之/木兰/兮/, 夕/揽/洲/之/宿莽./" +translation = "早晨我在大坡采集木兰, 傍晚在小洲中摘取宿莽" +keyword_note = { "朝搴" = "早晨采集", "夕揽" = "傍晚摘取", "木兰" = "一种香木", "宿莽" = "一种香草" } + +["日月忽其不淹兮, 春与秋其代序."] +note = [] +content = "日月/忽/其/不淹/兮/, 春/与/秋/其/代序./" +translation = "时光迅速逝去不能久留, 四季更相代谢变化有常" +keyword_note = { "忽" = "迅速", "淹" = "久留", "代序" = "时序更替" } + +["惟草木之零落兮, 恐美人之迟暮."] +note = ['美人: 代指有才德、有作为的人'] +content = "惟/草木/之/零落/兮/, 恐/美人/之/迟暮./" +translation = "我想到草木已由盛到衰, 恐怕自己身体逐渐衰老" +keyword_note = { "惟" = "想到", "零落" = "凋零", "美人" = "有才德的人", "迟暮" = "衰老" } + +["不抚壮而弃秽兮, 何不改此度?"] +note = [] +content = "不/抚壮/而/弃秽/兮/, 何/不/改/此/度?/" +translation = "何不利用盛时扬弃秽政, 为何还不改变这些法度" +keyword_note = { "抚壮" = "把握壮年", "弃秽" = "抛弃污秽", "度" = "法度" } + +["乘骐骥以驰骋兮, 来吾道夫先路!"] +note = [] +content = "乘/骐骥/以/驰骋/兮/, 来/吾/道/夫/先路!/" +translation = "乘上千里马纵横驰骋吧, 来呀, 我在前引导开路" +keyword_note = { "骐骥" = "千里马", "道" = "同'导', 引导", "先路" = "前驱" } + +["长太息以掩涕兮, 哀民生之多艰."] +note = ['太息: 叹息', '掩涕: 掩面而泣'] +content = "长/太息/以/掩涕/兮/, 哀/民生/之/多艰./" +translation = "长长地叹息而掩面拭泪, 哀叹人生道路多么艰难" +keyword_note = { "太息" = "叹息", "掩涕" = "掩面拭泪", "民生" = "人生", "多艰" = "多艰难" } + +["余虽好修姱以鞿羁兮, 謇朝谇而夕替."] +note = ['修姱: 美好', '鞿羁: 束缚、约束'] +content = "余/虽/好/修姱/以/鞿羁/兮/, 謇/朝谇/而/夕替./" +translation = "我虽爱好修洁严于责己, 早晨直言进谏晚上就被罢免" +keyword_note = { "修姱" = "美好", "鞿羁" = "束缚", "謇" = "助词无实义", "朝谇" = "早上进谏", "夕替" = "晚上被罢免" } + +["既替余以蕙纕兮, 又申之以揽茝."] +note = ['蕙纕: 用香蕙作的佩带'] +content = "既/替/余/以/蕙纕/兮/, 又/申之/以/揽茝./" +translation = "他们攻击我佩带蕙草啊, 又指责我爱好采集茝兰" +keyword_note = { "替" = "贬黜", "蕙纕" = "香蕙佩带", "申" = "加上", "揽茝" = "采摘白芷" } + +["亦余心之所善兮, 虽九死其犹未悔."] +note = [] +content = "亦/余心/之/所善/兮/, 虽/九死/其/犹未悔./" +translation = "我真心爱好修身洁行, 即使死多次也不会后悔" +keyword_note = { "所善" = "所爱好的", "九死" = "死多次", "未悔" = "不后悔" } + +["怨灵修之浩荡兮, 终不察夫民心."] +note = ['灵修: 指楚怀王', '浩荡: 荒唐'] +content = "怨/灵修/之/浩荡/兮/, 终/不察/夫/民心./" +translation = "怨就怨楚王这样糊涂啊, 他始终不体察别人心情" +keyword_note = { "灵修" = "楚怀王", "浩荡" = "荒唐", "民心" = "人心" } + +["众女嫉余之蛾眉兮, 谣诼谓余以善淫."] +note = ['众女: 喻指小人', '蛾眉: 喻指美好的品德'] +content = "众女/嫉/余/之/蛾眉/兮/, 谣诼/谓/余/以/善淫./" +translation = "那些小人妒忌我的丰姿, 造谣诬蔑说我妖艳好淫" +keyword_note = { "众女" = "小人", "蛾眉" = "美好品德", "谣诼" = "毁谤", "善淫" = "好做淫邪之事" } + +["固时俗之工巧兮, 偭规矩而改错."] +note = [] +content = "固/时俗/之/工巧/兮/, 偭/规矩/而/改错./" +translation = "庸人本来善于投机取巧, 背弃规矩而又改变政策" +keyword_note = { "时俗" = "世俗", "工巧" = "善于取巧", "偭" = "违背", "规矩" = "规则", "改错" = "改变措施" } + +["背绳墨以追曲兮, 竞周容以为度."] +note = ['绳墨: 木匠画直线用的工具, 喻指准绳'] +content = "背/绳墨/以/追曲/兮/, 竞/周容/以/为度./" +translation = "违背是非标准追求邪曲, 争着苟合取悦作为法则" +keyword_note = { "绳墨" = "准绳", "追曲" = "追随邪佞", "周容" = "迎合讨好", "度" = "法度" } + +["忳郁邑余侘傺兮, 吾独穷困乎此时也."] +note = ['忳郁邑: 忧愁烦闷', '侘傺: 失意的样子'] +content = "忳/郁邑/余/侘傺/兮/, 吾/独/穷困/乎/此时/也./" +translation = "忧愁烦闷啊我失意不安, 现在孤独穷困多么艰难" +keyword_note = { "忳郁邑" = "忧愁烦闷", "侘傺" = "失意", "穷困" = "走投无路" } + +["宁溘死以流亡兮, 余不忍为此态也!"] +note = ['溘: 突然', '此态: 指迎合讨好他人的丑态'] +content = "宁/溘死/以/流亡/兮/, 余/不忍/为/此态/也!/" +translation = "宁可马上死去魂魄离散, 媚俗取巧啊我坚决不干" +keyword_note = { "溘死" = "突然死去", "流亡" = "随流水消逝", "此态" = "丑态" } + +["鸷鸟之不群兮, 自前世而固然."] +note = ['鸷鸟: 凶猛的鸟, 指鹰、雕等'] +content = "鸷鸟/之/不群/兮/, 自/前世/而/固然./" +translation = "雄鹰不与那些燕雀同群, 原本自古以来就是这般" +keyword_note = { "鸷鸟" = "猛禽", "不群" = "不与凡鸟同群", "固然" = "本来如此" } + +["何方圜之能周兮, 夫孰异道而相安?"] +note = ['方圜: 方枘和圆凿'] +content = "何/方圜/之/能周/兮/, 夫/孰/异道/而/相安?/" +translation = "哪有方枘和圆凿能够相合, 哪有道不同却能够相互安处的" +keyword_note = { "方圜" = "方枘圆凿", "周" = "相合", "异道" = "不同道路", "相安" = "相互安处" } + +["屈心而抑志兮, 忍尤而攘诟."] +note = ['尤: 责备', '攘: 容忍', '诟: 辱骂'] +content = "屈心/而/抑志/兮/, 忍/尤/而/攘诟./" +translation = "宁愿委曲心志压抑情感, 宁把斥责咒骂统统承担" +keyword_note = { "屈心" = "委屈心志", "抑志" = "压抑情感", "忍尤" = "忍受责备", "攘诟" = "容忍辱骂" } + +["伏清白以死直兮, 固前圣之所厚."] +note = ["伏: 同'服', 保持"] +content = "伏/清白/以/死直/兮/, 固/前圣/之/所厚./" +translation = "保持清白节操死于直道, 这本为古代圣贤所称赞" +keyword_note = { "伏" = "保持", "死直" = "死于直道", "前圣" = "古代圣贤", "所厚" = "所推崇" } + +["悔相道之不察兮, 延伫乎吾将反."] +note = ['相: 观察', '延伫: 久立'] +content = "悔/相道/之/不察/兮/, 延伫/乎/吾/将反./" +translation = "后悔选择道路时没有看清, 我久久伫立而想返回" +keyword_note = { "相道" = "观察道路", "不察" = "没有看清", "延伫" = "久立", "将反" = "想返回" } + +["回朕车以复路兮, 及行迷之未远."] +note = [] +content = "回/朕车/以/复路/兮/, 及/行迷/之/未远./" +translation = "掉转我的车子返回原路, 趁着迷路还不算远的时候" +keyword_note = { "回" = "掉转", "复路" = "回原路", "及" = "趁着", "行迷" = "走入迷途" } + +["步余马于兰皋兮, 驰椒丘且焉止息."] +note = ['步: 缓行', '皋: 水边地'] +content = "步/余马/于/兰皋/兮/, 驰/椒丘/且/焉/止息./" +translation = "让我的马缓缓走在长着兰草的水边, 驱马疾行到长着椒树的山冈暂且在那里休息" +keyword_note = { "步" = "缓行", "兰皋" = "长兰草的水边", "驰" = "疾行", "椒丘" = "长椒树的山冈", "止息" = "休息" } + +["进不入以离尤兮, 退将复修吾初服."] +note = ['不入: 不被容纳', '初服: 出仕前的服饰, 比喻原先的志向'] +content = "进/不入/以/离尤/兮/, 退/将/复修/吾/初服./" +translation = "到朝廷做官不被接纳而又遭受指责, 退下来重新整理我当初的衣服" +keyword_note = { "不入" = "不被容纳", "离尤" = "遭受指责", "复修" = "重新整理", "初服" = "原先的志向" } + +["制芰荷以为衣兮, 集芙蓉以为裳."] +note = ['芰荷: 菱叶与荷叶'] +content = "制/芰荷/以/为衣/兮/, 集/芙蓉/以/为裳./" +translation = "我要把菱叶裁剪成上衣, 我并用荷花把下裳织就" +keyword_note = { "制" = "裁剪", "芰荷" = "菱叶荷叶", "集" = "收集", "芙蓉" = "荷花" } + +["不吾知其亦已兮, 苟余情其信芳."] +note = [] +content = "不/吾知/其/亦已/兮/, 苟/余情/其/信芳./" +translation = "没有人了解我也就罢了, 只要内心真正馥郁芳柔" +keyword_note = { "不吾知" = "不了解我", "亦已" = "也就算了", "苟" = "只要", "信芳" = "确实美好" } + +["高余冠之岌岌兮, 长余佩之陆离."] +note = ['岌岌: 高耸的样子', '陆离: 修长的样子'] +content = "高/余冠/之/岌岌/兮/, 长/余佩/之/陆离./" +translation = "把我的帽子加得高高的, 把我的佩带增得长悠悠" +keyword_note = { "高" = "加高", "岌岌" = "高耸", "长" = "加长", "陆离" = "修长" } + +["芳与泽其杂糅兮, 唯昭质其犹亏."] +note = ['昭质: 光明纯洁的本质'] +content = "芳/与/泽/其/杂糅/兮/, 唯/昭质/其/犹亏./" +translation = "虽然芳洁污垢混杂一起, 只有纯洁品质不会腐朽" +keyword_note = { "芳" = "芳香", "泽" = "润泽", "杂糅" = "混杂", "昭质" = "光明纯洁的本质", "亏" = "减损" } + +["忽反顾以游目兮, 将往观乎四荒."] +note = ['游目: 放眼观看'] +content = "忽/反顾/以/游目/兮/, 将/往观/乎/四荒./" +translation = "我忽然回头啊纵目远望, 我将游观四面遥远地方" +keyword_note = { "反顾" = "回头", "游目" = "纵目远望", "往观" = "去观看", "四荒" = "四方遥远之地" } + +["佩缤纷其繁饰兮, 芳菲菲其弥章."] +note = ['菲菲: 香气浓烈', "章: 同'彰'"] +content = "佩/缤纷/其/繁饰/兮/, 芳/菲菲/其/弥章./" +translation = "佩着五彩缤纷华丽装饰, 散发出一阵阵浓郁清香" +keyword_note = { "缤纷" = "五彩缤纷", "繁饰" = "华丽装饰", "菲菲" = "香气浓烈", "弥章" = "更加显著" } + +["民生各有所乐兮, 余独好修以为常."] +note = [] +content = "民生/各/有/所乐/兮/, 余/独/好修/以/为常./" +translation = "人们各有自己的爱好啊, 我独爱好修饰习以为常" +keyword_note = { "民生" = "人生", "所乐" = "所爱好的", "好修" = "爱好修饰", "为常" = "习以为常" } + +["虽体解吾犹未变兮, 岂余心之可惩?"] +note = ['惩: 因受创而戒止'] +content = "虽/体解/吾/犹未变/兮/, 岂/余心/之/可惩?/" +translation = "即使粉身碎骨也不改变, 难道我能受警戒而彷徨" +keyword_note = { "体解" = "肢解", "未变" = "不改变", "余心" = "我的心", "可惩" = "会因惩罚而停止" } + +["种树郭橐驼传"] +note = [] +content = "种树郭橐驼传/" +translation = "种树郭橐驼传" +keyword_note = {} + +["郭橐驼, 不知始何名."] +note = [] +content = "郭橐驼/, 不知/始/何名./" +translation = "郭橐驼, 不知道他起初叫什么名字. " +keyword_note = {} + +["病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'."] +note = [] +content = "病瘘/, 隆然/伏行/, 有类/橐驼者/, 故/乡人/号之/'驼'./" +translation = "他患了脊背弯曲的病, 脊背突起而弯腰行走, 就像骆驼一样, 所以乡里人称呼他叫'橐驼'. " +keyword_note = { "病瘘" = "患了脊背弯曲的病", "隆然" = "脊背突起的样子", "伏行" = "弯腰行走", "橐驼" = "骆驼" } + +["驼闻之, 曰:'甚善.名我固当.'"] +note = [] +content = "驼/闻之/, 曰:/'甚善./名我/固当.'/" +translation = "橐驼听说后, 说: '这个名字很好啊, 这样称呼我确实恰当. '" +keyword_note = { "固当" = "确实恰当" } + +["因舍其名, 亦自谓橐驼云."] +note = [] +content = "因/舍其名/, 亦/自谓/橐驼/云./" +translation = "于是他舍弃了他原来的名字, 也自称起'橐驼'来. " +keyword_note = {} + +["其乡曰丰乐乡, 在长安西."] +note = [] +content = "其乡/曰/丰乐乡/, 在/长安西./" +translation = "他的家乡叫丰乐乡, 在长安城西边. " +keyword_note = {} + +["驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养."] +note = [] +content = "驼/业种树/, 凡/长安/豪富人/为观游/及/卖果者/, 皆/争迎取养./" +translation = "郭橐驼以种树为职业, 凡是长安城里的富豪人家, 从事园林游览和做水果买卖的人, 都争着迎接他, 雇佣他. " +keyword_note = { "业种树" = "以种树为职业", "观游" = "园林游览", "争迎取养" = "争着迎接雇佣" } + +["视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃."] +note = [] +content = "视/驼/所种树/, 或/移徙/, 无不活/, 且/硕茂/, 早实/以蕃./" +translation = "观察橐驼种的树, 即使是移植来的, 也没有不成活的; 而且长得高大茂盛, 结果实早而且多. " +keyword_note = { "硕茂" = "高大茂盛", "早实以蕃" = "结果实早而且多" } + +["他植者虽窥伺效慕, 莫能如也."] +note = [] +content = "他植者/虽/窥伺效慕/, 莫能/如也./" +translation = "其他种树的人即使暗中观察, 羡慕效仿, 也没有谁能比得上. " +keyword_note = { "窥伺效慕" = "暗中观察羡慕效仿" } + +["有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'"] +note = [] +content = "有问之/, 对曰:/'橐驼/非能/使木/寿且孳也/, 能/顺木之天/, 以/致其性/焉尔.'/" +translation = "有人问他种树种得好的原因, 他回答说: '橐驼我不是能够使树木活得长久而且长得很快, 只不过能够顺应树木的天性, 来实现其自身的习性罢了. '" +keyword_note = { "寿且孳" = "活得长久而且长得很快", "顺木之天" = "顺应树木的天性", "致其性" = "实现其习性" } + +["凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密."] +note = [] +content = "凡/植木之性/, 其本/欲舒/, 其培/欲平/, 其土/欲故/, 其筑/欲密./" +translation = "但凡种树的方法, 它的树根要舒展, 它的培土要平匀, 它根下的土要用原来培育树苗的土, 它捣土要结实. " +keyword_note = { "本欲舒" = "树根要舒展", "培欲平" = "培土要平匀", "土欲故" = "用原来的土", "筑欲密" = "捣土要结实" } + +["既然已, 勿动勿虑, 去不复顾."] +note = [] +content = "既然已/, 勿动/勿虑/, 去/不复顾./" +translation = "已经这样做了, 就不要再动, 不要再忧虑它, 离开它不再回顾. " +keyword_note = {} + +["其莳也若子, 其置也若弃, 则其天者全而其性得矣."] +note = [] +content = "其莳也/若子/, 其置也/若弃/, 则/其天者全/而/其性得矣./" +translation = "栽种时要像对待孩子一样细心, 栽好后置于一旁要像抛弃了它们一样, 那么树木的天性就得以保全, 它的习性就得以实现. " +keyword_note = { "莳" = "栽种", "若子" = "像对待孩子一样", "若弃" = "像抛弃了一样" } + +["故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也."] +note = [] +content = "故/吾/不害其长/而已/, 非有能/硕茂之也/; 不抑耗/其实/而已/, 非有能/早而蕃之也./" +translation = "所以我只不过不妨害它的生长罢了, 并不是有能使它长得高大茂盛的办法; 只不过不抑制、减少它的结果罢了, 也并不是有能使它果实结得早又多的办法. " +keyword_note = { "不害其长" = "不妨害它的生长", "抑耗" = "抑制减少" } + +["他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及."] +note = [] +content = "他植者/则不然/, 根拳/而/土易/, 其培之也/, 若/不过焉/则不及./" +translation = "别的种树人却不是这样, 树根拳曲又换了生土; 他培土的时候, 不是过紧就是太松. " +keyword_note = { "根拳" = "树根拳曲", "土易" = "换了生土" } + +["苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,"] +note = [] +content = "苟/有能/反是者/, 则又/爱之太恩/, 忧之太勤/, 旦视/而/暮抚/, 已去/而/复顾,/" +translation = "如果有能够和这种做法相反的人, 就又太过于吝惜它们了, 在早晨去看了, 在晚上又去摸摸, 已经离开了, 又回头去看看. " +keyword_note = { "反是者" = "和这种做法相反的人", "爱之太恩" = "太过于吝惜它们", "忧之太勤" = "担心得太勤" } + +["甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣."] +note = [] +content = "甚者/爪其肤/以验/其生枯/, 摇其本/以观/其疏密/, 而/木之性/日以离矣./" +translation = "更严重的, 甚至掐破树皮来观察它是死是活着, 摇晃树干来看它是否栽结实了, 这样树木的天性就一天天远去了. " +keyword_note = { "爪其肤" = "掐破树皮", "验其生枯" = "观察它是死是活", "摇其本" = "摇晃树干", "日以离" = "一天天远去" } + +["虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也."] +note = [] +content = "虽曰/爱之/, 其实/害之/; 虽曰/忧之/, 其实/仇之/, 故/不我若也./" +translation = "虽然说是喜爱它, 这实际上是害了它, 虽说是担心它, 这实际上是仇恨它. 所以他们都不如我. " +keyword_note = { "不我若" = "不如我" } + +["吾又何能为哉!"] +note = [] +content = "吾/又何能为哉!/" +translation = "我又能做什么呢? '" +keyword_note = {} + +["问者曰:'以子之道, 移之官理, 可乎?'"] +note = [] +content = "问者曰:/'以子之道/, 移之/官理/, 可乎?'/" +translation = "问的人说: '把你种树的方法, 转用到做官治民上, 可行吗? '" +keyword_note = { "官理" = "做官治民" } + +["驼曰:'我知种树而已, 官理, 非吾业也."] +note = [] +content = "驼曰:/'我知/种树/而已/, 官理/, 非吾业也./" +translation = "橐驼说: '我只知道种树罢了, 做官治民,不是我的职业. " +keyword_note = {} + +["然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'"] +note = [] +content = "然/吾居乡/, 见/长人者/好烦其令/, 若/甚怜焉/, 而/卒以祸.'/" +translation = "但是我住在乡里, 看见那些官吏喜欢不断地发号施令, 好像是很怜爱(百姓)啊, 但百姓最终反因此受到祸害. '" +keyword_note = { "长人者" = "官吏", "好烦其令" = "喜欢不断地发号施令", "甚怜" = "很怜爱", "卒以祸" = "最终受到祸害" } + +["旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'"] +note = [] +content = "旦暮/吏来/而呼曰:/'官命/促尔耕/, 勖尔植/, 督尔获/, 早缫/而绪/, 早织/而缕/, 字/而幼孩/, 遂/而鸡豚.'/" +translation = "在早上在晚上那些小吏跑来大喊: '长官命令: 催促你们耕地, 勉励你们种植, 督促你们收获, 早些煮茧抽丝, 早些织你们的布, 养育你们的小孩, 喂大你们的鸡和猪. '" +keyword_note = { "促尔耕" = "催促你们耕地", "勖尔植" = "勉励你们种植", "督尔获" = "督促你们收获", "早缫而绪" = "早些煮茧抽丝", "早织而缕" = "早些织布", "字而幼孩" = "养育你们的小孩", "遂而鸡豚" = "喂大你们的鸡和猪" } + +["'鸣鼓而聚之, 击木而召之.'"] +note = [] +content = "'鸣鼓/而聚之/, 击木/而召之.'/" +translation = "'一会儿打鼓招聚大家, 一会儿鼓梆召集大家, '" +keyword_note = {} + +["吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?"] +note = [] +content = "吾/小人/辍/飧饔/以劳吏者/, 且/不得暇/, 又/何以/蕃吾生/而/安吾性/耶?/" +translation = "我们这些小百姓停止吃早、晚饭去慰劳那些小吏尚且不得空暇, 又怎能使我们繁衍生息, 民心安定呢? " +keyword_note = { "小人" = "小百姓", "辍飧饔" = "停止吃早晚饭", "劳吏" = "慰劳官吏", "蕃吾生" = "使我们繁衍生息", "安吾性" = "使民心安定" } + +["故病且怠."] +note = [] +content = "故/病且怠./" +translation = "所以我们既困苦又疲乏," +keyword_note = { "病且怠" = "困苦又疲乏" } + +["若是, 则与吾业者其亦有类乎?'"] +note = [] +content = "若是/, 则/与吾业者/其/亦有类乎?'/" +translation = "像这样 (治民反而扰民) , 它与我种树的行当大概也有相似的地方吧? '" +keyword_note = {} + +["问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'"] +note = [] +content = "问者曰:/'嘻/, 不亦/善夫!/吾/问养树/, 得/养人术.'/" +translation = "问的人说: '不也是很好吗! 我问种树的方法, 得到了治民的方法. '" +keyword_note = { "养人术" = "治民的方法" } + +["传其事以为官戒."] +note = [] +content = "传其事/以为/官戒./" +translation = "我记录这件事把它作为官吏们的警戒. " +keyword_note = { "官戒" = "官吏们的警戒" } + +["答司马谏议书"] +note = [] +content = "答司马谏议书/" +translation = "答司马谏议书" +keyword_note = {} + +["某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也."] +note = ['某: 自称', '启: 写信说明事情', '君实: 司马光的字'] +content = "某/启: /昨日/蒙教/, 窃/以为/与/君实/游处/相好/之/日/久/, 而/议事/每/不合/, 所操之术/多异/故也./" +translation = "鄙人王安石请启: 昨天承蒙 (您来信) 指教, 我私下认为与君实您交往相好的日子很久了, 但是议论起政事来 (意见) 常常不一致, (这是因为我们) 所持的政治主张和方法大多不同的缘故啊" +keyword_note = { "蒙教" = "承蒙指教", "窃" = "私下, 谦词", "游处" = "同游共处, 即同事交往", "所操之术" = "所持的政治主张和方法" } + +["虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨."] +note = ["辨通'辩', 辩解"] +content = "虽/欲/强聒/, 终/必/不蒙/见察/, 故/略/上报/, 不复/一一/自辨./" +translation = "虽然想要勉强劝说几句, 最终也必定不被您所谅解, 所以只简单地给您回信, 不再逐一替自己辩护" +keyword_note = { "强聒" = "硬在耳边啰嗦, 强作解说", "见察" = "被谅解", "上报" = "写回信", "自辨" = "自我辩护" } + +["重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也."] +note = ["卤通'鲁', 粗鲁", "具通'俱', 详细"] +content = "重念/蒙/君实/视遇/厚/, 于/反覆/不宜/卤莽/, 故/今/具道/所以/, 冀/君实/或/见恕/也./" +translation = "后来又考虑到蒙您一向看重和厚待我, 在书信往来上不宜马虎草率, 所以我现在详细地说出我这样做的原因, 希望您看后或许能谅解我吧" +keyword_note = { "重念" = "再三想想", "视遇厚" = "看重", "反覆" = "书信往来", "具道" = "详细说明", "所以" = "原因", "冀" = "希望", "见恕" = "原谅我" } + +["盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣."] +note = [] +content = "盖/儒者/所争/, 尤/在/于/名实/, 名实/已明/, 而/天下/之/理/得/矣./" +translation = "读书人所争辩的, 尤其在于名气是否符合 (实际) , 名气符合实际后, 天下之间的道理就清晰了" +keyword_note = { "儒者" = "读书人", "名实" = "名义和实际" } + +["今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也."] +note = [] +content = "今/君实/所以/见教/者/, 以为/侵官/、生事/、征利/、拒谏/, 以/致/天下/怨谤/也./" +translation = "如今您来指教我的, 是认为我的做法侵犯了官吏们的职权, 惹是生非制造事端, 聚敛钱财与民争利, 拒不接受意见, 因此招致天下人的怨恨和指责" +keyword_note = { "见教" = "指教我", "侵官" = "侵犯官权", "生事" = "惹是生非", "征利" = "聚敛钱财", "拒谏" = "拒不接受意见", "怨谤" = "怨恨和指责" } + +["某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;"] +note = [] +content = "某/则/以谓/受命/于/人主/, 议/法度/而/修之/于/朝廷/, 以/授之/于/有司/, 不为/侵官;/" +translation = "我却认为从皇帝那里接受命令, 在朝堂上公开议订法令制度并在朝廷上修改, 把它交给有关部门官吏去执行, 这不属侵犯官权" +keyword_note = { "人主" = "皇帝", "法度" = "法令制度", "有司" = "有关部门官吏" } + +["举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;"] +note = [] +content = "举/先王/之政/, 以/兴利/除弊/, 不为/生事; /为/天下/理财/, 不为/征利;/" +translation = "效法先皇的贤明政治, 用来兴办好事, 革除弊端, 这不是惹是生非; 替国家理财政, 这不是搜刮钱财" +keyword_note = { "举" = "效法", "兴利除弊" = "兴办好事, 革除弊端", "理财" = "管理财政" } + +["辟邪说, 难壬人, 不为拒谏."] +note = [] +content = "辟/邪说/, 难/壬人/, 不为/拒谏./" +translation = "驳斥错误言论, 责难奸佞小人, 这不是拒听意见" +keyword_note = { "辟邪说" = "批驳不正确的言论", "难壬人" = "排斥巧辩的佞人" } + +["至于怨诽之多, 则固前知其如此也."] +note = [] +content = "至于/怨诽/之/多/, 则/固/前知/其/如此/也./" +translation = "至于那么多的怨恨和诽谤, 那本来预料到它会这样的" +keyword_note = { "怨诽" = "怨恨和诽谤", "固" = "本来", "前知" = "预料" } + +["人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?"] +note = [] +content = "人/习于/苟且/非/一日/, 士大夫/多/以/不恤/国事/、同俗/自媚/于众/为/善/, 上/乃/欲/变此/, 而/某/不量/敌之/众寡/, 欲/出力/助上/以/抗之/, 则/众/何为/而/不/汹汹/然?/" +translation = "人们习惯于苟且偷安、得过且过 (已) 不是一天 (的事) 了. 士大夫们多数把不顾国家大事、附和世俗 (的见解) , 向众人献媚讨好当做好事, (因而) 陛下才要改变这种 (不良) 风气, 那么我不去估量反对者的多少, 想拿出 (自己的) 力量帮助陛下来抵制这股势力, (这样一来) 那么那些人又为什么不 (对我) 大吵大闹呢" +keyword_note = { "苟且" = "苟且偷安", "不恤国事" = "不顾国家大事", "同俗自媚于众" = "附和世俗, 向众人献媚", "上" = "陛下", "汹汹" = "大吵大闹" } + +["盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;"] +note = [] +content = "盘庚/之/迁/, 胥怨/者/民/也/, 非特/朝廷/士大夫/而已;/" +translation = "盘庚迁都 (的时候) , 连老百姓都抱怨啊, (并) 不只是朝廷上的士大夫 (加以反对) " +keyword_note = { "盘庚之迁" = "盘庚迁都", "胥怨" = "相怨, 指百姓抱怨", "非特" = "不只是" } + +["盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也."] +note = [] +content = "盘庚/不/为/怨者/故/改/其/度/, 度义/而/后/动/, 是/而/不见/可悔/故/也./" +translation = "盘庚不因为有人怨恨的缘故就改变自己的计划; (这是他) 考虑到 (迁都) 合理, 然后坚决行动; 认为对 (就) 看不出有什么可以后悔的缘故啊" +keyword_note = { "度" = "计划", "度义" = "考虑是否合理", "是" = "认为正确" } + +["如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;"] +note = ['膏泽: 名词作动词, 施加恩惠'] +content = "如/君实/责我/以/在位/久/, 未能/助上/大有为/, 以/膏泽/斯民/, 则/某/知罪/矣;/" +translation = "如果君实您责备我因为 (我) 在位任职很久, 没能帮助陛下干一番大事业, 使这些老百姓得到好处, 那么我承认 (自己是) 有罪的" +keyword_note = { "大有为" = "干大事业", "膏泽斯民" = "给百姓施加恩惠" } + +["如曰今日当一切不事事, 守前所为而已, 则非某之所敢知."] +note = ["事事: 前一'事'字是动词, 后一'事'字是名词"] +content = "如曰/今日/当/一切/不/事事/, 守前/所为/而已/, 则/非/某之/所敢知./" +translation = "如果说现在应该什么事都不去做, 墨守前人的陈规旧法就是了, 那就不是我敢领教的了" +keyword_note = { "事事" = "做事", "守前所为" = "墨守前人的作法", "所敢知" = "敢领教的" } + +["无由会晤, 不任区区向往之至!"] +note = [] +content = "无由/会晤/, 不任/区区/向往/之至!/" +translation = "没有机会 (与您) 见面, 内心不胜仰慕至极" +keyword_note = { "无由" = "没有机会", "不任" = "不胜", "区区" = "谦称自己", "向往之至" = "仰慕到极点" } + +["苏幕遮·燎沉香"] +note = [] +content = "苏幕遮·燎沉香/" +translation = "苏幕遮·燎沉香" +keyword_note = {} + +["燎沉香, 消溽暑"] +note = ['描写夏日焚香消暑的雅致生活场景'] +content = "燎/沉香/, 消/溽暑/" +translation = "焚烧沉香, 来消除夏日潮湿的暑气" +keyword_note = { "燎" = "烧", "沉香" = "一种名贵香料, 置水中则下沉", "溽暑" = "潮湿的暑气" } + +["鸟雀呼晴, 侵晓窥檐语"] +note = ['通过鸟雀欢鸣表现雨后初晴的喜悦气氛'] +content = "鸟雀/呼晴/, 侵晓/窥檐/语/" +translation = "快天亮的时候, 鸟雀都在屋檐下叫个不停, 欢呼天已放晴" +keyword_note = { "呼晴" = "唤晴, 鸟鸣可占晴雨", "侵晓" = "快天亮的时候", "窥檐语" = "在屋檐下窥视鸣叫" } + +["叶上初阳干宿雨, 水面清圆, 一一风荷举"] +note = ["描绘晨光中荷叶挺立的生动画面, '举'字用得极妙"] +content = "叶上/初阳/干/宿雨/, 水面/清圆/, 一一/风荷/举/" +translation = "初出的阳光晒干了荷叶上昨夜的雨滴, 水面上的荷叶清润圆正, 迎着晨风, 每一片都挺出水面" +keyword_note = { "初阳" = "初出的阳光", "宿雨" = "昨夜下的雨", "清圆" = "清润圆正", "风荷举" = "荷叶迎着晨风挺出水面" } + +["故乡遥, 何日去?"] +note = ['由景生情, 转入思乡之情的抒发'] +content = "故乡/遥/, 何日/去?/" +translation = "想到那遥远的故乡, 什么时候才能回去啊? " +keyword_note = { "故乡遥" = "故乡遥远", "何日去" = "何时能够回去" } + +["家住吴门, 久作长安旅"] +note = ['点明作者江南人的身份和长期客居京城的境遇'] +content = "家住/吴门/, 久作/长安/旅/" +translation = "我家本在江南一带, 却长久地客居汴京" +keyword_note = { "吴门" = "泛指江南一带, 今江苏苏州", "长安" = "借指北宋都城汴京", "旅" = "客居" } + +["五月渔郎相忆否?"] +note = ['用反问句式表达对故乡亲友的深切思念'] +content = "五月/渔郎/相忆/否?/" +translation = "又到五月, 不知家乡的朋友是否也在思念我? " +keyword_note = { "渔郎" = "指故乡的钓鱼朋友", "相忆" = "相互思念" } + +["小楫轻舟, 梦入芙蓉浦"] +note = ['以梦境作结, 表现归乡不得只能在梦中重返故地的惆怅'] +content = "小楫/轻舟/, 梦入/芙蓉/浦/" +translation = "在梦中, 我划着一叶小舟, 又闯入那西湖的荷花塘中" +keyword_note = { "小楫" = "短桨, 指划船用具", "轻舟" = "轻快的小船", "芙蓉浦" = "有荷花的水边, 指杭州西湖" } + +["菩萨蛮·书江西造口壁"] +note = [] +content = "菩萨蛮·书江西造口壁/" +translation = "菩萨蛮·书江西造口壁" +keyword_note = {} + +["郁孤台下清江水, 中间多少行人泪."] +note = [] +content = "郁孤台下/清江水/, 中间/多少/行人泪./" +translation = "郁孤台下这赣江的流水, 水中有多少苦难之人的眼泪" +keyword_note = { "郁孤台" = "今江西省赣州市城区西北部贺兰山顶, 又称望阙台", "清江" = "赣江与袁江合流处旧称清江", "行人泪" = "指逃难民众的泪水" } + +["西北望长安, 可怜无数山."] +note = [] +content = "西北/望/长安/, 可怜/无数山./" +translation = "我举头眺望西北的长安, 可惜只看到无数青山" +keyword_note = { "长安" = "今陕西省西安市, 为汉唐故都. 此处代指宋都汴京", "可怜" = "可惜", "无数山" = "很多座山" } + +["青山遮不住, 毕竟东流去."] +note = [] +content = "青山/遮不住/, 毕竟/东流去./" +translation = "但青山怎能把江水挡住? 浩浩江水终于还是向东流去" +keyword_note = { "遮不住" = "阻挡不了", "东流去" = "向东流去" } + +["江晚正愁余, 山深闻鹧鸪."] +note = ['愁余 一作: 愁予'] +content = "江晚/正/愁余/, 山深/闻/鹧鸪./" +translation = "江边日晚我正满怀愁绪, 听到深山传来声声鹧鸪悲鸣" +keyword_note = { "愁余" = "使我发愁", "鹧鸪" = "鸟名. 传说其叫声如云'行不得也哥哥', 啼声凄苦" } + +["菩萨蛮·小山重叠金明灭"] +note = [] +content = "菩萨蛮·小山重叠金明灭/" +translation = "菩萨蛮·小山重叠金明灭" +keyword_note = {} + +["鬓云欲度香腮雪"] +note = [] +content = "鬓云/欲度/香腮/雪/" +translation = "她那散乱如云的鬓发, 在如雪的面庞上轻拂" +keyword_note = { "鬓云" = "像云朵似的鬓发", "欲度" = "将掩未掩的样子", "香腮雪" = "雪白的面颊" } + +["懒起画蛾眉, 弄妆梳洗迟"] +note = [] +content = "懒起/画/蛾眉/, 弄妆/梳洗/迟/" +translation = "懒懒地起身描画蛾眉, 慢慢地梳妆打扮, 修饰仪容" +keyword_note = { "蛾眉" = "女子的眉毛细长弯曲像蚕蛾的触须", "弄妆" = "梳妆打扮, 修饰仪容" } + +["照花前后镜, 花面交相映"] +note = [] +content = "照花/前后/镜/, 花面/交相/映/" +translation = "簪花时置放前后双镜, 花容和人的娇颜交相辉映" +keyword_note = { "照花" = "对镜簪花", "花面" = "花容和人的娇颜" } + +["新帖绣罗襦, 双双金鹧鸪"] +note = ['帖 一作: 贴'] +content = "新帖/绣/罗襦/, 双双/金/鹧鸪/" +translation = "身穿崭新的丝绸短袄, 衣上贴绣的鹧鸪似欲飞动; 那金线绣成的鹧鸪成双, 又撩起她相思的柔情" +keyword_note = { "帖绣" = "苏绣中的一种工艺", "罗襦" = "丝绸短袄", "金鹧鸪" = "用金线绣的鹧鸪图案" } + +["虞美人"] +note = [] +content = "虞美人/" +translation = "虞美人" +keyword_note = {} + +["春花秋月何时了, 往事知多少."] +note = [] +content = "春花/秋月/何时/了/, 往事/知/多少./" +translation = "春天的花, 秋天的月, 什么时候才能了结? 往事又能知道有多少! " +keyword_note = { "了" = "了结, 完结", "往事" = "过去的事情" } + +["小楼昨夜又东风, 故国不堪回首月明中."] +note = [] +content = "小楼/昨夜/又/东风/, 故国/不堪/回首/月明/中./" +translation = "昨夜小楼上又吹来了春风, 在这皓月当空的夜晚, 怎承受得了回忆故国的伤痛. " +keyword_note = { "东风" = "春风", "故国" = "指南唐故都金陵", "不堪" = "不能忍受", "回首" = "回忆" } + +["雕阑玉砌应犹在, 只是朱颜改."] +note = [] +content = "雕阑/玉砌/应/犹在/, 只是/朱颜/改./" +translation = "精雕细刻的栏杆、玉石砌成的台阶应该还在, 只是所怀念的人已衰老. " +keyword_note = { "雕阑玉砌" = "指远在金陵的南唐故宫", "应犹" = "应该还", "朱颜改" = "指所怀念的人已衰老" } + +["问君能有几多愁, 恰是一江春水向东流."] +note = [] +content = "问君/能/有/几多/愁/, 恰是/一江/春水/向/东流./" +translation = "要问我心中有多少哀愁, 就像这不尽的滔滔春水滚滚东流. " +keyword_note = { "君" = "作者自称", "能" = "或作'都'、'那'、'还'、'却'", "几多" = "多少", "恰是" = "正像是" } + +["蜀相"] +note = [] +content = "蜀相/" +translation = "蜀相" +keyword_note = {} + +["丞相祠堂何处寻? 锦官城外柏森森."] +note = [] +content = "丞相/祠堂/何处/寻? /锦官/城外/柏/森森./" +translation = "去哪里寻找武侯诸葛亮的祠堂? 在成都城外那柏树茂密的地方. " +keyword_note = { "丞相祠堂" = "即诸葛武侯祠, 在现在成都, 晋李雄初建", "锦官城" = "成都的别名", "柏森森" = "柏树茂盛繁密的样子" } + +["映阶碧草自春色, 隔叶黄鹂空好音."] +note = [] +content = "映阶/碧草/自/春色/, 隔叶/黄鹂/空/好音./" +translation = "碧草映照石阶, 不过自为春色; 隔着树叶的黄鹂, 亦不过空作好音. " +keyword_note = { "自" = "白白的, 徒然", "空" = "白白的, 徒然", "好音" = "美妙的声音" } + +["三顾频烦天下计, 两朝开济老臣心."] +note = [] +content = "三顾/频烦/天下/计/, 两朝/开济/老臣/心./" +translation = "刘备为统一天下而三顾茅庐, 问计于诸葛亮, 辅佐两代君主的老臣忠心耿耿. " +keyword_note = { "三顾" = "刘备三顾茅庐", "频烦" = "频繁, 多次", "两朝" = "刘备、刘禅父子两朝", "开济" = "开创帝业, 扶助朝政" } + +["出师未捷身先死, 长使英雄泪满襟."] +note = [] +content = "出师/未捷/身/先死/, 长使/英雄/泪/满襟./" +translation = "可惜出师伐魏还没有取得最后的胜利就先去世了, 常使后代英雄感慨泪湿衣襟! " +keyword_note = { "出师" = "出兵", "未捷" = "没有取得胜利", "长使" = "常使", "泪满襟" = "泪湿衣襟" } + +["蜀道难"] +note = [] +content = "蜀道难/" +translation = "蜀道难" +keyword_note = {} + +["噫吁嚱, 危乎高哉!"] +note = ['惊叹声, 蜀方言, 表示惊讶的声音'] +content = "噫吁嚱/, 危乎/高哉!/" +translation = "唉呀呀! 多么高峻伟岸! " +keyword_note = { "噫吁嚱" = "惊叹声, 蜀方言" } + +["蜀道之难, 难于上青天!"] +note = [] +content = "蜀道/之难/, 难于/上青天!/" +translation = "蜀道难以攀越, 简直难于上青天. " +keyword_note = {} + +["蚕丛及鱼凫, 开国何茫然!"] +note = ['蚕丛、鱼凫: 传说中古蜀国两位国王的名字'] +content = "蚕丛/及/鱼凫/, 开国/何/茫然!/" +translation = "传说中蚕丛和鱼凫建立了蜀国, 开国的年代实在久远无法详谈. " +keyword_note = { "蚕丛" = "古蜀国国王", "鱼凫" = "古蜀国国王", "茫然" = "渺茫遥远的样子" } + +["尔来四万八千岁, 不与秦塞通人烟."] +note = [] +content = "尔来/四万八千岁/, 不与/秦塞/通人烟./" +translation = "从那时至今约有四万八千年了吧, 秦蜀被秦岭所阻从不沟通往返. " +keyword_note = { "尔来" = "从那时以来", "秦塞" = "秦的关塞, 指秦地", "通人烟" = "人员往来" } + +["西当太白有鸟道, 可以横绝峨眉巅."] +note = [] +content = "西当/太白/有/鸟道/, 可以/横绝/峨眉巅./" +translation = "西边太白山高峻无路只有飞鸟可通行, 此山可以直通峨眉山巅. " +keyword_note = { "西当" = "西对", "太白" = "太白山", "鸟道" = "只有鸟能飞过的山路", "横绝" = "横越", "峨眉巅" = "峨眉顶峰" } + +["地崩山摧壮士死, 然后天梯石栈相钩连."] +note = [] +content = "地崩/山摧/壮士死/, 然后/天梯/石栈/相钩连./" +translation = "山崩地裂, 埋葬了五位开山英雄壮士, 这样以后高险的山路和栈道才相互勾连. " +keyword_note = { "天梯" = "陡峭的山路", "石栈" = "栈道" } + +["上有六龙回日之高标, 下有冲波逆折之回川."] +note = [] +content = "上有/六龙/回日/之/高标/, 下有/冲波/逆折/之/回川./" +translation = "蜀中上有挡住太阳神六龙车的山巅, 下有激浪排空迂回曲折的大川. " +keyword_note = { "高标" = "最高峰", "冲波" = "激流", "逆折" = "水流回旋", "回川" = "有漩涡的河流" } + +["黄鹤之飞尚不得过, 猿猱欲度愁攀援."] +note = [] +content = "黄鹤/之飞/尚/不得过/, 猿猱/欲度/愁/攀援./" +translation = "善于高飞的黄鹤尚且无法飞过, 即使猢狲要想翻过也愁于攀援. " +keyword_note = { "黄鹤" = "善飞的大鸟", "尚" = "尚且", "猿猱" = "善攀援的猴类" } + +["青泥何盘盘, 百步九折萦岩峦."] +note = ['青泥: 青泥岭'] +content = "青泥/何/盘盘/, 百步/九折/萦/岩峦./" +translation = "青泥岭的泥路曲曲弯弯, 百步九折萦绕着山峦. " +keyword_note = { "青泥" = "青泥岭", "盘盘" = "曲折回旋", "百步九折" = "百步内拐九道弯", "萦" = "盘绕", "岩峦" = "山峰" } + +["扪参历井仰胁息, 以手抚膺坐长叹."] +note = ['参、井: 星宿名, 参星为蜀之分野, 井星为秦之分野'] +content = "扪参/历井/仰/胁息/, 以手/抚膺/坐/长叹./" +translation = "屏住呼吸仰头就可触摸参星和井星, 紧张得透不过气来, 用手抚胸惊恐不已徒长吁短叹. " +keyword_note = { "扪参历井" = "触摸参星经过井星", "胁息" = "屏气不敢呼吸", "膺" = "胸", "坐" = "徒, 空" } + +["问君西游何时还? 畏途巉岩不可攀."] +note = [] +content = "问君/西游/何时/还? /畏途/巉岩/不可/攀./" +translation = "好朋友呵请问你西游何时回还? 这蜀道的峭岩险道实在难以登攀! " +keyword_note = { "畏途" = "可怕的路途", "巉岩" = "险恶陡峭的山壁" } + +["但见悲鸟号古木, 雄飞雌从绕林间."] +note = [] +content = "但见/悲鸟/号/古木/, 雄飞/雌从/绕/林间./" +translation = "只见那悲鸟在古树上哀鸣啼叫; 雄雌相随飞翔在茂密树丛之间. " +keyword_note = { "但见" = "只听见", "号古木" = "在古树木中大声啼鸣", "从" = "跟随" } + +["又闻子规啼夜月, 愁空山."] +note = [] +content = "又闻/子规/啼/夜月/, 愁/空山./" +translation = "月夜又听到杜鹃凄凉悲啼, 在空山中传响回荡, 令人愁思绵绵无穷尽! " +keyword_note = { "子规" = "杜鹃鸟" } + +["蜀道之难, 难于上青天, 使人听此凋朱颜!"] +note = [] +content = "蜀道/之难/, 难于/上青天/, 使人/听此/凋/朱颜!/" +translation = "蜀道难以攀越, 简直难于上青天, 使人听到这些怎么不脸色突变? " +keyword_note = { "凋朱颜" = "红颜带忧色, 如花凋谢" } + +["连峰去天不盈尺, 枯松倒挂倚绝壁."] +note = [] +content = "连峰/去天/不盈尺/, 枯松/倒挂/倚/绝壁./" +translation = "山峰座座相连离天还不到一尺, 枯松老枝倒挂倚贴在绝壁之间. " +keyword_note = { "去" = "距离", "盈" = "满" } + +["飞湍瀑流争喧豗, 砯崖转石万壑雷."] +note = [] +content = "飞湍/瀑流/争/喧豗/, 砯崖/转石/万壑/雷./" +translation = "漩涡飞转瀑布飞泻争相喧闹着, 飞流撞击着巨石在山谷中滚动像万壑鸣雷一般. " +keyword_note = { "飞湍" = "飞奔而下的急流", "喧豗" = "喧闹声", "砯崖" = "水冲击石壁", "壑" = "山谷" } + +["其险也如此, 嗟尔远道之人胡为乎来哉!"] +note = [] +content = "其险/也/如此/, 嗟/尔/远道/之人/胡为乎/来哉!/" +translation = "这样危险的地方, 唉呀呀你这个远方而来的客人, 为什么非要来这里不可呀? " +keyword_note = { "嗟" = "感叹声", "尔" = "你", "胡为" = "为什么" } + +["剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开."] +note = ['剑阁: 剑门关'] +content = "剑阁/峥嵘/而/崔嵬/, 一夫/当关/, 万夫/莫开./" +translation = "剑阁所在崇峻巍峨高入云端, 只要一人把守千军万马难攻占. " +keyword_note = { "剑阁" = "剑门关", "峥嵘崔嵬" = "山势高大雄峻", "一夫当关" = "一人守关", "万夫莫开" = "万人不能打开" } + +["所守或匪亲, 化为狼与豺."] +note = [] +content = "所守/或/匪亲/, 化为/狼/与/豺./" +translation = "驻守的官员倘若不是可信赖的人, 难免要变为豺狼, 据险作乱. " +keyword_note = { "所守" = "把守关口的人", "或匪亲" = "倘若不是可信赖的人" } + +["朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻."] +note = [] +content = "朝/避/猛虎/, 夕/避/长蛇/, 磨牙/吮血/, 杀人/如麻./" +translation = "每日每夜都要躲避猛虎和长蛇, 它们磨牙吮血, 杀人如麻. " +keyword_note = { "朝" = "早上", "吮" = "吸" } + +["锦城虽云乐, 不如早还家."] +note = ['锦城: 成都'] +content = "锦城/虽/云/乐/, 不如/早/还家./" +translation = "锦官城虽然说是个快乐的所在, 如此险恶还不如早早地把家还. " +keyword_note = { "锦城" = "成都" } + +["蜀道之难, 难于上青天, 侧身西望长咨嗟!"] +note = [] +content = "蜀道/之难/, 难于/上青天/, 侧身/西望/长/咨嗟!/" +translation = "蜀道难以攀越, 简直难于上青天, 侧身西望令人不免感慨与长叹! " +keyword_note = { "咨嗟" = "叹息" } + +["论语·侍坐"] +note = [] +content = "论语·侍坐/" +translation = "论语·侍坐" +keyword_note = {} + +["子路、曾皙、冉有、公西华侍坐"] +note = ['选自《论语》'] +content = "子路/、曾皙/、冉有/、公西华/侍坐/" +translation = "子路、曾皙、冉有、公西华侍奉 (孔子) 而坐" +keyword_note = { "侍坐" = "执弟子之礼, 侍奉老师而坐" } + +["子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?"] +note = [] +content = "子曰/: 以吾一日长乎尔/, 毋吾以也. /居则曰/: 不吾知也. /如或知尔/, 则何以哉?/" +translation = "孔子说: 因为我年纪比你们大一点, 你们不要凭这个原因就不敢说话了. (你们) 平日在家的时候常说: 没有人了解我呀! 如果有人了解你们, 那 (你们) 打算怎么做呢? " +keyword_note = { "以吾一日长乎尔" = "因为我年纪比你们大一点", "毋吾以也" = "宾语前置, 正常的语序是'毋以吾也'", "居则曰" = "平日在家的时候说", "不吾知也" = "宾语前置, 即'不知吾也'", "如或" = "如果有人", "何以" = "用什么 (去实现自己的抱负) " } + +["子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也"] +note = [] +content = "子路率尔而对曰/: 千乘之国/, 摄乎大国之间/, 加之以师旅/, 因之以饥馑; /由也为之/, 比及三年/, 可使有勇/, 且知方也/" +translation = "子路不假思索地回答道: 一个拥有千辆兵车的诸侯国, 夹在大国之间, 有 (别国) 军队来侵略它, 接着 (国内) 又遇上饥荒; 如果让我治理这个国家, 等到第三年, 就可以使人人勇敢善战, 而且还懂得道理" +keyword_note = { "率尔" = "不假思索的样子", "千乘之国" = "有一千辆兵车的诸侯国", "摄乎大国之间" = "夹在大国之间", "加之以师旅" = "有军队来攻打它", "因之以饥馑" = "接连下来 (国内) 又有饥荒", "比及" = "等到", "方" = "道, 合乎礼义的行事准则" } + +["夫子哂之"] +note = [] +content = "夫子哂之/" +translation = "孔子听了微微一笑" +keyword_note = { "哂" = "微笑, 这里略带讥讽" } + +["求! 尔何如?"] +note = [] +content = "求/! /尔何如?/" +translation = "冉有, 你怎么样? " +keyword_note = { "尔何如" = "你怎么样" } + +["对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子"] +note = [] +content = "对曰/: 方六七十/, 如五六十/, 求也为之/, 比及三年/, 可使足民. /如其礼乐/, 以俟君子/" +translation = "冉有回答说: 一个纵横六七十里、或者五六十里的地方, 如果让我去治理, 等到三年, 就可以使百姓富足. 至于修明礼乐, 那就只有等待贤人君子了" +keyword_note = { "方" = "见方, 纵横", "如" = "或者", "足民" = "使百姓富足", "如其礼乐" = "至于修明礼乐", "俟" = "等待" } + +["赤! 尔何如?"] +note = [] +content = "赤/! /尔何如?/" +translation = "公西华, 你怎么样? " +keyword_note = {} + +["对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉"] +note = [] +content = "对曰/: 非曰能之/, 愿学焉. /宗庙之事/, 如会同/, 端章甫/, 愿为小相焉/" +translation = "公西华回答说: 我不敢说胜任什么, 但愿意学习做这些. 宗庙祭祀的工作, 或者是诸侯会盟及朝见天子的时候, 我愿意穿戴好礼服礼帽做一个小相" +keyword_note = { "能" = "胜任", "焉" = "这里作指示代词兼语气词, 指代下文'小相'这种工作", "宗庙之事" = "宗庙祭祀的工作", "会同" = "诸侯会盟及朝见天子", "端章甫" = "穿着礼服, 戴着礼帽", "相" = "在祭祀、会盟或朝见天子时主持赞礼和司仪的人" } + +["点! 尔何如?"] +note = [] +content = "点/! /尔何如?/" +translation = "曾皙, 你怎么样? " +keyword_note = {} + +["鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰"] +note = [] +content = "鼓瑟希/, 铿尔/, 舍瑟而作/, 对曰/: 异乎三子者之撰/" +translation = " (曾皙) 弹瑟的声音逐渐稀疏了, 接着铿的一声, 他放下瑟直起身子回答说: 我和他们三人的才能不一样" +keyword_note = { "鼓瑟希" = "弹瑟的声音逐渐稀疏了, 希同'稀'", "铿尔" = "铿的一声", "舍瑟而作" = "放下瑟直起身子", "撰" = "才具, 才能" } + +["子曰: 何伤乎? 亦各言其志也"] +note = ['何伤 一作: 何妨'] +content = "子曰/: 何伤乎? /亦各言其志也/" +translation = "孔子说: 有什么妨害呢? 不过是各自谈谈自己的志向" +keyword_note = { "何伤" = "何妨", "亦" = "不过是, 只不过" } + +["曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归"] +note = ['莫 通: 暮'] +content = "曰/: 莫春者/, 春服既成/, 冠者五六人/, 童子六七人/, 浴乎沂/, 风乎舞雩/, 咏而归/" +translation = "曾皙说: 暮春时节, 春天的衣服已经穿上了. 和几个成年人、几个孩童到沂水里沐浴, 在舞雩台上吹吹风, 一路唱着歌儿回来" +keyword_note = { "莫春" = "暮春, 指农历三月, 莫同'暮'", "春服既成" = "春天的衣服已经穿上了", "冠者" = "成年人", "浴乎沂" = "在沂水里沐浴", "风乎舞雩" = "在舞雩台上吹风", "咏" = "唱歌" } + +["夫子喟然叹曰: 吾与点也!"] +note = [] +content = "夫子喟然叹曰/: 吾与点也!/" +translation = "孔子长叹一声说: 我赞同曾皙的想法呀! " +keyword_note = { "喟然" = "叹息的样子", "与" = "赞成" } + +["三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?"] +note = [] +content = "三子者出/, 曾皙后. /曾皙曰/: 夫三子者之言何如?/" +translation = "子路、冉有、公西华都出去了, 曾皙最后走. 曾皙问孔子: 他们三个人的话怎么样? " +keyword_note = { "后" = "动词, 后出", "夫三子者之言何如" = "那三个人的话怎么样" } + +["子曰: 亦各言其志也已矣"] +note = [] +content = "子曰/: 亦各言其志也已矣/" +translation = "孔子说: 也不过是各自谈谈自己的志向罢了! " +keyword_note = { "也已矣" = "罢了, 语气词连用" } + +["曰: 夫子何哂由也?"] +note = [] +content = "曰/: 夫子何哂由也?/" +translation = "曾皙说: 您为什么笑仲由呢? " +keyword_note = { "何" = "为什么" } + +["曰: 为国以礼, 其言不让, 是故哂之"] +note = [] +content = "曰/: 为国以礼/, 其言不让/, 是故哂之/" +translation = " (孔子) 说: 治国要用礼, 可是他 (子路) 的话毫不谦逊, 所以我笑他" +keyword_note = { "为国以礼" = "治国要用礼", "让" = "礼让, 谦逊", "是故" = "所以" } + +["唯求则非邦也与?"] +note = [] +content = "唯求则非邦也与?/" +translation = "难道冉有讲的不是国家大事吗? " +keyword_note = { "唯" = "用于句首, 表示语气", "邦" = "国家, 指国家大事", "与" = "同'欤', 疑问语气词" } + +["安见方六七十如五六十而非邦也者?"] +note = [] +content = "安见方六七十如五六十而非邦也者?/" +translation = "怎见得方圆六七十里或者五六十里的地方就不是国家呢? " +keyword_note = { "安见" = "怎见得" } + +["唯赤则非邦也与?"] +note = [] +content = "唯赤则非邦也与?/" +translation = "难道公西华讲的不是诸侯的大事吗? " +keyword_note = {} + +["宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?"] +note = [] +content = "宗庙会同/, 非诸侯而何? /赤也为之小/, 孰能为之大?/" +translation = "宗庙祭祀, 诸侯会盟和朝见天子, 不是诸侯的大事又是什么呢? 如果公西华只能给诸侯做一个小相, 那么谁能做大相呢? " +keyword_note = { "宗庙会同" = "宗庙祭祀, 诸侯会盟和朝见天子", "非诸侯而何" = "不是诸侯的大事又是什么呢", "为之小" = "做小相", "为之大" = "做大相" } + +["论语·学而八佾"] +note = [] +content = "论语·学而八佾/" +translation = "论语·学而八佾" +keyword_note = {} + +["君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已."] +note = ['学而篇'] +content = "君子/食/无/求/饱/, 居/无/求/安/, 敏/于/事/而/慎/于/言/, 就/有/道/而/正/焉/, 可/谓/好/学/也/已./" +translation = "君子吃食不追求饱足; 居住不追求安逸; 做事勤奋敏捷, 说话谨慎; 到有道德的人那里去匡正自己, 就可以称得上是好学了" +keyword_note = { "敏" = "勤勉", "就有道而正焉" = "到有道的人那里去匡正自己" } + +["人而不仁, 如礼何? 人而不仁, 如乐何?"] +note = ['八佾篇'] +content = "人/而/不/仁/, 如/礼/何/? 人/而/不/仁/, 如/乐/何?/" +translation = "人如果没有仁爱之心, 那他怎样遵守礼仪制度呢? 人如果没有仁爱之心, 礼乐有什么用呢? " +keyword_note = { "而" = "如果", "如礼何" = "怎样对待礼呢" } + +["朝闻道, 夕死可矣."] +note = ['里仁篇'] +content = "朝/闻/道/, 夕/死/可/矣./" +translation = "早晨能够得知真理, 即使当晚死去, 也没有遗憾" +keyword_note = {} + +["君子喻于义, 小人喻于利."] +note = ['里仁篇'] +content = "君子/喻/于/义/, 小人/喻/于/利./" +translation = "君子通晓的是道义, 小人只通晓利益" +keyword_note = { "喻" = "知晓, 明白" } + +["见贤思齐焉, 见不贤而内自省也."] +note = ['里仁篇'] +content = "见/贤/思/齐/焉/, 见/不/贤/而/内/自/省/也./" +translation = "看见德才兼备的人就向他学习, 希望能向他看齐; 看见不贤的人, 就反省自己有没有和他一样的缺点, 有要改正" +keyword_note = {} + +["质胜文则野, 文胜质则史. 文质彬彬, 然后君子."] +note = ['雍也篇'] +content = "质/胜/文/则/野/, 文/胜/质/则/史/. 文/质/彬/彬/, 然后/君子./" +translation = "质朴胜过了文饰就会粗野, 文饰胜过了质朴就会虚浮不实, 质朴和文饰相杂适中, 然后才可以成为君子" +keyword_note = { "质" = "质朴、朴实", "文" = "华美、文采", "野" = "粗野、鄙俗", "史" = "虚饰, 浮夸", "文质彬彬" = "文质兼备、配合适当的样子" } + +["士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?"] +note = ['泰伯篇'] +content = "士/不可/以/不/弘毅/, 任/重/而/道/远/. 仁/以/为/己/任/, 不/亦/重/乎/? 死/而/后/已/, 不/亦/远/乎?/" +translation = "有抱负的人不可不志向远大, 意志坚强, 因为他肩负重大责任, 路途漫长遥远. 以实行仁道为己任, 不是很重大的责任吗? 直到身死才能结束, 不是很漫长遥远的吗? " +keyword_note = { "弘毅" = "志向远大, 意志坚强", "弘" = "广、大, 这里指志向远大" } + +["譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也."] +note = ['子罕篇'] +content = "譬如/为/山/, 未/成/一/篑/, 止/, 吾/止/也/. 譬如/平/地/, 虽/覆/一/篑/, 进/, 吾/往/也./" +translation = "比如用土堆山, 只差一筐土就完成了, 这时停止, 那是我自己要停下来; 比如填平洼地, 虽然只倒下一筐, 但我也在前进" +keyword_note = { "未成一篑" = "只差一筐土没有成功", "篑" = "盛土的竹筐", "平地" = "填平洼地" } + +["知者不惑, 仁者不忧, 勇者不惧."] +note = ['子罕篇'] +content = "知/者/不/惑/, 仁/者/不/忧/, 勇/者/不/惧./" +translation = "有智慧的人不会迷惑, 有仁德的人不会忧愁, 勇敢的人不会害怕" +keyword_note = { "知" = "同'智'" } + +["克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?"] +note = ['颜渊篇'] +content = "克/己/复/礼/为/仁/. 一/日/克/己/复/礼/, 天下/归/仁/焉/. 为/仁/由/己/, 而/由/人/乎/哉?/" +translation = "约束自己, 使自己的行为归到礼的方面去就是仁. 一旦约束自己, 使自己的行为归到礼的方面去, 天下人就会称赞你是个仁人了. 实行仁德, 完全在于自己, 难道还在于别人吗? " +keyword_note = { "克己复礼" = "约束自我, 使言行归复于先王之礼", "一日" = "一旦", "归" = "称赞, 称许" } + +["非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动."] +note = ['颜渊篇'] +content = "非/礼/勿/视/, 非/礼/勿/听/, 非/礼/勿/言/, 非/礼/勿/动./" +translation = "不合于礼的不要看, 不合于礼的不要听, 不合于礼的不要说, 不合于礼的不要做" +keyword_note = {} + +["有一言而可以终身行之者乎?"] +note = ['卫灵公篇'] +content = "有/一/言/而/可/以/终身/行/之/者/乎?/" +translation = "有没有一个字可以终身奉行的呢? " +keyword_note = { "一言" = "一个字" } + +["其'恕'乎! 己所不欲, 勿施于人."] +note = ['卫灵公篇'] +content = "其/'恕'/乎! 己/所/不/欲/, 勿/施/于/人./" +translation = "那大概就是'恕'吧! 自己不喜欢的事物, 不要强加于别人身上" +keyword_note = {} + +["小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名."] +note = ['阳货篇'] +content = "小子/何/莫/学/夫/《诗》/? 《诗》/可/以/兴/, 可/以/观/, 可/以/群/, 可/以/怨/. 迩/之/事/父/, 远/之/事/君/. 多/识/于/鸟/兽/草/木/之/名./" +translation = "学生们为什么没有人学《诗经》呢? 《诗经》可以使人受到感染, 得到启发和鼓舞; 可以观察人情风俗的盛衰, 认识社会现实; 可以通过情感交流, 彼此感染,和谐相处; 可以抒发心中不平, 讽刺不良政治. 近则可以用其中的道理来侍奉父母; 远可以用来侍奉君主, 还可以多认识鸟兽草木的名称" +keyword_note = { "小子" = "老师对学生的称呼", "夫" = "那", "兴" = "指激发人的感情", "观" = "指观察政治的得失、风俗的盛衰", "群" = "指提高人际交往能力", "怨" = "指讽刺时政", "迩" = "近" } + +["谏太宗十思疏"] +note = [] +content = "谏太宗十思疏/" +translation = "谏太宗十思疏" +keyword_note = {} + +["臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义."] +note = [] +content = "臣闻/求木之/长者/, 必固/其根本; /欲流之/远者/, 必浚/其泉源; /思国之/安者/, 必积/其德义./" +translation = "我听说想要树木长得好, 一定要使它的根牢固; 想要泉水流得远, 一定要疏通它的源泉; 想要国家安定, 一定要厚积道德仁义" +keyword_note = { "长(zhǎng)" = "生长, 这里指长得好", "固" = "使……牢固", "根本" = "树根", "浚(jùn)" = "疏通, 挖深", "德义" = "道德仁义" } + +["源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!"] +note = ['思国之理 一作: 思国之治'] +content = "源不深/而望/流之远/, 根不固/而求/木之长/, 德不厚/而思/国之理/, 臣虽/下愚/, 知其/不可/, 而况于/明哲乎!/" +translation = "源泉不深却希望泉水流得远, 根系不牢固却想要树木生长得高, 道德不深厚却想要国家安定, 微臣虽然愚笨, (也) 知道这是不可能的, 更何况 (您这) 聪明睿智 (的人) 呢! " +keyword_note = { "下愚" = "处于地位低见识浅的人", "明哲" = "聪明睿智的人", "国之理" = "国家治理, 太平" } + +["人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休."] +note = [] +content = "人君/当/神器之重/, 居/域中之大/, 将崇/极天之峻/, 永保/无疆之休./" +translation = "国君掌握帝位的重权, 在天地间尊大, 就要推崇皇权的高峻, 永保永无止境的美善" +keyword_note = { "神器" = "帝位", "域中" = "天地之间", "休" = "美, 这里指政权的平和美好" } + +["不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也."] +note = ['塞源而欲流长者也 一作: 塞源而欲流长也'] +content = "不念/居安思危/, 戒奢/以俭/, 德不处/其厚/, 情不胜/其欲/, 斯亦/伐根/以求/木茂/, 塞源/而欲/流长者也./" +translation = "如果不在安逸的环境中想着危难, 戒奢侈而行节俭, 道德不能保持宽厚, 性情不能克服欲望, 这也如同挖断树根却想要树木长得茂盛, 堵塞源泉却想要泉水流得远一样啊! " +keyword_note = { "居安思危" = "在安逸时想到危难", "戒奢以俭" = "戒除奢侈而行节俭", "伐" = "砍伐", "塞" = "堵塞" } + +["凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰."] +note = ['凡百 一作: 凡昔'] +content = "凡百/元首/, 承天/景命/, 莫不/殷忧/而道著/, 功成/而德衰./" +translation = " (古代) 所有的帝王, 承受了上天赋予的重大使命, 他们没有一个不为国家深切地忧虑而且治理成效显著的, 但一旦功业建成就德性衰减" +keyword_note = { "凡百" = "所有的", "元首" = "帝王", "景命" = "大命, 重大使命", "殷忧" = "深忧" } + +["有善始者实繁, 能克终者盖寡."] +note = [] +content = "有/善始者/实繁/, 能/克终者/盖寡./" +translation = "国君开头做得好的实在很多, 能够坚持到底的大概很少" +keyword_note = { "善始" = "开头做得好", "克终" = "能够坚持到底", "盖" = "大概, 表推测语气" } + +["岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?"] +note = [] +content = "岂/取之易/而守之难乎? /昔/取之/而有余/, 今/守之/而不足/, 何也?/" +translation = "难道是取得天下容易守住天下困难吗? 过去夺取天下时力量有余, 现在守卫天下却力量不足, 这是为什么呢? " +keyword_note = { "取" = "取得天下", "守" = "守卫天下" } + +["夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物."] +note = [] +content = "夫/在殷忧/, 必/竭诚/以待下; /既得志/, 则/纵情/以傲物./" +translation = "因为处在深重的忧虑之中, 一定能竭尽诚心来对待臣民. 成功之后, 就放纵自己的性情来傲视别人" +keyword_note = { "竭诚" = "竭尽诚心", "待下" = "对待臣下", "纵情" = "放纵情感", "傲物" = "傲视别人" } + +["竭诚则胡越为一体, 傲物则骨肉为行路."] +note = ['胡越 一作: 吴越'] +content = "竭诚/则/胡越/为一体/, 傲物/则/骨肉/为行路./" +translation = "竭尽诚心, 胡越之人也将同心同德; 傲视别人, 至亲骨肉也会成为不相干的路人" +keyword_note = { "胡越" = "胡地在北, 越地在南, 比喻相隔遥远", "骨肉" = "指父母兄弟子女", "行路" = "路人, 比喻毫无关系的人" } + +["虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服."] +note = [] +content = "虽/董之/以严刑/, 振之/以威怒/, 终/苟免/而不怀仁/, 貌恭/而不心服./" +translation = "即使用严酷的刑罚来督责 (人们) , 用威风怒气来吓唬 (人们) , 人们最终只求苟且免于刑罚而不怀念感激国君的仁德, 表面上恭敬但在心里不服气" +keyword_note = { "董" = "督责", "振" = "通'震', 震慑", "苟免" = "苟且免于刑罚", "怀仁" = "怀念仁德" } + +["怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!"] +note = [] +content = "怨/不在大/, 可畏/惟人; /载舟/覆舟/, 所宜/深慎; /奔车/朽索/, 其可/忽乎!/" +translation = " (臣民) 对国君的怨恨不在大小, 可怕的只是百姓的力量; (他们像水一样) 能够负载船只, 也能颠覆船只, 这是应当深切戒慎的. 用腐烂的绳索驾驭疾驰的马车, 这样可以忽视不理吗? " +keyword_note = { "惟人" = "只是百姓 (因避讳写作'人') ", "载舟覆舟" = "比喻百姓能拥戴皇帝, 也能推翻他的统治", "奔车朽索" = "用腐烂的绳索驾驭疾驰的马车" } + +["君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑."] +note = ['想谗邪 一作: 惧谗邪'] +content = "君人者/, 诚能/见可欲/则思/知足/以自戒/, 将有作/则思/知止/以安人/, 念高危/则思/谦冲/而自牧/, 惧满溢/则思/江海/下百川/, 乐盘游/则思/三驱/以为度/, 忧懈怠/则思/慎始/而敬终/, 虑壅蔽/则思/虚心/以纳下/, 想谗邪/则思/正身/以黜恶/, 恩所加/则思/无因喜/以谬赏/, 罚所及/则思/无因怒/而滥刑./" +translation = "统治天下的人, 如果真的能够做到一见到能引起 (自己) 喜好的东西就要想到用知足来自我克制, 将要兴建什么就要想到适可而止来使百姓安定, 想到 (君位) 高而险, 就要不忘谦虚, 加强自身的道德修养. 害怕骄傲自满, 就要像江海居于百川之下 (而能容纳百川) , 喜爱狩猎就想到网三面留一面, 担心意志松懈就想到 (做事) 要慎始慎终, 担心 (言路) 不通受蒙蔽就想到虚心采纳臣下的意见, 考虑到 (朝中可能会出现) 谗佞奸邪就想到使自身端正 (才能) 罢黜奸邪, 施加恩泽就要考虑到不要因为一时高兴而奖赏不当, 动用刑罚就要想到不要因为一时发怒而滥用刑罚" +keyword_note = { "见可欲" = "见到能引起喜好的东西", "有作" = "兴建建筑物", "知止" = "知道适可而止", "谦冲" = "谦虚", "自牧" = "自我修养", "下百川" = "居于百川之下", "三驱" = "一年打猎三次为度", "慎始敬终" = "谨慎开始谨慎结束", "壅蔽" = "堵塞蒙蔽", "谗邪" = "谗佞奸邪", "黜恶" = "罢黜奸恶", "谬赏" = "错误奖赏", "滥刑" = "滥用刑罚" } + +["总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠."] +note = ['弘兹 一作: 宏兹'] +content = "总/此十思/, 弘兹/九德/, 简能/而任之/, 择善/而从之/, 则/智者/尽其谋/, 勇者/竭其力/, 仁者/播其惠/, 信者/效其忠./" +translation = "全面做到这十件应该深思的事, 弘扬这九种美德, 选拔有才能的人而任用他, 挑选好的意见而听从它. 那么有智慧的人就能充分献出他的谋略, 勇敢的人就能完全使出他的力量, 仁爱的人就能散播他的恩惠, 诚信的人就能献出他的忠诚" +keyword_note = { "弘兹" = "弘扬这", "九德" = "九种美德", "简能" = "选拔有才能的人", "择善" = "挑选好的意见", "效" = "献出" } + +["文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化."] +note = ['在君 一作: 君臣'] +content = "文武/争驰/, 在君/无事/, 可以/尽/豫游之乐/, 可以/养/松乔之寿/, 鸣琴/垂拱/, 不言/而化./" +translation = "文臣武将争先恐后前来效力, 国君没有大事烦扰, 可以尽情享受出游的快乐, 可以颐养得像赤松子与王子乔那样长寿, 皇上弹着琴垂衣拱手就能治理好天下, 不用再说什么, 天下人就已经都有教化了" +keyword_note = { "争驰" = "争先效力", "豫游" = "出游", "松乔" = "赤松子和王子乔, 古代传说中的仙人", "垂拱" = "垂衣拱手, 比喻轻易治理天下", "化" = "教化" } + +["何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!"] +note = [] +content = "何必/劳神/苦思/, 代下/司职/, 役/聪明/之耳目/, 亏/无为/之大道哉!/" +translation = "为什么一定要 (自己) 劳神费思, 代替臣下管理职事, 役使自己灵敏、明亮的耳、眼, 减损顺其自然就能治理好天下的大道理呢! " +keyword_note = { "代下司职" = "代替臣下管理职事", "役" = "役使", "亏" = "减损", "无为" = "道家主张清静虚无, 顺其自然" } + +["贺新郎·国脉微如缕"] +note = [] +content = "贺新郎·国脉微如缕/" +translation = "贺新郎·国脉微如缕" +keyword_note = {} + +["国脉微如缕"] +note = ["词人以'如缕'比喻国家命脉衰微脆弱, 形势危急"] +content = "国脉/微/如缕/" +translation = "国家的命脉已经衰微得像一根细丝" +keyword_note = { "国脉" = "国家的命脉", "微" = "衰微", "如缕" = "像丝线一样, 形容脆弱" } + +["问长缨何时入手, 缚将戎主?"] +note = ['表达作者渴望投身军旅、为国擒敌的迫切心情'] +content = "问/长缨/何时/入手/, 缚将/戎主?/" +translation = "试问, 捆敌的长绳何时才能到我手中, 将敌酋捆绑擒来? " +keyword_note = { "长缨" = "长带子, 喻指擒敌的武器", "缚将" = "捆绑", "戎主" = "敌人的首领" } + +["未必人间无好汉, 谁与宽些尺度?"] +note = ['批判当时用人制度僵化, 呼吁不拘一格降人才'] +content = "未必/人间/无/好汉/, 谁与/宽些/尺度?/" +translation = "人世间未必没有英雄好汉, 只是谁能放宽用人的标准呢? " +keyword_note = { "好汉" = "英雄豪杰", "尺度" = "标准, 这里指用人标准" } + +["试看取当年韩五"] +note = ['韩世忠虽出身行伍却成为抗金名将, 说明人才不一定需要名师传授'] +content = "试看取/当年/韩五/" +translation = "试看当年的韩世忠将军" +keyword_note = { "韩五" = "南宋抗金名将韩世忠, 排行第五" } + +["岂有谷城公付授, 也不干曾遇骊山母"] +note = ['用典说明韩世忠的成功并非依靠神仙指点或名师传授'] +content = "岂有/谷城公/付授/, 也不干/曾遇/骊山母/" +translation = "他既没有得到谷城公的传授, 也不曾遇见骊山老母" +keyword_note = { "谷城公" = "即黄石公, 传说曾向张良传授兵书", "骊山母" = "道教女仙, 传说曾向李筌讲解《阴符》" } + +["谈笑起, 两河路"] +note = ['形容韩世忠指挥若定, 在河北地区大败金兵'] +content = "谈笑起/, 两河路/" +translation = "却在谈笑间指挥大军, 收复河北失地" +keyword_note = { "两河路" = "指宋代河北东路和河北西路, 即今河北、山西、河南部分地区" } + +["少时棋柝曾联句"] +note = ['回忆作者年轻时在军中的生活经历'] +content = "少时/棋柝/曾/联句/" +translation = "年轻时曾在军营中一边下棋一边联句作诗" +keyword_note = { "棋柝" = "下棋和打更", "联句" = "多人合作写诗, 每人一句或几句" } + +["叹而今登楼揽镜, 事机频误"] +note = ['抒发作者年老力衰、壮志未酬的感慨'] +content = "叹/而今/登楼/揽镜/, 事机/频误/" +translation = "可叹如今登楼远望、揽镜自照, 已力不从心, 多次错过了报国机会" +keyword_note = { "登楼揽镜" = "上楼照镜, 慨叹功业未建人已衰老", "事机" = "机会, 指从军报国的机会" } + +["闻说北风吹面急, 边上冲梯屡舞"] +note = ['描绘边境危急, 蒙古军攻势凶猛'] +content = "闻说/北风/吹面/急/, 边上/冲梯/屡舞/" +translation = "听说北风凛冽 (暗示蒙古军南侵) , 边境上敌军攻城的冲车云梯不断飞舞" +keyword_note = { "北风" = "暗指北来的蒙古兵", "冲梯" = "冲车和云梯, 古代攻城器具" } + +["君莫道投鞭虚语"] +note = ['警告不要轻视敌军实力, 用苻坚投鞭断流的典故'] +content = "君/莫道/投鞭/虚语/" +translation = "你不要认为'投鞭断流'只是空话 (喻敌军强大) " +keyword_note = { "投鞭" = "前秦苻坚曾说投鞭长江可断流, 形容兵多将广" } + +["自古一贤能制难, 有金汤便可无张许?"] +note = ['反问强调贤才比坚固城池更重要'] +content = "自古/一贤/能/制难/, 有/金汤/便可/无/张许?/" +translation = "自古以来, 一位贤才就能解除危难, 难道有了坚固城池就可以没有张巡、许远这样的良将吗? " +keyword_note = { "制难" = "解除危难", "金汤" = "金城汤池, 比喻坚固的防御工事", "张许" = "张巡和许远, 唐代安史之乱中死守睢阳的名将" } + +["快投笔, 莫题柱"] +note = ['呼吁文人弃文从武, 为国效力'] +content = "快/投笔/, 莫/题柱/" +translation = "赶快像班超那样投笔从戎, 不要像司马相如那样只追求功名利禄" +keyword_note = { "投笔" = "投笔从戎, 用汉代班超典故", "题柱" = "用司马相如题桥柱追求功名的典故" } + +["赤壁赋"] +note = [] +content = "赤壁赋/" +translation = "赤壁赋" +keyword_note = {} + +["壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下"] +note = [] +content = "壬戌/之秋/, 七月/既望/, 苏子/与客/泛舟/游于/赤壁/之下/" +translation = "壬戌年秋天, 七月十六日, 我与友人在赤壁下泛舟游玩" +keyword_note = { "壬戌" = "宋神宗元丰五年 (1082) ", "既望" = "农历十六日 (望指十五日) " } + +["清风徐来, 水波不兴"] +note = [] +content = "清风/徐来/, 水波/不兴/" +translation = "清风阵阵拂来, 水面波澜不起" +keyword_note = { "徐" = "舒缓地", "兴" = "起, 作" } + +["举酒属客, 诵明月之诗, 歌窈窕之章"] +note = [] +content = "举酒/属客/, 诵/明月/之诗/, 歌/窈窕/之章/" +translation = "举起酒杯向同伴劝酒, 吟诵《明月》中'窈窕'这一章" +keyword_note = { "属" = "通'嘱', 劝请", "窈窕之章" = "指《诗经·陈风·月出》篇" } + +["少焉, 月出于东山之上, 徘徊于斗牛之间"] +note = [] +content = "少焉/, 月出/于/东山/之上/, 徘徊/于/斗牛/之间/" +translation = "不一会儿, 明月从东山后升起, 在斗宿与牛宿之间来回移动" +keyword_note = { "少焉" = "一会儿", "斗牛" = "斗宿和牛宿, 星宿名" } + +["白露横江, 水光接天"] +note = [] +content = "白露/横江/, 水光/接天/" +translation = "月光下, 白茫茫的雾气笼罩江面, 天光、水色连成一片" +keyword_note = { "白露" = "白茫茫的水汽", "横" = "笼罩, 横贯" } + +["纵一苇之所如, 凌万顷之茫然"] +note = [] +content = "纵/一苇/之所如/, 凌/万顷/之茫然/" +translation = "任凭一片苇叶似的小船随意漂浮, 越过浩瀚无垠的江面" +keyword_note = { "一苇" = "像一片苇叶的小船", "凌" = "越过", "万顷" = "形容江面宽广" } + +["浩浩乎如冯虚御风, 而不知其所止"] +note = [] +content = "浩浩乎/如/冯虚/御风/, 而/不知/其所止/" +translation = "浩浩淼淼 (像长出羽翼一样) 驾风凌空飞行, 并不知道到哪里才会停栖" +keyword_note = { "冯虚" = "同'凭虚', 凌空", "御风" = "驾风" } + +["飘飘乎如遗世独立, 羽化而登仙"] +note = [] +content = "飘飘乎/如/遗世/独立/, 羽化/而/登仙/" +translation = "飘飘摇摇好像要离开尘世飘飞而起, 羽化成仙进入仙境" +keyword_note = { "遗世" = "超脱尘世", "羽化" = "道教称成仙为羽化" } + +["于是饮酒乐甚, 扣舷而歌之"] +note = [] +content = "于是/饮酒/乐甚/, 扣舷/而歌之/" +translation = "在这时喝酒喝得非常高兴, 打着节拍唱起歌来" +keyword_note = { "扣舷" = "敲打船边, 打节拍" } + +["歌曰: '桂棹兮兰桨, 击空明兮溯流光'"] +note = [] +content = "歌曰/: '桂棹/兮/兰桨/, 击/空明/兮/溯/流光'/" +translation = "歌中唱到: '桂木船棹啊香兰船桨, 击打着月光下的清波, 在泛着月光的水面逆流而上'" +keyword_note = { "空明" = "月光下的清澈江水", "溯" = "逆流而上", "流光" = "月光浮动的水面" } + +["渺渺兮予怀, 望美人兮天一方"] +note = [] +content = "渺渺兮/予怀/, 望/美人/兮/天一方/" +translation = "我的情思啊悠远茫茫, 眺望美人 (君主) 啊, 却在天的另一方" +keyword_note = { "渺渺" = "悠远的样子", "美人" = "指内心思慕的人, 常喻君主" } + +["客有吹洞箫者, 倚歌而和之"] +note = [] +content = "客有/吹洞箫/者/, 倚歌/而和之/" +translation = "有会吹洞箫的客人, 配着节奏为歌声伴和" +keyword_note = { "倚歌" = "随着歌声", "和" = "应和" } + +["其声呜呜然, 如怨如慕, 如泣如诉"] +note = [] +content = "其声/呜呜然/, 如怨/如慕/, 如泣/如诉/" +translation = "洞箫的声音呜呜咽咽: 有如哀怨有如思慕, 既像啜泣也像倾诉" +keyword_note = { "慕" = "思慕, 眷恋" } + +["余音袅袅, 不绝如缕"] +note = [] +content = "余音/袅袅/, 不绝/如缕/" +translation = "余音在江上回荡, 像细丝一样连续不断" +keyword_note = { "袅袅" = "声音婉转悠长", "缕" = "细丝" } + +["舞幽壑之潜蛟, 泣孤舟之嫠妇"] +note = [] +content = "舞/幽壑/之潜蛟/, 泣/孤舟/之嫠妇/" +translation = "能使深谷中的蛟龙为之起舞, 能使孤舟上的寡妇为之饮泣" +keyword_note = { "幽壑" = "深谷", "嫠妇" = "寡妇" } + +["苏子愀然, 正襟危坐而问客曰"] +note = [] +content = "苏子/愀然/, 正襟/危坐/而问/客曰/" +translation = "我的神色也愁惨起来, 整好衣襟坐端正, 向客人问道" +keyword_note = { "愀然" = "容色改变的样子", "正襟危坐" = "整理衣襟, 端正坐着" } + +["何为其然也?"] +note = [] +content = "何为/其然也?/" +translation = "'箫声为什么这样哀怨呢? '" +keyword_note = { "然" = "这样" } + +["客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?"] +note = [] +content = "客曰/: '月明/星稀/, 乌鹊/南飞/', 此非/曹孟德/之诗乎?/" +translation = "客人回答: '月明星稀, 乌鹊南飞, 这不是曹公孟德的诗么? '" +keyword_note = { "曹孟德" = "曹操, 字孟德" } + +["西望夏口, 东望武昌, 山川相缪, 郁乎苍苍"] +note = [] +content = "西望/夏口/, 东望/武昌/, 山川/相缪/, 郁乎/苍苍/" +translation = "这里向西可以望到夏口, 向东可以望到武昌, 山河接壤连绵不绝, 目力所及, 一片郁郁苍苍" +keyword_note = { "相缪" = "相互盘绕", "郁乎苍苍" = "树木茂密苍翠" } + +["此非孟德之困于周郎者乎?"] +note = [] +content = "此非/孟德/之困于/周郎/者乎?/" +translation = "这不正是曹孟德被周瑜所围困的地方么? " +keyword_note = { "周郎" = "周瑜" } + +["方其破荆州, 下江陵, 顺流而东也"] +note = [] +content = "方其/破/荆州/, 下/江陵/, 顺流/而东也/" +translation = "当初他攻陷荆州, 夺得江陵, 沿长江顺流东下" +keyword_note = { "破" = "攻破", "下" = "攻下" } + +["舳舻千里, 旌旗蔽空"] +note = [] +content = "舳舻/千里/, 旌旗/蔽空/" +translation = "麾下的战船首尾相连延绵千里, 旗子将天空全都蔽住" +keyword_note = { "舳舻" = "战船首尾相接" } + +["酾酒临江, 横槊赋诗"] +note = [] +content = "酾酒/临江/, 横槊/赋诗/" +translation = "面对大江斟酒, 横执长矛吟诗" +keyword_note = { "酾酒" = "斟酒", "横槊" = "横执长矛" } + +["固一世之雄也, 而今安在哉?"] +note = [] +content = "固/一世/之雄也/, 而今/安在哉?/" +translation = "本来是当世的一位英雄人物, 然而现在又在哪里呢? " +keyword_note = { "固" = "本来", "安在" = "在哪里" } + +["况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿"] +note = [] +content = "况/吾与子/渔樵/于/江渚/之上/, 侣/鱼虾/而友/麋鹿/" +translation = "何况我与你在江中的小洲打渔砍柴, 以鱼虾为侣, 以麋鹿为友" +keyword_note = { "渔樵" = "打渔砍柴", "侣" = "以...为伴侣", "友" = "以...为朋友" } + +["驾一叶之扁舟, 举匏樽以相属"] +note = [] +content = "驾/一叶/之扁舟/, 举/匏樽/以相属/" +translation = "在江上驾着这一叶小舟, 举起杯盏相互敬酒" +keyword_note = { "扁舟" = "小舟", "匏樽" = "用葫芦做的酒器" } + +["寄蜉蝣于天地, 渺沧海之一粟"] +note = [] +content = "寄/蜉蝣/于天地/, 渺/沧海/之一粟/" +translation = "如同蜉蝣置身于广阔的天地中, 像沧海中的一粒粟米那样渺小" +keyword_note = { "蜉蝣" = "一种生命短暂的昆虫", "粟" = "米粒" } + +["哀吾生之须臾, 羡长江之无穷"] +note = [] +content = "哀/吾生/之须臾/, 羡/长江/之无穷/" +translation = "哀叹我们的一生只是短暂的片刻, 不由羡慕长江的没有穷尽" +keyword_note = { "须臾" = "片刻", "无穷" = "没有穷尽" } + +["挟飞仙以遨游, 抱明月而长终"] +note = [] +content = "挟/飞仙/以遨游/, 抱/明月/而长终/" +translation = "想要携同仙人携手遨游各地, 与明月相拥而永存世间" +keyword_note = { "挟" = "携同", "长终" = "永远存在" } + +["知不可乎骤得, 托遗响于悲风"] +note = [] +content = "知/不可乎/骤得/, 托/遗响/于悲风/" +translation = "知道上面这些想法不能一下子实现, 只得将憾恨化为箫音, 托寄在悲凉的秋风中罢了" +keyword_note = { "骤得" = "一下子得到", "遗响" = "余音, 指箫声" } + +["苏子曰: '客亦知夫水与月乎?"] +note = [] +content = "苏子/曰/: '客/亦知/夫/水与月/乎?/" +translation = "我问道: '你可也知道这水与月? '" +keyword_note = { "夫" = "那" } + +["逝者如斯, 而未尝往也"] +note = [] +content = "逝者/如斯/, 而/未尝/往也/" +translation = "江水总是不停的流逝, 但它们并没有流走" +keyword_note = { "逝者如斯" = "语出《论语》, 流逝的就像这样", "往" = "流失" } + +["盈虚者如彼, 而卒莫消长也"] +note = [] +content = "盈虚者/如彼/, 而/卒莫/消长也/" +translation = "月亮总是那样有圆有缺, 但它终究也没有增减" +keyword_note = { "盈虚" = "圆缺", "卒" = "最终", "消长" = "增减" } + +["盖将自其变者而观之, 则天地曾不能以一瞬"] +note = [] +content = "盖将/自其/变者/而观之/, 则/天地/曾不能/以一瞬/" +translation = "可见, 从事物易变的一面看来, 天地间万事万物时刻在变动, 连一眨眼的工夫都不停止" +keyword_note = { "曾" = "甚至", "一瞬" = "一眨眼" } + +["自其不变者而观之, 则物与我皆无尽也"] +note = [] +content = "自其/不变者/而观之/, 则/物与我/皆无尽也/" +translation = "而从事物不变的一面看来, 万物同我们来说都是永恒的" +keyword_note = { "无尽" = "没有穷尽" } + +["而又何羡乎!"] +note = [] +content = "而又/何羡乎!/" +translation = "又有什么可羡慕的呢? " +keyword_note = { "何羡" = "羡慕什么" } + +["且夫天地之间, 物各有主"] +note = [] +content = "且夫/天地/之间/, 物/各有主/" +translation = "何况天地之间, 万物各有主宰者" +keyword_note = { "且夫" = "况且", "各有主" = "各有主宰" } + +["苟非吾之所有, 虽一毫而莫取"] +note = [] +content = "苟/非吾之/所有/, 虽/一毫/而莫取/" +translation = "若不是自己应该拥有的, 即使一分一毫也不能求取" +keyword_note = { "苟" = "如果", "一毫" = "一丝一毫" } + +["惟江上之清风, 与山间之明月"] +note = [] +content = "惟/江上/之清风/, 与/山间/之明月/" +translation = "只有江上的清风, 以及山间的明月" +keyword_note = { "惟" = "只有" } + +["耳得之而为声, 目遇之而成色"] +note = [] +content = "耳得之/而为声/, 目遇之/而成色/" +translation = "听到便成了声音, 进入眼帘便绘出形色" +keyword_note = { "得" = "听到", "遇" = "看到" } + +["取之无禁, 用之不竭"] +note = [] +content = "取之/无禁/, 用之/不竭/" +translation = "取得这些不会有人禁止, 感受这些也不会有竭尽的忧虑" +keyword_note = { "无禁" = "没有禁止", "不竭" = "不会枯竭" } + +["是造物者之无尽藏也, 而吾与子之所共适"] +note = [] +content = "是/造物者/之无尽藏也/, 而/吾与子/之所共适/" +translation = "这是大自然恩赐的没有穷尽的宝藏, 我和你可以共同享受" +keyword_note = { "造物者" = "大自然", "无尽藏" = "无穷无尽的宝藏", "共适" = "共同享受" } + +["客喜而笑, 洗盏更酌"] +note = [] +content = "客/喜而笑/, 洗盏/更酌/" +translation = "客人高兴地笑了, 洗净酒杯重新饮酒" +keyword_note = { "更酌" = "重新斟酒" } + +["肴核既尽, 杯盘狼籍"] +note = [] +content = "肴核/既尽/, 杯盘/狼籍/" +translation = "菜肴果品都已吃完, 杯子盘子杂乱一片" +keyword_note = { "肴核" = "菜肴和果品", "狼籍" = "凌乱的样子" } + +["相与枕藉乎舟中, 不知东方之既白"] +note = [] +content = "相与/枕藉/乎/舟中/, 不知/东方/之既白/" +translation = "大家互相枕着垫着睡在船上, 不知不觉东方已经露出白色的曙光" +keyword_note = { "枕藉" = "相互枕着躺着", "既白" = "已经天亮" } + +["过秦论"] +note = [] +content = "过秦论/" +translation = "过秦论" +keyword_note = {} + +["秦孝公据崤函之固, 拥雍州之地,"] +note = [] +content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" +translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," +keyword_note = { "据" = "占据", "崤函" = "崤山和函谷关", "雍州" = "古代九州之一" } + +["君臣固守以窥周室,"] +note = [] +content = "君臣/固守/以窥/周室,/" +translation = "君臣牢固地守卫着,借以窥视周王室的权力," +keyword_note = { "窥" = "窥视" } + +["有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心."] +note = [] +content = "有/席卷/天下/, 包举/宇内/, 囊括/四海/之意/, 并吞/八荒/之心./" +translation = "有席卷天下,包办天宇之间,囊括四海的意图,并统天下的雄心。" +keyword_note = { "席卷" = "像卷席子一样全部卷进去", "包举" = "像打包一样全部拿走", "囊括" = "像装口袋一样全部装进去", "八荒" = "八方荒远之地" } + +["当是时也, 商君佐之,"] +note = [] +content = "当是时也/, 商君/佐之,/" +translation = "正当这时,商鞅辅佐他," +keyword_note = { "商君" = "商鞅" } + +["内立法度, 务耕织, 修守战之具,"] +note = [] +content = "内/立法度/, 务/耕织/, 修/守战/之具,/" +translation = "对内建立法规制度,从事耕作纺织,修造防守和进攻的器械;" +keyword_note = { "法度" = "法规制度", "务" = "从事", "耕织" = "耕作纺织", "守战之具" = "防守和进攻的器械" } + +["外连衡而斗诸侯."] +note = [] +content = "外/连衡/而斗/诸侯./" +translation = "对外实行连衡策略,使诸侯自相争斗。" +keyword_note = { "连衡" = "连横策略", "斗" = "使...相斗" } + +["于是秦人拱手而取西河之外."] +note = [] +content = "于是/秦人/拱手/而取/西河/之外./" +translation = "因此,秦人轻而易举地夺取了黄河以西的土地。" +keyword_note = { "拱手" = "两手相合,形容毫不费力", "西河" = "黄河以西地区" } + +["孝公既没, 惠文、武、昭襄蒙故业, 因遗策,"] +note = [] +content = "孝公/既没/, 惠文/、武/、昭襄/蒙/故业/, 因/遗策,/" +translation = "秦孝公死了以后,惠文王、武王、昭襄王承继先前的基业,沿袭前代的策略," +keyword_note = { "既没" = "死后", "蒙" = "承继", "故业" = "先前的基业", "因" = "沿袭", "遗策" = "前代的策略" } + +["南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡."] +note = [] +content = "南取/汉中/, 西举/巴/、蜀/, 东割/膏腴/之地/, 北收/要害/之郡./" +translation = "向南夺取汉中,向西攻取巴、蜀,向东割取肥沃的地区,向北占领非常重要的地区。" +keyword_note = { "膏腴" = "肥沃", "要害" = "非常重要" } + +["诸侯恐惧, 会盟而谋弱秦,"] +note = [] +content = "诸侯/恐惧/, 会盟/而谋/弱秦,/" +translation = "诸侯恐慌害怕,集会结盟,商议削弱秦国。" +keyword_note = { "会盟" = "集会结盟", "弱秦" = "削弱秦国" } + +["不爱珍器重宝肥饶之地, 以致天下之士,"] +note = [] +content = "不爱/珍器/重宝/肥饶/之地/, 以致/天下/之士,/" +translation = "不吝惜奇珍贵重的器物和肥沃富饶的土地,用来招纳天下的优秀人才," +keyword_note = { "不爱" = "不吝惜", "珍器重宝" = "奇珍贵重的器物", "以致" = "用来招纳" } + +["合从缔交, 相与为一."] +note = [] +content = "合从/缔交/, 相与/为一./" +translation = "采用合纵的策略缔结盟约,互相援助,成为一体。" +keyword_note = { "合从" = "合纵策略", "缔交" = "缔结盟约" } + +["当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵."] +note = [] +content = "当此/之时/, 齐有/孟尝/, 赵有/平原/, 楚有/春申/, 魏有/信陵./" +translation = "在这个时候,齐国有孟尝君,赵国有平原君,楚国有春申君,魏国有信陵君。" +keyword_note = { "孟尝" = "孟尝君田文", "平原" = "平原君赵胜", "春申" = "春申君黄歇", "信陵" = "信陵君魏无忌" } + +["此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,"] +note = [] +content = "此/四君/者/, 皆/明智/而/忠信/, 宽厚/而/爱人/, 尊贤/而/重士,/" +translation = "这四位封君,都见识英明有智谋,心地诚而讲信义,待人宽宏厚道而爱惜人民,尊重贤才而重用士人," +keyword_note = { "明智" = "见识英明有智谋", "忠信" = "心地诚而讲信义", "爱人" = "爱惜人民", "尊贤" = "尊重贤才", "重士" = "重用士人" } + +["约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众."] +note = [] +content = "约从/离衡/, 兼/韩/、魏/、燕/、楚/、齐/、赵/、宋/、卫/、中山/之众./" +translation = "以合纵之约击破秦的连横之策,联合韩、魏、燕、楚、齐、赵、宋、卫、中山的部队。" +keyword_note = { "约从" = "采用合纵策略", "离衡" = "破坏连横策略", "兼" = "联合" } + +["于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,"] +note = [] +content = "于是/六国/之士/, 有/甯越/、徐尚/、苏秦/、杜赫/之属/为之/谋,/" +translation = "在这时,六国的士人,有宁越、徐尚、苏秦、杜赫等人为他们出谋划策," +keyword_note = { "之属" = "等人", "为之谋" = "为他们出谋划策" } + +["齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,"] +note = [] +content = "齐明/、周最/、陈轸/、召滑/、楼缓/、翟景/、苏厉/、乐毅/之徒/通其/意,/" +translation = "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅等人沟通他们的意见," +keyword_note = { "之徒" = "等人", "通其意" = "沟通他们的意见" } + +["吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵."] +note = [] +content = "吴起/、孙膑/、带佗/、倪良/、王廖/、田忌/、廉颇/、赵奢/之伦/制其/兵./" +translation = "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢等人统率他们的军队。" +keyword_note = { "之伦" = "等人", "制其兵" = "统率他们的军队" } + +["尝以十倍之地, 百万之众, 叩关而攻秦."] +note = [] +content = "尝以/十倍/之地/, 百万/之众/, 叩关/而攻/秦./" +translation = "他们曾经用十倍于秦的土地,上百万的军队,攻打函谷关来攻打秦国。" +keyword_note = { "尝" = "曾经", "以" = "用", "叩关" = "攻打函谷关" } + +["秦人开关延敌, 九国之师, 逡巡而不敢进."] +note = [] +content = "秦人/开关/延敌/, 九国/之师/, 逡巡/而不敢/进./" +translation = "秦人打开函谷关口迎战敌人,九国的军队有所顾虑徘徊不敢入关。" +keyword_note = { "开关" = "打开函谷关", "延敌" = "迎战敌人", "九国" = "九个国家", "逡巡" = "有所顾虑徘徊" } + +["秦无亡矢遗镞之费, 而天下诸侯已困矣."] +note = [] +content = "秦/无/亡矢/遗镞/之费/, 而/天下/诸侯/已困/矣./" +translation = "秦人没有一兵一卒的耗费,然而天下的诸侯就已窘迫不堪了。" +keyword_note = { "亡矢" = "丢失箭矢", "遗镞" = "遗失箭头", "费" = "耗费", "困" = "窘迫不堪" } + +["于是从散约败, 争割地而赂秦."] +note = [] +content = "于是/从散/约败/, 争/割地/而赂/秦./" +translation = "因此,纵约失败了,各诸侯国争着割地来贿赂秦国。" +keyword_note = { "从散" = "纵约失败", "约败" = "盟约破坏", "赂" = "贿赂" } + +["秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; "] +note = [] +content = "秦/有余力/而制/其弊/, 追亡/逐北/, 伏尸/百万/, 流血/漂橹; /" +translation = "秦有剩余的力量趁他们困乏而制服他们,追赶逃走的败兵,百万败兵横尸道路,流淌的血液可以漂浮盾牌;" +keyword_note = { "制其弊" = "趁他们困乏而制服他们", "追亡" = "追赶逃兵", "逐北" = "追逐败兵", "伏尸" = "横尸", "漂橹" = "漂浮盾牌" } + +["因利乘便, 宰割天下, 分裂山河."] +note = [] +content = "因利/乘便/, 宰割/天下/, 分裂/山河./" +translation = "秦国凭借这便利的形势,割取天下的土地,重新划分山河的区域。" +keyword_note = { "因利乘便" = "凭借便利的形势", "宰割" = "割取", "分裂" = "划分" } + +["强国请服, 弱国入朝."] +note = [] +content = "强国/请服/, 弱国/入朝./" +translation = "强国主动表示臣服,弱国入秦朝拜。" +keyword_note = { "请服" = "请求臣服", "入朝" = "入秦朝拜" } + +["延及孝文王、庄襄王, 享国之日浅, 国家无事."] +note = [] +content = "延及/孝文王/、庄襄王/, 享国/之日/浅/, 国家/无事./" +translation = "延续到孝文王、庄襄王,统治的时间不长,秦国并没有什么大事发生。" +keyword_note = { "延及" = "延续到", "享国" = "统治国家", "浅" = "时间短", "无事" = "没有大事发生" } + +["及至始皇, 奋六世之余烈, 振长策而御宇内,"] +note = [] +content = "及至/始皇/, 奋/六世/之余烈/, 振/长策/而御/宇内,/" +translation = "到始皇的时候,发展六世遗留下来的功业,以武力来统治各国," +keyword_note = { "奋" = "发展", "余烈" = "遗留下来的功业", "振长策" = "挥动长鞭", "御宇内" = "统治天下" } + +["吞二周而亡诸侯, 履至尊而制六合,"] +note = [] +content = "吞/二周/而亡/诸侯/, 履/至尊/而制/六合,/" +translation = "将东周,西周和各诸侯国统统消灭,登上皇帝的宝座来统治天下," +keyword_note = { "吞" = "吞并", "二周" = "东周和西周", "履至尊" = "登上皇位", "制六合" = "统治天下" } + +["执敲扑而鞭笞天下, 威振四海."] +note = [] +content = "执/敲扑/而鞭笞/天下/, 威振/四海./" +translation = "用严酷的刑罚来奴役天下的百姓,威风震慑四海。" +keyword_note = { "敲扑" = "刑具", "鞭笞" = "鞭打,奴役", "威振" = "威风震慑" } + +["南取百越之地, 以为桂林、象郡; "] +note = [] +content = "南取/百越/之地/, 以为/桂林/、象郡; /" +translation = "秦始皇向南攻取百越的土地,把它划为桂林郡和象郡;" +keyword_note = { "百越" = "古代南方少数民族", "以为" = "把它作为" } + +["百越之君, 俯首系颈, 委命下吏."] +note = [] +content = "百越/之君/, 俯首/系颈/, 委命/下吏./" +translation = "百越的君主低着头,颈上捆着绳子愿意服从投降,把性命交给司法官吏。" +keyword_note = { "俯首" = "低头", "系颈" = "颈上捆着绳子", "委命" = "把性命交给", "下吏" = "司法官吏" } + +["乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; "] +note = [] +content = "乃使/蒙恬/北筑/长城/而守/藩篱/, 却/匈奴/七百/余里; /" +translation = "秦始皇于是又命令蒙恬在北方修筑长城,守卫边境,使匈奴退却七百多里;" +keyword_note = { "蒙恬" = "秦朝名将", "藩篱" = "边境", "却" = "使...退却", "匈奴" = "北方少数民族" } + +["胡人不敢南下而牧马, 士不敢弯弓而报怨."] +note = [] +content = "胡人/不敢/南下/而牧马/, 士/不敢/弯弓/而报怨./" +translation = "胡人不敢向下到南边来放牧,勇士不敢拉弓射箭来报仇。" +keyword_note = { "胡人" = "指匈奴人", "牧马" = "放牧", "弯弓" = "拉弓", "报怨" = "报仇" } + +["于是废先王之道, 焚百家之言, 以愚黔首; "] +note = [] +content = "于是/废/先王/之道/, 焚/百家/之言/, 以愚/黔首; /" +translation = "秦始皇接着就废除古代帝王的治世之道,焚烧诸子百家的著作,来使百姓愚蠢;" +keyword_note = { "先王" = "古代帝王", "道" = "治世之道", "百家之言" = "诸子百家的著作", "愚" = "使...愚蠢", "黔首" = "百姓" } + +["隳名城, 杀豪杰; "] +note = [] +content = "隳/名城/, 杀/豪杰; /" +translation = "毁坏高大的城墙,杀掉英雄豪杰;" +keyword_note = { "隳" = "毁坏", "名城" = "高大的城墙" } + +["收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民."] +note = [] +content = "收/天下/之兵/, 聚之/咸阳/, 销/锋镝/, 铸以为/金人/十二/, 以弱/天下/之民./" +translation = "收缴天下的兵器,集中在咸阳,销毁兵刃和箭头,冶炼它们铸造十二个铜人,以便削弱百姓的反抗力量。" +keyword_note = { "兵" = "兵器", "销" = "销毁", "锋镝" = "兵刃和箭头", "铸以为" = "铸造成为", "金人" = "铜人", "弱" = "削弱" } + +["然后践华为城, 因河为池,"] +note = [] +content = "然后/践华/为城/, 因河/为池,/" +translation = "然后凭借华山为城墙,依据黄河为城池," +keyword_note = { "践华" = "凭借华山", "因河" = "依据黄河", "为城" = "作为城墙", "为池" = "作为护城河" } + +["据亿丈之城, 临不测之渊, 以为固."] +note = [] +content = "据/亿丈/之城/, 临/不测/之渊/, 以为/固./" +translation = "凭借着高耸的华山,往下看着深不可测的黄河,认为这是险固的地方。" +keyword_note = { "亿丈" = "形容极高", "不测" = "深不可测", "渊" = "深水", "固" = "险固" } + +["良将劲弩守要害之处, 信臣精卒陈利兵而谁何."] +note = [] +content = "良将/劲弩/守/要害/之处/, 信臣/精卒/陈/利兵/而谁何./" +translation = "好的将领手执强弩,守卫着要害的地方,可靠的官员和精锐的士卒,拿着锋利的兵器,盘问过往行人。" +keyword_note = { "劲弩" = "强弩", "要害" = "重要关键", "信臣" = "可靠的官员", "精卒" = "精锐的士卒", "陈" = "陈列,拿着", "利兵" = "锋利的兵器", "谁何" = "盘问行人" } + +["天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也."] +note = [] +content = "天下/已定/, 始皇/之心/, 自以为/关中/之固/, 金城/千里/, 子孙/帝王/万世/之业/也./" +translation = "天下已经安定,始皇心里自己认为这关中的险固地势、方圆千里的坚固的城防,是子子孙孙称帝称王直至万代的基业。" +keyword_note = { "自以为" = "自己认为", "关中" = "函谷关以西地区", "固" = "险固地势", "金城" = "坚固的城池", "帝王" = "称帝称王", "万世" = "万代" } + +["始皇既没, 余威震于殊俗."] +note = [] +content = "始皇/既没/, 余威/震于/殊俗./" +translation = "始皇去世之后,他的余威依然震慑着边远地区。" +keyword_note = { "既没" = "死后", "余威" = "剩余的威势", "震" = "震慑", "殊俗" = "不同的风俗,指边远地区" } + +["然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; "] +note = [] +content = "然/陈涉/瓮牖/绳枢/之子/, 氓隶/之人/, 而/迁徙/之徒/也; /" +translation = "可是,陈涉不过是个破瓮做窗户、草绳做户枢的贫家子弟,是氓、隶一类的人,后来做了被迁谪戍边的卒子;" +keyword_note = { "瓮牖" = "用破瓮做窗户", "绳枢" = "用草绳系户枢", "氓隶" = "平民和奴隶", "迁徙之徒" = "被征发戍边的人" } + +["才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; "] +note = [] +content = "才能/不及/中人/, 非有/仲尼/、墨翟/之贤/, 陶朱/、猗顿/之富; /" +translation = "才能不如普通人,并没有孔丘、墨翟那样的贤德,也不像陶朱、猗顿那样富有。" +keyword_note = { "中人" = "普通人", "仲尼" = "孔子", "墨翟" = "墨子", "陶朱" = "范蠡", "猗顿" = "春秋时富商" } + +["蹑足行伍之间, 而倔起阡陌之中,"] +note = [] +content = "蹑足/行伍/之间/, 而/倔起/阡陌/之中,/" +translation = "他跻身于戍卒的队伍中,从田野间突然奋起发难," +keyword_note = { "蹑足" = "置身于", "行伍" = "军队", "倔起" = "突然奋起", "阡陌" = "田野" } + +["率疲弊之卒, 将数百之众, 转而攻秦; "] +note = [] +content = "率/疲弊/之卒/, 将/数百/之众/, 转而/攻秦; /" +translation = "率领着疲惫无力的士兵,指挥着几百人的队伍,掉转头来进攻秦国;" +keyword_note = { "疲弊" = "疲惫无力", "将" = "率领" } + +["斩木为兵, 揭竿为旗,"] +note = [] +content = "斩木/为兵/, 揭竿/为旗,/" +translation = "砍下树木作武器,举起竹竿当旗帜," +keyword_note = { "斩木为兵" = "砍树木作武器", "揭竿为旗" = "举竹竿当旗帜" } + +["天下云集响应, 赢粮而景从."] +note = [] +content = "天下/云集/响应/, 赢粮/而景从./" +translation = "天下豪杰像云一样聚集,回声似的应和他,许多人都背着粮食,如影随形。" +keyword_note = { "云集" = "像云一样聚集", "响应" = "像回声一样应和", "赢粮" = "背着粮食", "景从" = "如影随形" } + +["山东豪俊遂并起而亡秦族矣."] +note = [] +content = "山东/豪俊/遂/并起/而亡/秦族/矣./" +translation = "崤山以东的英雄豪杰于是一齐起事,消灭了秦的家族。" +keyword_note = { "山东" = "崤山以东", "豪俊" = "英雄豪杰", "并起" = "一齐起事", "亡" = "消灭", "秦族" = "秦的家族" } + +["且夫天下非小弱也, 雍州之地, 崤函之固, 自若也."] +note = [] +content = "且夫/天下/非/小弱/也/, 雍州/之地/, 崤函/之固/, 自若/也./" +translation = "况且那天下并没有缩小削弱,雍州的地势,崤山和函谷关的险固,是保持原来的样子。" +keyword_note = { "且夫" = "况且", "小弱" = "变小削弱", "自若" = "保持原样" } + +["陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; "] +note = [] +content = "陈涉/之位/, 非/尊于/齐/、楚/、燕/、赵/、韩/、魏/、宋/、卫/、中山/之君/也; /" +translation = "陈涉的地位,没有比齐、楚、燕、赵、韩、魏、宋、卫、中山的国君更加尊贵;" +keyword_note = { "尊于" = "比...尊贵" } + +["锄櫌棘矜, 非铦于钩戟长铩也; "] +note = [] +content = "锄櫌/棘矜/, 非/铦于/钩戟/长铩/也; /" +translation = "锄头木棍也不比钩戟长矛更锋利;" +keyword_note = { "锄櫌" = "锄头", "棘矜" = "木棍", "铦于" = "比...锋利", "钩戟" = "带钩的戟", "长铩" = "长矛" } + +["谪戍之众, 非抗于九国之师也; "] +note = [] +content = "谪戍/之众/, 非/抗于/九国/之师/也; /" +translation = "那迁谪戍边的士兵也不能和九国部队抗衡;" +keyword_note = { "谪戍" = "被贬戍边", "抗于" = "和...抗衡", "九国" = "九个国家" } + +["深谋远虑, 行军用兵之道, 非及乡时之士也."] +note = [] +content = "深谋/远虑/, 行军/用兵/之道/, 非及/乡时/之士/也./" +translation = "深谋远虑,行军用兵的方法,也比不上先前九国的武将谋臣。" +keyword_note = { "深谋远虑" = "深谋远虑", "行军用兵" = "行军作战", "非及" = "比不上", "乡时" = "先前" } + +["然而成败异变, 功业相反, 何也?"] +note = [] +content = "然而/成败/异变/, 功业/相反/, 何也?/" +translation = "可是条件好者失败而条件差者成功,功业完全相反,为什么呢?" +keyword_note = { "成败异变" = "成功失败发生变化", "功业相反" = "功业完全相反" } + +["试使山东之国与陈涉度长絜大, 比权量力,"] +note = [] +content = "试使/山东/之国/与/陈涉/度长/絜大/, 比权/量力,/" +translation = "假使拿东方诸侯国跟陈涉比一比长短大小,量一量权势力量," +keyword_note = { "试使" = "假使", "度长絜大" = "衡量长短大小", "比权量力" = "比较权势力量" } + +["则不可同年而语矣."] +note = [] +content = "则/不可/同年/而语/矣./" +translation = "就更不能相提并论了。" +keyword_note = { "同年而语" = "相提并论" } + +["然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; "] +note = [] +content = "然/秦/以/区区/之地/, 致/万乘/之势/, 序/八州/而朝/同列/, 百有/余年/矣; /" +translation = "然而秦凭借着它的小小的地方,发展到兵车万乘的国势,管辖全国,使六国诸侯都来朝见,已经一百多年了;" +keyword_note = { "区区" = "小小", "致" = "达到", "万乘" = "兵车万乘", "序八州" = "管辖全国", "朝同列" = "使同列来朝拜", "百有余年" = "一百多年" } + +["然后以六合为家, 崤函为宫; "] +note = [] +content = "然后/以/六合/为家/, 崤函/为宫; /" +translation = "这之后把天下作为家业,用崤山、函谷关作为自己的内宫;" +keyword_note = { "六合为家" = "把天下作为家业", "崤函为宫" = "把崤山函谷关作为内宫" } + +["一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?"] +note = [] +content = "一夫/作难/而/七庙/隳/, 身死/人手/, 为/天下/笑者/, 何也?/" +translation = "陈涉一人起义国家就灭亡了,秦王子婴死在别人项羽手里,被天下人耻笑,这是为什么呢?" +keyword_note = { "一夫作难" = "一人起义", "七庙隳" = "宗庙毁灭,国家灭亡", "身死人手" = "死在别人手里", "为天下笑" = "被天下人耻笑" } + +["仁义不施而攻守之势异也."] +note = [] +content = "仁义/不施/而/攻守/之势/异也./" +translation = "就因为不施行仁政而使攻守的形势发生了变化啊。" +keyword_note = { "仁义" = "仁政", "不施" = "不施行", "攻守之势" = "进攻和防守的形势", "异" = "发生变化" } + +["锦瑟"] +note = [] +content = "锦瑟/" +translation = "锦瑟" +keyword_note = {} + +["锦瑟无端五十弦, 一弦一柱思华年."] +note = ['李商隐〔唐代〕'] +content = "锦瑟/无端/五十弦/, 一弦/一柱/思/华年./" +translation = "精美的瑟为什么有五十根弦, 一弦一柱都叫我追忆青春年华. " +keyword_note = { "锦瑟" = "装饰华美的瑟", "无端" = "犹何故, 怨怪之词", "五十弦" = "托古之词, 锦瑟本应是二十五弦", "华年" = "青春年华" } + +["庄生晓梦迷蝴蝶, 望帝春心托杜鹃."] +note = [] +content = "庄生/晓梦/迷/蝴蝶/, 望帝/春心/托/杜鹃./" +translation = "庄周在梦中化为蝴蝶翩翩起舞, 望帝把自己的幽恨托身于杜鹃. " +keyword_note = { "庄生晓梦迷蝴蝶" = "引用庄周梦蝶故事, 言人生如梦, 往事如烟", "望帝春心托杜鹃" = "引用望帝化为杜鹃的传说, 表达幽恨之情" } + +["沧海月明珠有泪, 蓝田日暖玉生烟."] +note = [] +content = "沧海/月明/珠/有泪/, 蓝田/日暖/玉/生烟./" +translation = "沧海明月高照, 鲛人泣泪成珠; 蓝田红日和暖, 可看到良玉生烟. " +keyword_note = { "珠有泪" = "引用鲛人泣泪成珠的典故", "蓝田" = "指蓝田山, 一名玉山", "玉生烟" = "良玉在日光下生出烟气" } + +["此情可待成追忆, 只是当时已惘然."] +note = [] +content = "此情/可待/成/追忆/, 只是/当时/已/惘然./" +translation = "此时此景为什么要现在才追忆, 只因为当时心中只是一片茫然. " +keyword_note = { "可待" = "岂待, 何待", "只是" = "止是、仅是, 有就是、正是之意", "惘然" = "失意的样子, 心中若有所失的样子" } + +["长亭送别"] +note = [] +content = "长亭送别/" +translation = "长亭送别" +keyword_note = {} + +["碧云天, 黄花地, 西风紧, 北雁南飞."] +note = ['正宫·端正好·长亭送别', '作者: 王实甫'] +content = "碧/云天/, 黄花/地/, 西风/紧/, 北雁/南飞./" +translation = "碧蓝的天空, 开满了菊花的大地, 西风猛烈吹, 大雁从北往南飞. " +keyword_note = { "碧云天" = "碧蓝的天空", "黄花地" = "开满了菊花的大地", "西风紧" = "西风猛烈吹", "北雁南飞" = "大雁从北往南飞" } + +["晓来谁染霜林醉? 总是离人泪."] +note = ['正宫·端正好·长亭送别', '作者: 王实甫'] +content = "晓/来/谁/染/霜林/醉? /总是/离人/泪./" +translation = "清晨, 是谁把经霜的枫林染红了? 那总是离人的眼泪. " +keyword_note = { "晓来" = "清晨", "霜林醉" = "经霜的枫林染红了", "离人泪" = "离人的眼泪" } + +["阿房宫赋"] +note = [] +content = "阿房宫赋/" +translation = "阿房宫赋" +keyword_note = {} + +["六王毕, 四海一, 蜀山兀, 阿房出."] +note = [ + '六王: 韩、赵、魏、楚、燕、齐六国的国王', + '毕: 完结, 指为秦国所灭', + '一: 统一', + '兀: 山高而上平, 形容山上树木被砍伐净尽', + '出: 出现, 意思是建成', +] +content = "六王/毕/, 四海/一/, 蜀山/兀/, 阿房/出./" +translation = "六国灭亡, 秦始皇统一了天下. 蜀山的树木被伐光了, 阿房宫才盖起来" +keyword_note = { "六王毕" = "六国灭亡", "四海一" = "天下统一", "蜀山兀" = "蜀山树木砍光", "阿房出" = "阿房宫建成" } + +["覆压三百余里, 隔离天日."] +note = [] +content = "覆压/三百/余里/, 隔离/天日./" +translation = " (从渭南到咸阳) 阿房宫占地三百多里, 楼阁高耸, 遮天蔽日" +keyword_note = { "覆压" = "覆盖, 形容宫殿楼阁接连不断", "隔离天日" = "遮蔽了天日, 形容宫殿楼阁的高大" } + +["骊山北构而西折, 直走咸阳."] +note = ['骊山: 从骊山', '北构: 向北建构', '西折: 往西转', '直走: 一直延伸到'] +content = "骊山/北构/而/西折/, 直走/咸阳./" +translation = " (它) 从骊山向北建构, 再往西转, 一直延伸到咸阳" +keyword_note = { "北构" = "向北建构", "西折" = "向西转折", "直走" = "一直通向" } + +["二川溶溶, 流入宫墙."] +note = ['二川: 指渭水和樊川', '溶溶: 河水缓流的样子'] +content = "二川/溶溶/, 流入/宫墙./" +translation = "渭水和樊水浩浩荡荡, 水波荡漾地流入阿房宫的围墙" +keyword_note = { "二川" = "渭水和樊川", "溶溶" = "水波荡漾的样子" } + +["五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角."] +note = ['廊腰: 连接高大建筑物的走廊', '缦回: 宽而曲折', '檐牙: 突起的屋檐', '钩心斗角: 宫室结构参差错落, 精巧工致'] +content = "五步/一楼/, 十步/一阁/; 廊腰/缦回/, 檐牙/高啄/; 各抱/地势/, 钩心/斗角./" +translation = "每隔五步 (有) 一栋楼, 每隔十步 (有) 一座阁. 走廊宽而曲折, (突起的)屋檐 (像鸟嘴) 向上噘起. 楼阁各依地势的高下而建, 像是互相环抱, 各种建筑物都向中心区攒集, 屋角互相对峙" +keyword_note = { "廊腰缦回" = "走廊宽而曲折", "檐牙高啄" = "屋檐像鸟嘴向上噘起", "各抱地势" = "各随地形而建", "钩心斗角" = "建筑物向中心攒集, 屋角对峙" } + +["盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落."] +note = ['盘盘: 盘旋的样子', '囷囷: 屈曲的样子', "落: 相当于'座'或者'所'"] +content = "盘盘/焉/, 囷囷/焉/, 蜂房/水涡/, 矗/不知/其/几千万/落./" +translation = "盘旋地、曲折地, 像蜂房, 像水涡, 矗立着不知有几千万座" +keyword_note = { "盘盘" = "盘旋", "囷囷" = "屈曲", "蜂房水涡" = "像蜂房像水涡", "矗" = "矗立" } + +["长桥卧波, 未云何龙?"] +note = ["未云何龙: 没有云怎么 (出现了) 龙? 《易经》有'云从龙'的话"] +content = "长桥/卧波/, 未云/何龙?/" +translation = "长桥横卧在渭水上, (人们看了要惊讶: ) 天上没有云, 怎么出现了龙? " +keyword_note = { "长桥卧波" = "长桥横卧水上", "未云何龙" = "无云何以现龙" } + +["复道行空, 不霁何虹?"] +note = ['复道: 在楼阁之间架木筑成的通道', '霁: 雨雪停止, 天放晴'] +content = "复道/行空/, 不霁/何虹?/" +translation = "在楼阁之间架木筑成的通道横空而过, 彩色斑斓, (人们看了要诧异: ) 不是雨过天晴, 哪里来的彩虹? " +keyword_note = { "复道行空" = "空中通道横空", "不霁何虹" = "未晴何来彩虹" } + +["高低冥迷, 不知西东."] +note = ['冥迷: 分辨不清'] +content = "高低/冥迷/, 不知/西东./" +translation = "楼阁随着地势高高低低, 使人迷糊, 辨不清东西方向" +keyword_note = { "高低冥迷" = "高低难辨", "不知西东" = "不辨方向" } + +["歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄."] +note = [] +content = "歌台/暖响/, 春光/融融/; 舞殿/冷袖/, 风雨/凄凄./" +translation = "人们在台上唱歌, 歌乐声响起来, 好像充满着暖意, 如同春光那样融和. 人们在殿中舞蹈, 舞袖飘拂, 好像带来寒气, 如同风雨交加那样凄冷" +keyword_note = { "歌台暖响" = "歌台暖意融融", "舞殿冷袖" = "舞殿寒气凄凄" } + +["一日之内, 一宫之间, 而气候不齐."] +note = ['气候: 指天气 (雨雪阴睛) 的意思'] +content = "一日/之内/, 一宫/之间/, 而/气候/不齐./" +translation = "一天之内, 一宫之中, 而天气竟会如此不同" +keyword_note = { "气候不齐" = "气氛冷暖不同" } + +["妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人."] +note = ['妃嫔媵嫱: 统指六国王侯的宫妃', '王子皇孙: 指六国王侯的女儿、孙女', '辇: 辇车'] +content = "妃嫔/媵嫱/, 王子/皇孙/, 辞楼/下殿/, 辇来/于秦/, 朝歌/夜弦/, 为/秦宫人./" +translation = "六国王侯的宫妃、女儿、孙女, 辞别本国的楼阁宫殿, 乘着辇车来到秦国. 早晚弹唱,成为秦王朝的宫女" +keyword_note = { "妃嫔媵嫱" = "六国宫妃", "辇来于秦" = "乘车来到秦国", "朝歌夜弦" = "早晚歌舞" } + +["明星荧荧, 开妆镜也;"] +note = ['荧荧: 明亮的样子'] +content = "明星/荧荧/, 开妆镜/也;/" +translation = " (光如) 明星闪亮, 是 (宫女们) 打开梳妆的镜子; " +keyword_note = { "明星荧荧" = "星光闪亮" } + +["绿云扰扰, 梳晓鬟也;"] +note = [] +content = "绿云/扰扰/, 梳晓鬟/也;/" +translation = "乌云缭绕, 原来是她们正在早晨梳理发髻; " +keyword_note = { "绿云扰扰" = "乌云缭绕" } + +["渭流涨腻, 弃脂水也;"] +note = ['涨腻: 涨起了 (一层) 脂膏'] +content = "渭流/涨腻/, 弃脂水/也;/" +translation = "渭水河面上浮起一层垢腻, 原来是她们泼掉的脂粉水; " +keyword_note = { "渭流涨腻" = "渭水浮腻" } + +["烟斜雾横, 焚椒兰也."] +note = ['椒兰: 两种香料植物'] +content = "烟斜/雾横/, 焚椒兰/也./" +translation = "空中烟雾弥漫, 是她们在焚烧椒兰香料" +keyword_note = { "烟斜雾横" = "烟雾弥漫" } + +["雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也."] +note = ['辘辘: 车行的声音', '杳: 无影无声, 形容声音的遥远'] +content = "雷霆/乍惊/, 宫车/过也/; 辘辘/远听/, 杳/不知/其所之/也./" +translation = "如雷霆般的声音响起使人骤然吃惊, 是皇上的宫车驰过; 听那车声渐远, 也不知驶到哪儿去了" +keyword_note = { "雷霆乍惊" = "雷霆般震响", "辘辘远听" = "车声渐远", "杳不知" = "远去无踪" } + +["一肌一容, 尽态极妍, 缦立远视, 而望幸焉."] +note = ['尽态极妍: 娇媚极了', '缦立: 久立', '幸: 皇帝驾临'] +content = "一肌/一容/, 尽态/极妍/, 缦立/远视/, 而/望幸/焉./" +translation = "任何一部分肌肤, 任何一种姿容, 都娇媚极了, 耐心地久立远视, 盼望皇帝能亲自驾临" +keyword_note = { "一肌一容" = "肌肤姿容", "尽态极妍" = "娇媚至极", "缦立远视" = "久立远望", "望幸" = "盼望宠幸" } + +["有不得见者, 三十六年."] +note = ['三十六年: 秦始皇在位共三十六年'] +content = "有/不得/见者/, 三十/六年./" +translation = "可是有许多宫女整整等了三十六年, 还未见到皇帝" +keyword_note = { "不得见" = "未能见到", "三十六年" = "长达三十六年" } + +["鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜."] +note = ['鼎铛玉石: 把宝鼎看作铁锅, 把美玉看作石头', '金块珠砾: 把黄金看作土块, 把珍珠看作石子', '逦迤: 连续不断, 到处都是'] +content = "鼎铛/玉石/, 金块/珠砾/, 弃掷/逦迤/, 秦人/视之/, 亦不/甚惜./" +translation = "把宝鼎当作铁锅, 把美玉当作石头, 把黄金当作土块, 把珍珠当作沙石, 随意丢弃, 秦人看见了也不觉得可惜" +keyword_note = { "鼎铛玉石" = "视鼎如铛视玉如石", "金块珠砾" = "视金如土视珠如砾", "弃掷逦迤" = "随意丢弃", "不甚惜" = "不很珍惜" } + +["使负栋之柱, 多于南亩之农夫;"] +note = ['负栋之柱: 承担栋梁的柱子'] +content = "使/负栋/之柱/, 多于/南亩/之农夫;/" +translation = "让那 (阿房宫中) 负载大梁的柱子, 比田里的农夫还多; " +keyword_note = { "负栋之柱" = "承重柱子" } + +["架梁之椽, 多于机上之工女;"] +note = [] +content = "架梁/之椽/, 多于/机上/之工女;/" +translation = "架起侧梁的椽子, 比织布机上的女工还多; " +keyword_note = { "架梁之椽" = "屋梁椽子" } + +["钉头磷磷, 多于在庾之粟粒;"] +note = ['磷磷: 水中石头突立的样子, 形容突出的钉头', '庾: 露天的谷仓'] +content = "钉头/磷磷/, 多于/在庾/之粟粒;/" +translation = "显眼的钉子, 比谷仓里的稻米还多; " +keyword_note = { "钉头磷磷" = "突出钉头" } + +["瓦缝参差, 多于周身之帛缕;"] +note = [] +content = "瓦缝/参差/, 多于/周身/之帛缕;/" +translation = "横直密布的屋瓦, 比 (老百姓) 身上的衣服上的线还要多; " +keyword_note = { "瓦缝参差" = "参差瓦缝" } + +["直栏横槛, 多于九土之城郭;"] +note = ['九土: 九州'] +content = "直栏/横槛/, 多于/九土/之城郭;/" +translation = "纵横的栏杆, 比天下的城郭还多; " +keyword_note = { "直栏横槛" = "纵横栏杆" } + +["管弦呕哑, 多于市人之言语."] +note = [] +content = "管弦/呕哑/, 多于/市人/之言语./" +translation = "乐器的演奏声, 比闹市的人说话声还多" +keyword_note = { "管弦呕哑" = "乐器声响" } + +["使天下之人, 不敢言而敢怒."] +note = [] +content = "使/天下/之人/, 不敢/言/而/敢怒./" +translation = "使天下的老百姓敢怒但是不敢言" +keyword_note = { "不敢言" = "不敢说话", "敢怒" = "心中愤怒" } + +["独夫之心, 日益骄固."] +note = ['独夫: 失去人心而极端孤立的统治者, 指秦始皇', '骄固: 骄横顽固'] +content = "独夫/之心/, 日益/骄固./" +translation = "秦始皇却越来越骄横顽固" +keyword_note = { "独夫" = "孤家寡人", "日益骄固" = "越来越骄横顽固" } + +["戍卒叫, 函谷举, 楚人一炬, 可怜焦土!"] +note = ['戍卒叫: 指陈胜、吴广起义', '函谷举: 函谷关被攻占', '楚人一炬: 项羽焚烧秦宫'] +content = "戍卒/叫/, 函谷/举/, 楚人/一炬/, 可怜/焦土!/" +translation = "陈胜、吴广揭竿而起, 四方响应, 函谷关被攻破, 项羽放了一把火, 可惜阿房宫变成了一片焦土" +keyword_note = { "戍卒叫" = "戍卒起义", "函谷举" = "函谷被占", "楚人一炬" = "项羽焚宫", "可怜焦土" = "可惜化为焦土" } + +["灭六国者六国也, 非秦也; 族秦者秦也, 非天下也."] +note = ['族: 灭族'] +content = "灭/六国者/六国/也/, 非/秦也/; 族/秦者/秦也/, 非/天下也./" +translation = "使六国灭亡的是六国自己, 而不是秦国; 使秦国灭亡的是秦国自己, 而不是天下百姓" +keyword_note = { "灭六国" = "六国自灭", "族秦" = "秦国自灭" } + +["嗟乎! 使六国各爱其人, 则足以拒秦;"] +note = [] +content = "嗟乎/! 使/六国/各爱/其人/, 则/足以/拒秦;/" +translation = "唉! 如果六国统治者都能爱护本国老百姓, 那么就有足够的力量抗拒秦国. " +keyword_note = { "各爱其人" = "爱护百姓", "足以拒秦" = "能够抗秦" } + +["使秦复爱六国之人, 则递三世可至万世而为君,"] +note = ['递: 传递, 指王位顺着次序传下去', '万世: 传之无穷'] +content = "使/秦/复爱/六国/之人/, 则/递三世/可至/万世/而为君,/" +translation = "如果秦国统治者同样能爱护六国的人民, 那么秦就能从三世传下去, 甚至可以传到万世都为君王, " +keyword_note = { "复爱六国" = "爱护六国人民", "递三世" = "传位三代" } + +["谁得而族灭也?"] +note = [] +content = "谁得/而族灭/也?/" +translation = "谁能够灭掉秦国呢? " +keyword_note = { "族灭" = "灭族" } + +["秦人不暇自哀, 而后人哀之;"] +note = ['不暇: 来不及'] +content = "秦人/不暇/自哀/, 而后人/哀之;/" +translation = "秦人来不及为自己的灭亡哀叹, 只好让后世的人为他们哀叹; " +keyword_note = { "不暇自哀" = "来不及自哀", "后人哀之" = "后人为之哀叹" } + +["后人哀之而不鉴之, 亦使后人而复哀后人也."] +note = ['鉴: 引以为鉴'] +content = "后人/哀之/而/不鉴之/, 亦使/后人/而/复哀/后人/也./" +translation = "后世的人如果只是哀叹而不引以为鉴, 那么又要再让后世的人为后世哀叹了" +keyword_note = { "不鉴之" = "不引以为鉴", "复哀后人" = "再让后人哀叹" } + +["陈情表"] +note = [] +content = "陈情表/" +translation = "陈情表" +keyword_note = {} + +["臣密言: 臣以险衅, 夙遭闵凶."] +note = [] +content = "臣/密/言: /臣/以/险衅/, 夙/遭/闵凶./" +translation = "臣子李密陈言: 我因命运不好, 小时候遭遇到了不幸" +keyword_note = { "险衅" = "凶险祸患 (这里指命运不好) ", "夙" = "早时, 这里指年幼的时候", "闵" = "通'悯', 指可忧患的事", "凶" = "不幸, 指丧父" } + +["生孩六月, 慈父见背; 行年四岁, 舅夺母志."] +note = [] +content = "生孩/六月/, 慈父/见背; /行年/四岁/, 舅/夺/母志./" +translation = "刚出生六个月, 我慈爱的父亲就不幸去世了. 经过了四年, 舅父逼母亲改嫁" +keyword_note = { "见背" = "死的委婉说法", "行年" = "经历的年岁", "母志" = "母亲守节之志 (改嫁的委婉说法) " } + +["祖母刘愍臣孤弱, 躬亲抚养."] +note = [] +content = "祖母/刘/愍/臣/孤弱/, 躬亲/抚养./" +translation = "我的祖母刘氏, 怜悯我从小丧父, 便亲自对我加以抚养" +keyword_note = { "愍" = "怜悯", "躬亲" = "亲身" } + +["臣少多疾病, 九岁不行, 零丁孤苦, 至于成立."] +note = [] +content = "臣/少/多/疾病/, 九岁/不行/, 零丁/孤苦/, 至于/成立./" +translation = "臣小的时候经常生病, 九岁时还不会行走. 孤独无靠, 一直到成人自立" +keyword_note = { "成立" = "成人自立" } + +["既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息."] +note = [] +content = "既/无/伯叔/, 终/鲜/兄弟/, 门/衰/祚/薄/, 晚/有/儿息./" +translation = "既没有叔叔伯伯, 又没什么兄弟, 门庭衰微而福分浅薄, 很晚才有儿子" +keyword_note = { "鲜" = "少, 这里指'无'", "祚薄" = "福分浅薄", "儿息" = "亲生子女" } + +["外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊."] +note = [] +content = "外/无/期功/强近/之亲/, 内/无/应门/五尺/之僮/, 茕茕/孑立/, 形影/相吊./" +translation = "在外面没有比较亲近的亲戚, 在家里又没有照应门户的童仆. 生活孤单没有依靠, 每天只有自己的身体和影子相互安慰" +keyword_note = { "期功" = "指关系较近的亲属", "茕茕孑立" = "孤单无依靠的样子", "吊" = "安慰" } + +["而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离."] +note = [] +content = "而/刘/夙/婴/疾病/, 常/在/床蓐/, 臣/侍/汤药/, 未曾/废离./" +translation = "但祖母又早被疾病缠绕, 常年卧床不起, 我侍奉她吃饭喝药, 从来就没有停止侍奉而离开她" +keyword_note = { "婴" = "被...缠绕", "蓐" = "通'褥', 床垫", "废" = "停止服侍", "离" = "离开" } + +["逮奉圣朝, 沐浴清化."] +note = [] +content = "逮/奉/圣朝/, 沐浴/清化./" +translation = "到了晋朝建立, 我蒙受着清明的政治教化" +keyword_note = { "逮" = "及, 到", "奉" = "承奉", "圣朝" = "指当时的晋朝", "沐浴清化" = "蒙受清平教化" } + +["前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才."] +note = [] +content = "前/太守/臣/逵/察/臣/孝廉; /后/刺史/臣/荣/举/臣/秀才./" +translation = "前任太守逵, 考察后推举臣下为孝廉, 后任刺史荣又推举臣下为优秀人才" +keyword_note = { "察" = "考察和推举", "孝廉" = "孝顺, 品性纯洁", "举" = "推举", "秀才" = "优秀人才" } + +["臣以供养无主, 辞不赴命."] +note = [] +content = "臣/以/供养/无主/, 辞/不赴命./" +translation = "臣下因为供奉赡养祖母的事无人承担, 辞谢不接受任命" +keyword_note = { "无主" = "无人承担" } + +["诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马."] +note = [] +content = "诏书/特下/, 拜/臣/郎中/, 寻/蒙/国恩/, 除/臣/洗马./" +translation = "朝廷又特地下了诏书, 任命我为郎中, 不久又蒙受国家恩命, 任命我为太子洗马" +keyword_note = { "拜" = "授予官职", "郎中" = "尚书省的属官", "寻" = "不久", "除" = "拜官受职", "洗马" = "太子的属官" } + +["猥以微贱, 当侍东宫, 非臣陨首所能上报."] +note = [] +content = "猥/以/微贱/, 当/侍/东宫/, 非/臣/陨首/所能/上报./" +translation = "像我这样出身微贱地位卑下的人, 担当侍奉太子的职务, 这实在不是我杀身捐躯所能报答朝廷的" +keyword_note = { "猥" = "谦词", "微贱" = "卑微低贱", "东宫" = "太子居处", "陨首" = "杀身" } + +["臣具以表闻, 辞不就职."] +note = [] +content = "臣/具/以表/闻/, 辞/不就职./" +translation = "我将以上苦衷上表报告, 加以推辞不去就职" +keyword_note = { "具" = "详细", "闻" = "使...知道" } + +["诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火."] +note = [] +content = "诏书/切峻/, 责/臣/逋慢; /郡县/逼迫/, 催/臣/上道; /州司/临门/, 急于/星火./" +translation = "但是诏书急切严峻, 责备我逃避命令, 有意拖延, 态度傲慢. 郡县长官催促我立刻上路; 州官登门督促, 比流星坠落还要急迫" +keyword_note = { "切峻" = "急切而严厉", "逋慢" = "逃避怠慢", "星火" = "流星的光, 喻急迫" } + +["臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许."] +note = [] +content = "臣/欲/奉诏/奔驰/, 则/刘/病/日笃/, 欲/苟/顺/私情/, 则/告诉/不许./" +translation = "我很想遵从皇上的旨意赴京就职, 但祖母刘氏的病却一天比一天重; 想要姑且顺从自己的私情, 但报告申诉不被允许" +keyword_note = { "日笃" = "病情日益加重", "苟" = "姑且", "告诉" = "报告申诉" } + +["臣之进退, 实为狼狈."] +note = [] +content = "臣/之/进退/, 实为/狼狈./" +translation = "我是进退两难, 十分狼狈" +keyword_note = { "狼狈" = "进退两难的样子" } + +["伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚."] +note = [] +content = "伏惟/圣朝/以/孝/治/天下/, 凡/在/故老/, 犹/蒙/矜育/, 况/臣/孤苦/, 特为/尤甚./" +translation = "我俯伏思量晋朝是用孝道来治理天下的, 凡是年老而德高的旧臣, 尚且还受到怜悯养育, 何况我的孤苦程度更为严重呢" +keyword_note = { "伏惟" = "下对上的敬辞", "故老" = "年老德高的旧臣", "矜育" = "怜悯养育" } + +["且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节."] +note = [] +content = "且/臣/少/仕/伪朝/, 历职/郎署/, 本图/宦达/, 不矜/名节./" +translation = "况且我年轻的时候曾经做过蜀汉的官, 担任过郎官职务, 本来就希望做官显达, 并不顾惜名声节操" +keyword_note = { "伪朝" = "对前朝的蔑称", "历职" = "连续任职", "郎署" = "尚书郎的官衙", "宦达" = "官场上显达" } + +["今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!"] +note = [] +content = "今/臣/亡国/贱俘/, 至微/至陋/, 过/蒙/拔擢/, 宠命/优渥/, 岂敢/盘桓/, 有所/希冀!/" +translation = "现在我是一个低贱的亡国俘虏, 十分卑微浅陋, 受到过分提拔, 恩宠优厚, 怎敢犹豫不决而有非分的企求呢" +keyword_note = { "拔擢" = "提拔", "优渥" = "优厚", "盘桓" = "徘徊不前", "希冀" = "非分的企求" } + +["但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕."] +note = [] +content = "但/以/刘/日薄/西山/, 气息/奄奄/, 人命/危浅/, 朝不/虑夕./" +translation = "只是因为祖母刘氏寿命即将终了, 气息微弱, 生命垂危, 早上不能想到晚上怎样" +keyword_note = { "日薄西山" = "太阳接近西山, 喻人寿命将终", "危浅" = "生命垂危" } + +["臣无祖母, 无以至今日, 祖母无臣, 无以终余年."] +note = [] +content = "臣/无/祖母/, 无以/至今日/, 祖母/无/臣/, 无以/终余年./" +translation = "臣下我如果没有祖母, 就没有今天的样子; 祖母如果没有我的照料, 也无法度过她的余生" +keyword_note = { "终余年" = "度过余生" } + +["母孙二人, 更相为命, 是以区区不能废远."] +note = [] +content = "母孙/二人/, 更相/为命/, 是以/区区/不能/废远./" +translation = "我们祖孙二人, 互相依靠而维持生命, 因此我的内心不愿废止奉养, 远离祖母" +keyword_note = { "更相" = "相互", "区区" = "自己的私情", "废远" = "废止奉养而远离" } + +["臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短."] +note = [] +content = "臣/密/今年/四十/有四/, 祖母/今年/九十/有六/, 是/臣/尽节/于/陛下/之日/长/, 报养/刘/之日/短./" +translation = "臣下我现在的年龄四十四岁了, 祖母现在的年龄九十六岁了, 臣下我在陛下面前尽忠尽节的日子还长着呢, 而在祖母刘氏面前尽孝尽心的日子已经不多了" +keyword_note = { "有" = "又", "尽节" = "尽忠节" } + +["乌鸟私情, 愿乞终养."] +note = [] +content = "乌鸟/私情/, 愿/乞/终养./" +translation = "我怀着乌鸦反哺的私情, 乞求能够准许我完成对祖母养老送终的心愿" +keyword_note = { "乌鸟私情" = "乌鸦反哺之情, 喻孝心", "终养" = "养老至终" } + +["臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴."] +note = [] +content = "臣/之/辛苦/, 非独/蜀之/人士/及/二州/牧伯/所见/明知/, 皇天/后土/, 实所/共鉴./" +translation = "我的辛酸苦楚, 并不仅仅被蜀地的百姓及益州、梁州的长官所亲眼目睹、内心明白, 连天地神明也都看得清清楚楚" +keyword_note = { "辛苦" = "辛酸苦楚", "牧伯" = "州郡长官", "皇天后土" = "天地神明", "鉴" = "明察" } + +["愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年."] +note = [] +content = "愿/陛下/矜悯/愚诚/, 听/臣/微志/, 庶/刘/侥幸/, 保/卒/余年./" +translation = "希望陛下能怜悯我愚昧诚心, 请允许我完成臣下一点小小的心愿, 使祖母刘氏能够侥幸地保全她的余生" +keyword_note = { "矜悯" = "怜悯", "听" = "准许", "庶" = "或许 (表希望) ", "卒余年" = "终老" } + +["臣生当陨首, 死当结草."] +note = [] +content = "臣/生/当/陨首/, 死/当/结草./" +translation = "我活着应当杀身报效朝廷, 死了也要结草衔环来报答陛下的恩情" +keyword_note = { "陨首" = "掉脑袋, 指献出生命", "结草" = "死后报恩的典故" } + +["臣不胜犬马怖惧之情, 谨拜表以闻."] +note = [] +content = "臣/不胜/犬马/怖惧/之情/, 谨/拜表/以闻./" +translation = "臣下我怀着牛马一样不胜恐惧的心情, 恭敬地呈上此表来使陛下知道这件事" +keyword_note = { "不胜" = "禁不住", "犬马怖惧" = "臣子谦卑的自比", "闻" = "使...知道" } + +["青玉案·元夕"] +note = [] +content = "青玉案·元夕/" +translation = "青玉案·元夕" +keyword_note = {} + +["东风夜放花千树, 更吹落、星如雨"] +note = ['描写元宵夜灯火辉煌的景象, 用夸张手法表现花灯之多如千树花开'] +content = "东风/夜放/花千树/, 更/吹落/、星/如雨/" +translation = "东风吹开了元宵夜的火树银花, 花灯灿烂, 就像千树花开" +keyword_note = { "花千树" = "花灯之多如千树开花", "星如雨" = "焰火纷纷, 乱落如雨" } + +["宝马雕车香满路"] +note = ['描绘元宵节繁华街道上豪华马车往来不绝的盛况'] +content = "宝马/雕车/香/满路/" +translation = "豪华的马车在飘香的街道行过" +keyword_note = { "宝马雕车" = "豪华的马车", "香满路" = "香气弥漫整条街道" } + +["凤箫声动, 玉壶光转, 一夜鱼龙舞"] +note = ['描写元宵夜音乐悠扬、月光流转、灯舞不停的欢乐场景'] +content = "凤箫/声动/, 玉壶/光转/, 一夜/鱼龙/舞/" +translation = "悠扬的凤箫声四处回荡, 玉壶般的明月渐渐转向西边, 一夜舞动鱼灯、龙灯不停歇" +keyword_note = { "凤箫" = "箫的美称", "玉壶" = "比喻明月, 亦可指灯", "鱼龙舞" = "舞动鱼形、龙形的彩灯" } + +["蛾儿雪柳黄金缕, 笑语盈盈暗香去"] +note = ['描写元宵节妇女们盛装出游、笑语盈盈的热闹场面'] +content = "蛾儿/雪柳/黄金缕/, 笑语/盈盈/暗香/去/" +translation = "美人头上都戴着华丽的饰物, 笑语盈盈地随人群走过, 只有衣香犹在暗中飘散" +keyword_note = { "蛾儿" = "古代妇女元宵节的头饰", "雪柳" = "古代妇女元宵节的饰物", "黄金缕" = "头饰上的金丝绦", "盈盈" = "仪态娇美的样子", "暗香" = "女性身上散发出来的香气" } + +["众里寻他千百度"] +note = ['表达在人群中反复寻找意中人的执着心情'] +content = "众里/寻他/千百度/" +translation = "我在人群中寻找她千百回" +keyword_note = { "千百度" = "千百遍, 形容次数极多" } + +["蓦然回首, 那人却在, 灯火阑珊处"] +note = ['最后发现意中人却在冷清之处, 意境深远, 成为千古名句'] +content = "蓦然/回首/, 那人/却在/, 灯火/阑珊/处/" +translation = "猛然回头, 不经意间却在灯火将尽未尽之处发现了她" +keyword_note = { "蓦然" = "突然, 猛然", "阑珊" = "暗淡、零落, 指灯火稀疏的地方" } + +["静女"] +note = [] +content = "静女/" +translation = "静女" +keyword_note = {} + +["静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰."] +note = ['诗经·国风·邶风〔先秦〕'] +content = "静女/其姝/, 俟我/于城隅./ 爱而/不见/, 搔首/踟蹰./" +translation = "娴静的姑娘真美丽, 约我等在城上角楼处. 故意躲藏让我找, 急得我搔头徘徊心紧张. " +keyword_note = { "静女" = "贞静娴雅之女", "姝" = "美丽, 漂亮", "俟" = "等待", "城隅" = "城角隐蔽处", "爱" = "同'薆', 隐藏", "见" = "同'现', 出现", "搔首踟蹰" = "以手指挠头, 徘徊不进" } + +["静女其娈, 贻我彤管. 彤管有炜, 说怿女美."] +note = [] +content = "静女/其娈/, 贻我/彤管./ 彤管/有炜/, 说怿/女美./" +translation = "娴静的姑娘容颜好, 送我一枝彤管. 彤管有光彩, 爱它颜色真鲜艳. " +keyword_note = { "娈" = "面目姣好", "贻" = "赠", "彤管" = "红管的笔或红色管状草", "炜" = "色红而光亮", "说怿" = "说同'悦', 怿为喜悦", "女" = "同'汝', 你, 指彤管" } + +["自牧归荑, 洵美且异. 匪女之为美, 美人之贻."] +note = [] +content = "自牧/归荑/, 洵美/且异./ 匪女/之为美/, 美人/之贻./" +translation = "郊野采荑赠送给我, 荑草确实美好又珍异. 不是荑草长得美, 是美人相赠的情意异常深厚. " +keyword_note = { "牧" = "城邑的远郊", "归" = "同'馈', 赠送", "荑" = "初生的白茅草, 象征婚媾", "洵" = "确实", "异" = "特殊", "匪" = "同'非', 不是", "女" = "通'汝', 指荑" } + +["项脊轩志"] +note = [] +content = "项脊轩志/" +translation = "项脊轩志" +keyword_note = {} + +["项脊轩, 旧南阁子也."] +note = ['项脊轩: 归有光家的书斋名. 轩: 小的房室./'] +content = "项脊轩/, 旧/南阁子/也./" +translation = "项脊轩, 是原来的南阁子" +keyword_note = { "项脊轩" = "书斋名", "旧" = "旧日的, 原来的" } + +["室仅方丈, 可容一人居."] +note = ['方丈: 一丈见方./'] +content = "室/仅/方丈/, 可容/一人/居./" +translation = "室内面积只有一丈见方, 可以容纳一个人居住" +keyword_note = { "方丈" = "一丈见方", "容" = "容纳" } + +["百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者."] +note = [] +content = "百年/老屋/, 尘泥/渗漉/, 雨泽/下注; /每/移案/, 顾视/无可/置者./" +translation = "这座百年老屋, (屋顶墙上的) 泥土从上边漏下来, 雨水也一直往下流; 我每次动书桌, 环视四周都没有可以安置桌案的地方" +keyword_note = { "渗漉" = "漏下", "雨泽" = "雨水", "顾视" = "环视四周", "置" = "安置" } + +["又北向, 不能得日, 日过午已昏."] +note = [] +content = "又/北向/, 不能/得日/, 日/过午/已昏./" +translation = "又屋子方位朝北, 不能被阳光照到, 一过了中午 (屋内) 就已昏暗" +keyword_note = { "北向" = "朝北", "得日" = "照到阳光", "昏" = "昏暗" } + +["余稍为修葺, 使不上漏."] +note = [] +content = "余/稍为/修葺/, 使/不上漏./" +translation = "我稍稍修理了一下, 使它不从上面漏土漏雨" +keyword_note = { "修葺" = "修缮、修理", "上漏" = "从上面漏" } + +["前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然."] +note = [] +content = "前/辟/四窗/, 垣墙/周庭/, 以/当/南日/, 日影/反照/, 室/始/洞然./" +translation = "向前开了四扇窗子, 用矮墙在庭院周围环绕, 用来挡住南面射来的日光, 日光反射照耀, 室内才明亮起来" +keyword_note = { "辟" = "开", "垣墙" = "砌上围墙", "当" = "挡住", "洞然" = "明亮的样子" } + +["又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜."] +note = [] +content = "又/杂植/兰桂竹木/于庭/, 旧时/栏楯/, 亦遂/增胜./" +translation = "又在庭院里随意地种上兰花、桂树、竹子等草木, 往日的栏杆, 也增加了新的光彩" +keyword_note = { "杂植" = "交错种植", "栏楯" = "栏杆", "增胜" = "增添了光彩" } + +["借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去."] +note = [] +content = "借书/满架/, 偃仰/啸歌/, 冥然/兀坐/, 万籁/有声; /而/庭阶/寂寂/, 小鸟/时来/啄食/, 人至/不去./" +translation = "书摆满了书架, 我仰头高声吟诵诗歌, 有时又静静地独自端坐, 听自然界各种各样的声音; 庭院、台阶前静悄悄的, 小鸟不时飞下来啄食, 人走到它跟前也不离开" +keyword_note = { "偃仰" = "俯仰, 指生活悠然自得", "啸歌" = "吟咏", "冥然" = "静静地", "兀坐" = "端坐", "万籁" = "自然界的一切声音" } + +["三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱."] +note = [] +content = "三五/之夜/, 明月/半墙/, 桂影/斑驳/, 风移/影动/, 珊珊/可爱./" +translation = "农历十五的夜晚, 明月高悬, 照亮半截墙壁, 桂树的影子交杂错落, 微风吹过影子摇动, 可爱极了" +keyword_note = { "三五" = "农历十五", "斑驳" = "交杂错落", "珊珊" = "美好的样子" } + +["然余居于此, 多可喜, 亦多可悲."] +note = [] +content = "然/余/居/于此/, 多/可喜/, 亦/多/可悲./" +translation = "然而我住在这里, 有许多值得高兴的事, 也有许多悲伤的事" +keyword_note = { "然" = "然而", "可喜" = "值得高兴", "可悲" = "悲伤" } + +["先是庭中通南北为一."] +note = [] +content = "先是/庭中/通南北/为一./" +translation = "在这以前, 庭院南北相通成为一体" +keyword_note = { "先是" = "在这以前", "为一" = "成为一体" } + +["迨诸父异爨, 内外多置小门墙, 往往而是."] +note = [] +content = "迨/诸父/异爨/, 内外/多置/小门墙/, 往往/而是./" +translation = "等到伯父、叔父们分了家, 室内外设置了许多小门, 墙壁到处都是" +keyword_note = { "迨" = "等到", "诸父" = "伯父、叔父", "异爨" = "分灶做饭, 指分家", "往往" = "到处" } + +["东犬西吠, 客逾庖而宴, 鸡栖于厅."] +note = [] +content = "东犬/西吠/, 客/逾庖/而宴/, 鸡/栖于/厅./" +translation = "分家后, 狗把原住同一庭院的人当作陌生人, 客人得越过厨房去吃饭, 鸡在厅堂里栖息" +keyword_note = { "西吠" = "对着西边叫", "逾庖" = "越过厨房", "栖" = "栖息" } + +["庭中始为篱, 已为墙, 凡再变矣."] +note = [] +content = "庭中/始为/篱/, 已为/墙/, 凡/再变/矣./" +translation = "庭院中开始是篱笆隔开, 然后又砌成了墙, 一共变了两次" +keyword_note = { "始" = "开始", "已" = "然后", "凡" = "总共", "再" = "两次" } + +["家有老妪, 尝居于此."] +note = [] +content = "家有/老妪/, 尝/居/于此./" +translation = "家中有个老婆婆, 曾经在这里居住过" +keyword_note = { "老妪" = "老婆婆", "尝" = "曾经" } + +["妪, 先大母婢也, 乳二世, 先妣抚之甚厚."] +note = [] +content = "妪/, 先大母/婢也/, 乳/二世/, 先妣/抚之/甚厚./" +translation = "这个老婆婆, 是我已经去世的祖母的婢女, 给两代人喂过奶, 先母对她很好" +keyword_note = { "先大母" = "去世的祖母", "乳" = "喂养", "先妣" = "去世的母亲", "抚" = "对待" } + +["室西连于中闺, 先妣尝一至."] +note = [] +content = "室西/连于/中闺/, 先妣/尝/一至./" +translation = "房子的西边和内室相连, 去世的母亲曾经来过这里" +keyword_note = { "中闺" = "内室", "一至" = "来过一次" } + +["余自束发读书轩中, 一日, 大母过余曰:"] +note = [] +content = "余/自/束发/读书/轩中/, 一日/, 大母/过余/曰/:/" +translation = "我从十五岁起就在轩内读书, 有一天, 祖母来看我, 说" +keyword_note = { "束发" = "古代男孩成童时束发为髻, 指15岁", "过" = "探望" } + +["吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?"] +note = [] +content = "吾儿/, 久/不见/若影/, 何/竟日/默默/在此/, 大类/女郎/也?/" +translation = "'我的孩子, 好久没有见到你的身影了, 为什么整天默默地呆在这里, 像个女孩子一样呀? '" +keyword_note = { "若" = "你", "竟日" = "整天", "大类" = "很像" } + +["比去, 以手阖门, 自语曰:"] +note = [] +content = "比去/, 以手/阖门/, 自语/曰/:/" +translation = "等到离开时, 用手关上门, 自言自语地说" +keyword_note = { "比去" = "等到离开", "阖门" = "关门" } + +["吾家读书久不效, 儿之成, 则可待乎!"] +note = [] +content = "吾家/读书/久不效/, 儿之/成/, 则/可待/乎!/" +translation = "'我家祖祖辈辈都读书, 长期以来却没有成就功名, 这孩子取得成就, 指日可待了! '" +keyword_note = { "不效" = "没有效果, 指没考取功名", "成" = "成就", "可待" = "指日可待" } + +["顷之, 持一象笏至, 曰:"] +note = [] +content = "顷之/, 持/一象笏/至/, 曰/:/" +translation = "不一会, 拿着一个象笏过来, 说" +keyword_note = { "顷之" = "一会儿", "象笏" = "象牙制的手板, 古代官员上朝所用" } + +["此吾祖太常公宣德间执此以朝, 他日汝当用之!"] +note = [] +content = "此/吾祖/太常公/宣德间/执此/以朝/, 他日/汝/当/用之!/" +translation = "'这是我的祖父太常公宣德年间拿着去朝见皇帝用的, 以后你一定会用到它! '" +keyword_note = { "太常公" = "指祖母的祖父太常寺卿", "朝" = "上朝", "当" = "应当" } + +["瞻顾遗迹, 如在昨日, 令人长号不自禁."] +note = [] +content = "瞻顾/遗迹/, 如/在/昨日/, 令人/长号/不自禁./" +translation = "瞻仰回顾旧日事物, 就像发生在昨天一样, 让人忍不住放声大哭" +keyword_note = { "瞻顾" = "瞻仰回顾", "长号" = "放声大哭", "不自禁" = "不能自制" } + +["余扃牖而居, 久之, 能以足音辨人."] +note = [] +content = "余/扃牖/而居/, 久之/, 能/以/足音/辨人./" +translation = "我关着窗子住在里面, 时间长了, 能够根据脚步声辨别是谁" +keyword_note = { "扃牖" = "关窗", "足音" = "脚步声" } + +["轩凡四遭火, 得不焚, 殆有神护者."] +note = [] +content = "轩/凡/四遭/火/, 得/不焚/, 殆/有/神护/者./" +translation = "项脊轩一共遭过四次火灾, 能够不被焚毁, 大概是有神灵在保护着吧" +keyword_note = { "凡" = "总共", "得不焚" = "能够不被焚毁", "殆" = "大概" } + +["余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书."] +note = [] +content = "余/既为/此志/, 后/五年/, 吾妻/来归/, 时/至/轩中/, 从余/问/古事/, 或/凭几/学书./" +translation = "我作了这篇文章之后, 过了五年, 我的妻子嫁到我家来, 她时常来到轩中, 向我问一些旧时的事情, 有时伏在桌旁学写字" +keyword_note = { "来归" = "嫁到我家来", "凭几" = "伏在几案上", "学书" = "学写字" } + +["吾妻归宁, 述诸小妹语曰:"] +note = [] +content = "吾妻/归宁/, 述/诸小妹/语/曰/:/" +translation = "我妻子回娘家探亲, 回来转述她的小妹妹们的话说" +keyword_note = { "归宁" = "出嫁的女儿回娘家省亲", "述" = "转述" } + +["闻姊家有阁子, 且何谓阁子也?"] +note = [] +content = "闻/姊家/有/阁子/, 且/何谓/阁子/也?/" +translation = "'听说姐姐家有个小阁楼, 那么, 什么叫小阁楼呢? '" +keyword_note = { "闻" = "听说", "何谓" = "什么叫" } + +["其后六年, 吾妻死, 室坏不修."] +note = [] +content = "其后/六年/, 吾妻/死/, 室坏/不修./" +translation = "这以后六年, 我的妻子去世, 项脊轩破败没有整修" +keyword_note = { "其后" = "这以后", "室坏" = "房屋破败" } + +["庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣."] +note = [] +content = "庭有/枇杷树/, 吾妻/死之/年/所/手植/也/, 今/已/亭亭/如盖/矣./" +translation = "庭院中有一株枇杷树, 是我妻子去世那年她亲手种的, 如今已经高高挺立着, 枝叶繁茂像伞一样了" +keyword_note = { "手植" = "亲手种植", "亭亭" = "高高挺立的样子", "如盖" = "像伞盖一样" } + +["鹊桥仙"] +note = [] +content = "鹊桥仙/" +translation = "鹊桥仙" +keyword_note = {} + +["纤云弄巧, 飞星传恨, 银汉迢迢暗度."] +note = [] +content = "纤云/弄巧/, 飞星/传恨/, 银汉/迢迢/暗度./" +translation = "轻盈的彩云在天空中幻化成各种巧妙的花样, 天上的流星传递着相思的愁怨, 遥远无垠的天河今夜我悄悄渡过" +keyword_note = { "纤云" = "轻盈的云彩", "弄巧" = "指云彩在空中幻化成各种巧妙的花样", "飞星" = "流星, 一说指牵牛、织女二星", "银汉" = "银河, 天河", "迢迢" = "遥远的样子", "暗度" = "悄悄渡过" } + +["金风玉露一相逢, 便胜却人间无数."] +note = [] +content = "金风/玉露/一相逢/, 便/胜却/人间/无数./" +translation = "在秋风白露的七夕相会, 就胜过尘世间那些长相厮守却貌合神离的夫妻" +keyword_note = { "金风玉露" = "指秋风白露", "胜却" = "胜过" } + +["柔情似水, 佳期如梦, 忍顾鹊桥归路."] +note = [] +content = "柔情/似水/, 佳期/如梦/, 忍顾/鹊桥/归路./" +translation = "缱绻的柔情像流水般绵绵不断, 重逢的约会如梦影般缥缈虚幻, 分别之时不忍去看那鹊桥路" +keyword_note = { "柔情似水" = "缱绻的柔情像流水般绵绵不断", "佳期如梦" = "重逢的约会如梦影般缥缈虚幻", "忍顾" = "怎忍回视" } + +["两情若是久长时, 又岂在朝朝暮暮."] +note = [] +content = "两情/若是/久长/时/, 又/岂在/朝朝/暮暮./" +translation = "若是两情相悦, 至死不渝, 又何必贪求卿卿我我的朝欢暮乐呢" +keyword_note = { "两情" = "双方的感情", "久长" = "长久", "朝朝暮暮" = "指朝夕相聚, 语出宋玉《高唐赋》" } diff --git a/data/repo/cngk-t/schedule.toml b/data/repo/cngk-t/schedule.toml new file mode 100644 index 0000000..2a34886 --- /dev/null +++ b/data/repo/cngk-t/schedule.toml @@ -0,0 +1,11 @@ +schedule = ["quick_review", "recognition", "final_review"] + +[phases] +quick_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] +recognition = [["Recognition", "1.0"]] +final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] + +[annotation] +"quick_review" = "复习旧知" +"recognition" = "新知识" +"final_review" = "总复习" diff --git a/data/repo/test/typedef.toml b/data/repo/cngk-t/typedef.toml similarity index 100% rename from data/repo/test/typedef.toml rename to data/repo/cngk-t/typedef.toml diff --git a/data/repo/test/algodata.json b/data/repo/test/algodata.json deleted file mode 100644 index 9e26dfe..0000000 --- a/data/repo/test/algodata.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/data/repo/test/manifest.toml b/data/repo/test/manifest.toml deleted file mode 100644 index 6e5f567..0000000 --- a/data/repo/test/manifest.toml +++ /dev/null @@ -1,3 +0,0 @@ -title = "测试单元: 过秦论" -author = "__heurams__" -desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/data/repo/test/payload.toml b/data/repo/test/payload.toml deleted file mode 100644 index 314995e..0000000 --- a/data/repo/test/payload.toml +++ /dev/null @@ -1,11 +0,0 @@ -["秦孝公据崤函之固, 拥雍州之地,"] -note = [] -content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" -translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," -keyword_note = {"据"="占据", "崤函"="崤山和函谷关", "雍州"="古代九州之一"} - -["君臣固守以窥周室,"] -note = [] -content = "君臣/固守/以窥/周室,/" -translation = "君臣牢固地守卫着,借以窥视周王室的权力," -keyword_note = {"窥"="窥视"} diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml deleted file mode 100644 index e92741d..0000000 --- a/data/repo/test/schedule.toml +++ /dev/null @@ -1,11 +0,0 @@ -schedule = ["quick_review", "recognition", "final_review"] - -[phases] -quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] -recognition = [["Recognition", "1.0"]] -final_review = [["FillBlank", "1.0"], ["SelectMeaning", "1.0"], ["Recognition", "1.0"]] - -[annotation] -"quick_review" = "复习旧知" -"recognition" = "新知识" -"final_review" = "总复习" \ No newline at end of file diff --git a/glossary.md b/glossary.md index ab341de..fa3cd76 100644 --- a/glossary.md +++ b/glossary.md @@ -1,9 +1,12 @@ # 运行时对象 + Atom: 原子, 由核子, 电子, 轨道对象一并构成, 用于处理记忆所需一系列对象 -Nucleon: 核子, 负责解析文件动态内容, 并储存记忆材料内容与谜题定义, 是静态只读但可临时覆盖内容的 -Electron: 电子, 负责处理记忆算法数据 +Nucleon: 核子, 负责解析文件动态内容, 并储存记忆材料内容与谜题定义, 是静态只读但可临时覆盖内容的\ +Electron: 电子, 负责处理记忆算法数据\ Orbital: 轨道, 储存记忆阶段信息与谜题阶段内出现配置 + # 状态机对象 + Transitions: 一种状态机框架库 Reactor: 状态机库 Phaser... diff --git a/pyproject.toml b/pyproject.toml index 395b4dd..92772aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,20 +3,19 @@ name = "heurams" version = "0.5.0" description = "Heuristic Auxiliary Memory Scheduler" readme = "README.md" -authors = [ - { name = "pluvium27", email = "pluvium27@outlook.com" } -] -requires-python = ">=3.12" +authors = [{ name = "pluvium27", email = "pluvium27@outlook.com" }] +requires-python = "==3.14.*" dependencies = [ - "edge-tts==7.0.2", - "jieba==0.42.1", - "openai==1.0.0", + "edge-tts>=7.2.8", + "jieba>=0.42.1", + "openai>=2.32.0", "playsound==1.2.2", - "psutil>=7.2.1", - "tabulate>=0.9.0", - "textual==7.0.0", - "toml==0.10.2", - "transitions==0.9.3", + "psutil>=7.2.2", + "pygobject>=3.56.2", + "tabulate>=0.10.0", + "textual>=8.2.3", + "toml>=0.10.2", + "transitions>=0.9.3", ] [project.scripts] @@ -25,4 +24,4 @@ tui = "heurams.interface.__main__:main" [build-system] requires = ["uv_build>=0.9.22,<0.10.0"] -build-backend = "uv_build" \ No newline at end of file +build-backend = "uv_build" diff --git a/src/heurams/interface/README.md b/src/heurams/interface/README.md index 7f39292..3553d0a 100644 --- a/src/heurams/interface/README.md +++ b/src/heurams/interface/README.md @@ -1,2 +1,3 @@ # Interface - 用户界面 + 与界面系统**强绑定**的相关代码文件, "界面系统" 在此处是基本界面实现相关的 Textual 框架 diff --git a/src/heurams/kernel/README.md b/src/heurams/kernel/README.md index 6eb5b8d..bd0d3ca 100644 --- a/src/heurams/kernel/README.md +++ b/src/heurams/kernel/README.md @@ -1,3 +1,3 @@ # Kernel - HeurAMS 核心 -记忆规划相关算法与数据结构, 可脱离业务层 +记忆规划相关算法与数据结构, 可脱离业务层 diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index e0b7ae5..5114ed8 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -1,15 +1,18 @@ from .base import BaseAlgorithm from .sm2 import SM2Algorithm from .sm15m import SM15MAlgorithm +from .fast0 import FAST0Algorithm __all__ = [ "SM2Algorithm", "BaseAlgorithm", "SM15MAlgorithm", + "FAST0Algorithm", ] algorithms = { "SM-2": SM2Algorithm, + "FAST-0": FAST0Algorithm, "SM-15M": SM15MAlgorithm, "Base": BaseAlgorithm, } diff --git a/src/heurams/kernel/algorithms/fast0.py b/src/heurams/kernel/algorithms/fast0.py new file mode 100644 index 0000000..3c017b9 --- /dev/null +++ b/src/heurams/kernel/algorithms/fast0.py @@ -0,0 +1,91 @@ +from typing import TypedDict + +import heurams.services.timer as timer +from heurams.services.logger import get_logger + +from .base import BaseAlgorithm + +logger = get_logger(__name__) + + +class FAST0Algorithm(BaseAlgorithm): + algo_name = "FAST-0" + + class AlgodataDict(TypedDict): + real_rept: int + rept: int + interval: int + important: int + last_date: int + next_date: int + is_activated: int + last_modify: float + + defaults = { + "real_rept": 0, + 'important': 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": timer.get_timestamp(), + } + + @classmethod + def revisor( + cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False + ): + """FAST-0 算法迭代决策机制实现 + 根据 quality(0 ~ 5) 进行参数迭代最佳间隔 + quality 由主程序评估 + + Args: + quality (int): 记忆保留率量化参数 + """ + logger.debug( + "FAST0.revisor 开始, feedback: %d, is_new_activation: %s", + feedback, + is_new_activation, + ) + + if feedback == -1: + logger.debug("feedback 为 -1, 跳过更新") + return + algodata[cls.algo_name]["interval"] = (1 if feedback <= 3 else float('inf')) + algodata[cls.algo_name]["important"] = (1 if feedback <= 3 else algodata[cls.algo_name]["important"]) + algodata[cls.algo_name]["last_date"] = timer.get_daystamp() + algodata[cls.algo_name]["next_date"] = ( + timer.get_daystamp() + algodata[cls.algo_name]["interval"] + ) + algodata[cls.algo_name]["last_modify"] = timer.get_timestamp() + + logger.debug( + "更新日期: last_date=%d, next_date=%d, last_modify=%f", + algodata[cls.algo_name]["last_date"], + algodata[cls.algo_name]["next_date"], + algodata[cls.algo_name]["last_modify"], + ) + + @classmethod + def is_due(cls, algodata): + result = algodata[cls.algo_name]["next_date"] <= timer.get_daystamp() + logger.debug( + "FAST0.is_due: next_date=%d, current_daystamp=%d, result=%s", + algodata[cls.algo_name]["next_date"], + timer.get_daystamp(), + result, + ) + return result + + @classmethod + def get_rating(cls, algodata): + efactor = algodata[cls.algo_name]["efactor"] + logger.debug("FAST0.rate: efactor=%f", efactor) + return str(efactor) + + @classmethod + def nextdate(cls, algodata) -> int: + next_date = algodata[cls.algo_name]["next_date"] + logger.debug("FAST0.nextdate: %d", next_date) + return next_date diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index c35073d..dd7db5f 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -1,11 +1,11 @@ # Reactor - 记忆流程状态机模块 -Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配. -得益于 Pickle, 状态机模块支持快照! +Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配.\ +得益于 Pickle, 状态机模块支持快照! ## Phaser - 全局阶段控制器 -在一次队列记忆流程中, Phaser 代表记忆流程本身. +在一次队列记忆流程中, Phaser 代表记忆流程本身. ### 属性 @@ -14,35 +14,35 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实 其有状态属性: - unsure - 用于初始化 -- *quick_review - 复习逾期的单元 -- *recognition - 辨识新单元 -- *final_review - 复习所有逾期的和新辨认的单元 -- finished - 表示完成 +- \*quick_review - 复习逾期的单元 +- \*recognition - 辨识新单元 +- \*final_review - 复习所有逾期的和新辨认的单元 +- finished - 表示完成 > 逾期的: 指 SM-2 算法间隔显示应该复习的单元 带 * 的属性表示实际的记忆阶段, 由 repo 中 schedule.toml 中 schedule 列表显式声明, 运行过程中可以选择性执行, "空的" Procession 会被直接跳过. -在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程. +在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程. 你可以用 state 属性获取 Phaser 的当前状态. #### Procession 属性 -储存一个顺序列表, 保存所有构造的 Procession. +储存一个顺序列表, 保存所有构造的 Procession.\ 顺序与 repo 中 schedule.toml 中 schedule 列表中的顺序完全相同 ### 初始化 -Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料 -在内部, 根据是否激活将其分为 new_atoms 与 old_atoms. +Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料\ +在内部, 根据是否激活将其分为 new_atoms 与 old_atoms.\ 因此, 如果你传入的列表中有算法上"无所事事"的 Atom, 流程会对其进行"加强复习" -由此创建 Procession. +由此创建 Procession. ### 直接输出呈现形式 -Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. -其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown. +Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ +其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown.\ 示例: ```text @@ -51,20 +51,20 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. | Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | ``` -| Type | State | Processions | Current Procession | +| Type | State | Processions | Current Procession | |:-------|:--------|:-----------------------|:---------------------| -| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | +| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | ### 方法 -作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. -除此之外, 它也拥有一些其他方法. +作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.\ +除此之外, 它也拥有一些其他方法. #### current_procession(self) -用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态. -返回一个 Procession 对象, 是当前阶段的 Procession. -内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性 +用于查询当前的 Procession, 并且根据当前 Procession 更新自身状态.\ +返回一个 Procession 对象, 是当前阶段的 Procession.\ +内部运作是返回第一个状态不为 finished 的 Procession, 并将自身状态变更为 Procession 的"阶段状态"属性\ 若所有 Procession 都已完成, 将返回一个"阶段状态"为 finished 的 Procession 占位符对象(它不在 procession 属性中), 并更新自身状态为 finished. ## Procession - 阶段管理器 @@ -87,7 +87,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. > 注意区分 "Phaser" 和 "Phase", 其中 "Phase" 表示 "Phaser State". -- name_: 阶段的命名 +- name\_: 阶段的命名 - state: 当前状态属性 ### 初始化 @@ -96,7 +96,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. ### 直接输出呈现形式 -同 Phaser, 但显示数据有所不同 +同 Phaser, 但显示数据有所不同\ 与 Phaser 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) ```text @@ -105,23 +105,23 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ``` -| Type | Name | State | Progress | Queue | Current Atom | +| Type | Name | State | Progress | Queue | Current Atom | |:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| -| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ### 方法 -作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法. -除此之外, 它也拥有一些其他方法. +作为一个 Transition Machine 对象的继承, 其拥有 Machine 对象拥有的所有方法.\ +除此之外, 它也拥有一些其他方法. #### forward(self, step=1) -移动 cursor 并依情况更新 current_atom 和状态属性 -无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启". +移动 cursor 并依情况更新 current_atom 和状态属性\ +无论 Procession 是否处于完成状态, forward 操作都是可逆的, 你可以传入负数, 此时已完成的 Procession 会自动"重启". #### append(self, atom=None) -追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端 +追加(回忆失败的)原子(默认为当前原子, 传入 None 会自动转化为当前原子)到队列末端\ 如果这个原子已经处于队列末端, 不会重复追加, 除非队列只剩下这个原子还没完成(此时最多重复两个) #### process(self) @@ -130,7 +130,7 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试. #### __len__(self) -返回剩余原子量(而不是原子总量) +返回剩余原子量(而不是原子总量)\ 可以使用 len 函数调用 获取原子总量请用 len(obj.atoms), 或者 total_length(self) 方法 diff --git a/src/heurams/providers/README.md b/src/heurams/providers/README.md index 46179de..a3e8b64 100644 --- a/src/heurams/providers/README.md +++ b/src/heurams/providers/README.md @@ -1,2 +1,3 @@ # Provider - 提供者 -底层相关与第三方 API 接口包装 \ No newline at end of file + +底层相关与第三方 API 接口包装 diff --git a/src/heurams/services/README.md b/src/heurams/services/README.md index 84b572b..7274000 100644 --- a/src/heurams/services/README.md +++ b/src/heurams/services/README.md @@ -1,2 +1,3 @@ # Services - 服务 -基础服务相关代码 \ No newline at end of file + +基础服务相关代码 diff --git a/uv.lock b/uv.lock index 16a170f..bca2161 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.12" +requires-python = "==3.14.*" [[package]] name = "aiohappyeyeballs" @@ -13,7 +13,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.3" +version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -24,76 +24,42 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, - { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, - { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, - { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, - { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, - { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, - { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, - { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, - { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, - { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, - { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, - { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, - { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, - { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, - { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, - { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" }, + { url = "https://files.pythonhosted.org/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" }, + { url = "https://files.pythonhosted.org/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" }, + { url = "https://files.pythonhosted.org/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" }, + { url = "https://files.pythonhosted.org/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" }, + { url = "https://files.pythonhosted.org/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" }, + { url = "https://files.pythonhosted.org/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" }, + { url = "https://files.pythonhosted.org/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" }, + { url = "https://files.pythonhosted.org/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" }, + { url = "https://files.pythonhosted.org/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" }, + { url = "https://files.pythonhosted.org/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" }, + { url = "https://files.pythonhosted.org/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" }, + { url = "https://files.pythonhosted.org/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" }, + { url = "https://files.pythonhosted.org/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" }, + { url = "https://files.pythonhosted.org/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" }, + { url = "https://files.pythonhosted.org/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" }, + { url = "https://files.pythonhosted.org/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" }, + { url = "https://files.pythonhosted.org/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" }, + { url = "https://files.pythonhosted.org/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" }, + { url = "https://files.pythonhosted.org/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" }, ] [[package]] @@ -102,7 +68,6 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -120,33 +85,32 @@ wheels = [ [[package]] name = "anyio" -version = "3.7.1" +version = "4.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, - { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/99/2dfd53fd55ce9838e6ff2d4dac20ce58263798bd1a0dbe18b3a9af3fcfce/anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", size = 142927, upload-time = "2023-07-05T16:45:02.294Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/24/44299477fe7dcc9cb58d0a57d5a7588d6af2ff403fdd2d47a246c91a3246/anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5", size = 80896, upload-time = "2023-07-05T16:44:59.805Z" }, + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] [[package]] name = "attrs" -version = "25.4.0" +version = "26.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] @@ -169,18 +133,17 @@ wheels = [ [[package]] name = "edge-tts" -version = "7.0.2" +version = "7.2.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "certifi" }, - { name = "srt" }, { name = "tabulate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/12/32554080d0d03ca0b874677fc4548ea9042ddfeb0b3f38cd107c760aff28/edge_tts-7.0.2.tar.gz", hash = "sha256:1374f493c170e6fe432d04012061c279e518c495524fa51b1b9da7368cc6b21b", size = 23581, upload-time = "2025-05-03T10:34:17.179Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/60/afbf548b43c78355e03926c6b1fff7500303a2da4d84db9e1324119e21ae/edge_tts-7.2.8.tar.gz", hash = "sha256:fcf185a0d527a0d2d003f9d5841facc1d5e0e7b3b88d5df9c32990402c6b8cd0", size = 27875, upload-time = "2026-03-22T19:57:50.962Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/21/6ebbc7fc6a4e58bcd49130273a072f7c2e4e6dc03735e078895b47148e30/edge_tts-7.0.2-py3-none-any.whl", hash = "sha256:effc554c249f02bd5013f28cd1faa22802e0757b031a7759be5960084ccb8d76", size = 26274, upload-time = "2025-05-03T10:34:15.872Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2b/a8cb687b92a2690d2ad171f0c2fd1c8f18690363cca7618bab2bbe4cdf2b/edge_tts-7.2.8-py3-none-any.whl", hash = "sha256:361fe48ce7ef613adbe30f664e3765dd71029c6cb57427279eff8ad6df2eb211", size = 31026, upload-time = "2026-03-22T19:57:49.672Z" }, ] [[package]] @@ -189,54 +152,6 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, - { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, - { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, - { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, - { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, - { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, - { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, - { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, - { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, - { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, - { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, - { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, - { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, - { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, - { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, - { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, - { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, - { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, - { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, - { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, @@ -291,6 +206,7 @@ dependencies = [ { name = "openai" }, { name = "playsound" }, { name = "psutil" }, + { name = "pygobject" }, { name = "tabulate" }, { name = "textual" }, { name = "toml" }, @@ -299,15 +215,16 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "edge-tts", specifier = "==7.0.2" }, - { name = "jieba", specifier = "==0.42.1" }, - { name = "openai", specifier = "==1.0.0" }, + { name = "edge-tts", specifier = ">=7.2.8" }, + { name = "jieba", specifier = ">=0.42.1" }, + { name = "openai", specifier = ">=2.32.0" }, { name = "playsound", specifier = "==1.2.2" }, - { name = "psutil", specifier = ">=7.2.1" }, - { name = "tabulate", specifier = ">=0.9.0" }, - { name = "textual", specifier = "==7.0.0" }, - { name = "toml", specifier = "==0.10.2" }, - { name = "transitions", specifier = "==0.9.3" }, + { name = "psutil", specifier = ">=7.2.2" }, + { name = "pygobject", specifier = ">=3.56.2" }, + { name = "tabulate", specifier = ">=0.10.0" }, + { name = "textual", specifier = ">=8.2.3" }, + { name = "toml", specifier = ">=0.10.2" }, + { name = "transitions", specifier = ">=0.9.3" }, ] [[package]] @@ -353,16 +270,51 @@ version = "0.42.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c6/cb/18eeb235f833b726522d7ebed54f2278ce28ba9438e3135ab0278d9792a2/jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2", size = 19214172, upload-time = "2020-01-20T14:27:23.5Z" } +[[package]] +name = "jiter" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, +] + [[package]] name = "linkify-it-py" -version = "2.0.3" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "uc-micro-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946, upload-time = "2024-02-04T14:48:04.179Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/c9/06ea13676ef354f0af6169587ae292d3e2406e212876a413bf9eece4eb23/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b", size = 29158, upload-time = "2026-03-01T07:48:47.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" }, ] [[package]] @@ -405,127 +357,75 @@ wheels = [ [[package]] name = "multidict" -version = "6.7.0" +version = "6.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, - { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, - { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, - { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, - { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, - { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, - { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, - { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, - { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, - { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, - { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, - { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, - { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, - { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, - { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, - { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, - { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, - { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, - { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, - { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, - { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, - { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, - { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, - { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, - { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, - { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, - { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, - { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, - { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, - { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, - { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, - { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, - { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, - { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, - { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, - { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, - { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, - { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, - { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, - { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, - { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, - { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, - { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, - { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, - { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, - { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, - { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, - { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, - { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, - { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, - { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, - { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, - { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, - { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, - { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, - { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, - { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, - { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, - { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, - { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, - { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, - { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, - { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, - { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] [[package]] name = "openai" -version = "1.0.0" +version = "2.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "distro" }, { name = "httpx" }, + { name = "jiter" }, { name = "pydantic" }, + { name = "sniffio" }, { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/92/559d5b2859950dd1f60f09e264b2f9749363c2cf6aa449698192d3dae98c/openai-1.0.0.tar.gz", hash = "sha256:bc58aad3d192f107b82c873dcab66b70f859cbdd12face5124595ef0d0d2c9f4", size = 100085, upload-time = "2023-11-06T16:20:37.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/4d4ac5ddc0bdd8257aedb1383841af8c688114ab22a902976f520362eb35/openai-1.0.0-py3-none-any.whl", hash = "sha256:e9220abf3f0332ddfcbcef3e13f70e71459618637d2e7e87b82241aaca1147f4", size = 154081, upload-time = "2023-11-06T16:20:35.146Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, ] [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] [[package]] @@ -542,51 +442,6 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, - { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, - { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, - { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, - { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, - { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, - { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, - { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, - { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, - { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, - { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, - { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, - { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, - { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, - { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, - { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, - { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, - { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, @@ -622,35 +477,42 @@ wheels = [ [[package]] name = "psutil" -version = "7.2.1" +version = "7.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d", size = 129624, upload-time = "2025-12-29T08:26:04.255Z" }, - { url = "https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49", size = 130132, upload-time = "2025-12-29T08:26:06.228Z" }, - { url = "https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc", size = 180612, upload-time = "2025-12-29T08:26:08.276Z" }, - { url = "https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf", size = 183201, upload-time = "2025-12-29T08:26:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, - { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, - { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, - { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, - { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, - { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, - { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, - { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, - { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, - { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pycairo" +version = "1.29.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, + { url = "https://files.pythonhosted.org/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, + { url = "https://files.pythonhosted.org/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, ] [[package]] name = "pydantic" -version = "2.12.5" +version = "2.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -658,102 +520,81 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/e5/06d23afac9973109d1e3c8ad38e1547a12e860610e327c05ee686827dc37/pydantic-2.13.2.tar.gz", hash = "sha256:b418196607e61081c3226dcd4f0672f2a194828abb9109e9cfb84026564df2d1", size = 843836, upload-time = "2026-04-17T09:31:59.636Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/77/ca/b45c378e6e8d0b90577288b533e04e95b7afd61bb1d51b6c263176435489/pydantic-2.13.2-py3-none-any.whl", hash = "sha256:a525087f4c03d7e7456a3de89b64cd693d2229933bb1068b9af6befd5563694e", size = 471947, upload-time = "2026-04-17T09:31:57.541Z" }, ] [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.46.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/bb/4742f05b739b2478459bb16fa8470549518c802e06ddcf3f106c5081315e/pydantic_core-2.46.2.tar.gz", hash = "sha256:37bb079f9ee3f1a519392b73fda2a96379b31f2013c6b467fe693e7f2987f596", size = 471269, upload-time = "2026-04-17T09:10:07.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/d0/96/a50ccb6b539ae780f73cea74905468777680e30c6c3bdf714b9d4c116ea0/pydantic_core-2.46.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:4f59b45f3ef8650c0c736a57f59031d47ed9df4c0a64e83796849d7d14863a2d", size = 2097111, upload-time = "2026-04-17T09:10:49.617Z" }, + { url = "https://files.pythonhosted.org/packages/34/5f/fdead7b3afa822ab6e5a18ee0ecffd54937de1877c01ed13a342e0fb3f07/pydantic_core-2.46.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3a075a29ebef752784a91532a1a85be6b234ccffec0a9d7978a92696387c3da6", size = 1951904, upload-time = "2026-04-17T09:12:32.062Z" }, + { url = "https://files.pythonhosted.org/packages/95/e0/1c5d547e550cdab1bec737492aa08865337af6fe7fc9b96f7f45f17d9519/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d12d786e30c04a9d307c5d7080bf720d9bac7f1668191d8e37633a9562749e2", size = 1978667, upload-time = "2026-04-17T09:11:35.589Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cb/665ce629e218c8228302cb94beff4f6531082a2c87d3ecc3d5e63a26f392/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d5e6d6343b0b5dcacb3503b5de90022968da8ed0ab9ab39d3eda71c20cbf84e", size = 2046721, upload-time = "2026-04-17T09:11:47.725Z" }, + { url = "https://files.pythonhosted.org/packages/77/e9/6cb2cf60f54c1472bbdfce19d957553b43dbba79d1d7b2930a195c594785/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:233eebac0999b6b9ba76eb56f3ec8fce13164aa16b6d2225a36a79e0f95b5973", size = 2228483, upload-time = "2026-04-17T09:12:08.837Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/93e018dd5571f781ebaeda8c0cf65398489d5bee9b1f484df0b6149b43b9/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cc0eee720dd2f14f3b7c349469402b99ad81a174ab49d3533974529e9d93992", size = 2294663, upload-time = "2026-04-17T09:12:52.053Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/49e57ca55c770c93d9bb046666a54949b42e3c9099a0c5fe94557873fe30/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ee76bf2c9910513dbc19e7d82367131fa7508dedd6186a462393071cc11059", size = 2098742, upload-time = "2026-04-17T09:13:45.472Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b0/6e46b5cd3332af665f794b8cdeea206618a8630bd9e7bcc36864518fce81/pydantic_core-2.46.2-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:d61db38eb4ee5192f0c261b7f2d38e420b554df8912245e3546aee5c45e2fd78", size = 2125922, upload-time = "2026-04-17T09:12:54.304Z" }, + { url = "https://files.pythonhosted.org/packages/06/d1/40850c81585be443a2abfdf7f795f8fae831baf8e2f9b2133c8246ac671c/pydantic_core-2.46.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f09a713d17bcd55da8ab02ebd9110c5246a49c44182af213b5212800af8bc83", size = 2183000, upload-time = "2026-04-17T09:10:59.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/af/8493d7dfa03ebb7866909e577c6aa65ea0de7377b86023cc51d0c8e11db3/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:30cacc5fb696e64b8ef6fd31d9549d394dd7d52760db072eecb98e37e3af1677", size = 2180335, upload-time = "2026-04-17T09:12:57.01Z" }, + { url = "https://files.pythonhosted.org/packages/72/5b/1f6a344c4ffdf284da41c6067b82d5ebcbd11ce1b515ae4b662d4adb6f61/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:7ccfb105fcfe91a22bbb5563ad3dc124bc1aa75bfd2e53a780ab05f78cdf6108", size = 2330002, upload-time = "2026-04-17T09:12:02.958Z" }, + { url = "https://files.pythonhosted.org/packages/25/ff/9a694126c12d6d2f48a0cafa6f8eef88ef0d8825600e18d03ff2e896c3b2/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:13ffef637dc8370c249e5b26bd18e9a80a4fca3d809618c44e18ec834a7ca7a8", size = 2359920, upload-time = "2026-04-17T09:10:27.764Z" }, + { url = "https://files.pythonhosted.org/packages/51/c8/3a35c763d68a9cb2675eb10ef242cf66c5d4701b28ae12e688d67d2c180e/pydantic_core-2.46.2-cp314-cp314-win32.whl", hash = "sha256:1b0ab6d756ca2704a938e6c31b53f290c2f9c10d3914235410302a149de1a83e", size = 1953701, upload-time = "2026-04-17T09:13:30.021Z" }, + { url = "https://files.pythonhosted.org/packages/1a/6a/f2726a780365f7dfd89d62036f984f7acb99978c60c5e1fa7c0cb898ed11/pydantic_core-2.46.2-cp314-cp314-win_amd64.whl", hash = "sha256:99ebade8c9ada4df975372d8dd25883daa0e379a05f1cd0c99aa0c04368d01a6", size = 2071867, upload-time = "2026-04-17T09:10:39.205Z" }, + { url = "https://files.pythonhosted.org/packages/e1/79/76baacb9feba3d7c399b245ca1a29c74ea0db04ea693811374827eec2290/pydantic_core-2.46.2-cp314-cp314-win_arm64.whl", hash = "sha256:de87422197cf7f83db91d89c86a21660d749b3cd76cd8a45d115b8e675670f02", size = 2017252, upload-time = "2026-04-17T09:10:26.175Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3b/77c26938f817668d9ad9bab1a905cb23f11d9a3d4bf724d429b3e55a8eaf/pydantic_core-2.46.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:236f22b4a206b5b61db955396b7cf9e2e1ff77f372efe9570128ccfcd6a525eb", size = 2094545, upload-time = "2026-04-17T09:12:19.339Z" }, + { url = "https://files.pythonhosted.org/packages/fe/de/42c13f590e3c260966aa49bcdb1674774f975467c49abd51191e502bea28/pydantic_core-2.46.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c2012f64d2cd7cca50f49f22445aa5a88691ac2b4498ee0a9a977f8ca4f7289f", size = 1933953, upload-time = "2026-04-17T09:09:55.889Z" }, + { url = "https://files.pythonhosted.org/packages/4e/84/ebe3ebb3e2d8db656937cfa6f97f544cb7132f2307a4a7dfdcd0ea102a12/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d07d6c63106d3a9c9a333e2636f9c82c703b1a9e3b079299e58747964e4fdb72", size = 1974435, upload-time = "2026-04-17T09:10:12.371Z" }, + { url = "https://files.pythonhosted.org/packages/b9/15/0bf51ca6709477cd4ef86148b6d7844f3308f029eac361dd0383f1e17b1a/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c326a2b4b85e959d9a1fc3a11f32f84611b6ec07c053e1828a860edf8d068208", size = 2031113, upload-time = "2026-04-17T09:10:00.752Z" }, + { url = "https://files.pythonhosted.org/packages/02/ae/b7b5af9b79db036d9e61a44c481c17a213dc8fc4b8b71fe6875a72fc778b/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac8a65e798f2462552c00d2e013d532c94d646729dda98458beaf51f9ec7b120", size = 2236325, upload-time = "2026-04-17T09:10:33.227Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ae/ecef7477b5a03d4a499708f7e75d2836452ebb70b776c2d64612b334f57a/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a3c2bc1cc8164bedbc160b7bb1e8cc1e8b9c27f69ae4f9ae2b976cdae02b2dd", size = 2278135, upload-time = "2026-04-17T09:10:23.287Z" }, + { url = "https://files.pythonhosted.org/packages/db/e4/2f9d82faa47af6c39fc3f120145fd915971e1e0cb6b55b494fad9fdf8275/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69aa5e10b7e8b1bb4a6888650fd12fcbf11d396ca11d4a44de1450875702830", size = 2109071, upload-time = "2026-04-17T09:11:06.149Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9c/677cf10873fbd0b116575ab7b97c90482b21564f8a8040beb18edef7a577/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4e6df5c3301e65fb42bc5338bf9a1027a02b0a31dc7f54c33775229af474daf0", size = 2106028, upload-time = "2026-04-17T09:10:51.525Z" }, + { url = "https://files.pythonhosted.org/packages/d6/53/6a06183544daba51c059123a2064a99039df25f115a06bdb26f2ea177038/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c2f6e32548ac8d559b47944effcf8ae4d81c161f6b6c885edc53bc08b8f192d", size = 2164816, upload-time = "2026-04-17T09:11:56.187Z" }, + { url = "https://files.pythonhosted.org/packages/57/6f/10fcdd9e3eca66fc828eef0f6f5850f2dd3bca2c59e6e041fb8bc3da39be/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:b089a81c58e6ea0485562bbbbbca4f65c0549521606d5ef27fba217aac9b665a", size = 2166130, upload-time = "2026-04-17T09:10:03.804Z" }, + { url = "https://files.pythonhosted.org/packages/29/83/92d3fd0e0156cad2e3cb5c26de73794af78ac9fa0c22ab666e566dd67061/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:7f700a6d6f64112ae9193709b84303bbab84424ad4b47d0253301aabce9dfc70", size = 2316605, upload-time = "2026-04-17T09:12:45.249Z" }, + { url = "https://files.pythonhosted.org/packages/97/f1/facffdb970981068219582e499b8d0871ed163ffcc6b347de5c412669e4c/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:67db6814beaa5fefe91101ec7eb9efda613795767be96f7cf58b1ca8c9ca9972", size = 2358385, upload-time = "2026-04-17T09:09:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a1/b8160b2f22b2199467bc68581a4ed380643c16b348a27d6165c6c242d694/pydantic_core-2.46.2-cp314-cp314t-win32.whl", hash = "sha256:32fbc7447be8e3be99bf7869f7066308f16be55b61f9882c2cefc7931f5c7664", size = 1942373, upload-time = "2026-04-17T09:12:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/0d/90/db89acabe5b150e11d1b59fe3d947dda2ef6abbfef5c82f056ff63802f5d/pydantic_core-2.46.2-cp314-cp314t-win_amd64.whl", hash = "sha256:b317a2b97019c0b95ce99f4f901ae383f40132da6706cdf1731066a73394c25c", size = 2052078, upload-time = "2026-04-17T09:10:19.96Z" }, + { url = "https://files.pythonhosted.org/packages/97/32/e19b83ceb07a3f1bb21798407790bbc9a31740158fd132b94139cb84e16c/pydantic_core-2.46.2-cp314-cp314t-win_arm64.whl", hash = "sha256:7dcb9d40930dfad7ab6b20bcc6ca9d2b030b0f347a0cd9909b54bd53ead521b1", size = 2016941, upload-time = "2026-04-17T09:12:34.447Z" }, ] [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] +[[package]] +name = "pygobject" +version = "3.56.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycairo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/80/09247a2be28af2c2240132a0af6c1005a2b1d089242b13a2cd782d2de8d7/pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313", size = 1409059, upload-time = "2026-03-25T16:14:04.008Z" } + [[package]] name = "rich" -version = "14.2.0" +version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] @@ -774,24 +615,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] -[[package]] -name = "srt" -version = "3.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/b7/4a1bc231e0681ebf339337b0cd05b91dc6a0d701fa852bb812e244b7a030/srt-3.5.3.tar.gz", hash = "sha256:4884315043a4f0740fd1f878ed6caa376ac06d70e135f306a6dc44632eed0cc0", size = 28296, upload-time = "2023-03-28T02:35:44.007Z" } - [[package]] name = "tabulate" -version = "0.9.0" +version = "0.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, ] [[package]] name = "textual" -version = "7.0.0" +version = "8.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", extra = ["linkify"] }, @@ -801,9 +636,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/9c/ebc9ca1f95366bef4c0e8360f4a77400d47a79aeecc08747de1990ef8bdc/textual-7.0.0.tar.gz", hash = "sha256:617638a2be74fb7507aff3ea6ec9374148be02e5a7bb1d02396d1d557b66c0a9", size = 1582005, upload-time = "2026-01-03T11:48:10.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/2f/d44f0f12b3ddb1f0b88f7775652e99c6b5a43fd733badf4ce064bdbfef4a/textual-8.2.3.tar.gz", hash = "sha256:beea7b86b03b03558a2224f0cc35252e60ef8b0c4353b117b2f40972902d976a", size = 1848738, upload-time = "2026-04-05T09:12:45.338Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/a1ef9034b2a7f334f91b2f673f2ec03020a2529bb30a9437a6beb855beee/textual-7.0.0-py3-none-any.whl", hash = "sha256:190de0f65e5f4bc820fae46f32f591e509621d76688b36400ce01fa63dc6b623", size = 715156, upload-time = "2026-01-03T11:48:09.067Z" }, + { url = "https://files.pythonhosted.org/packages/0e/28/a81d6ce9f4804818bd1231a9a6e4d56ea84ebbe8385c49591444f0234fa2/textual-8.2.3-py3-none-any.whl", hash = "sha256:5008ac581bebf1f6fa0520404261844a231e5715fdbddd10ca73916a3af48ca2", size = 724231, upload-time = "2026-04-05T09:12:48.747Z" }, ] [[package]] @@ -817,14 +652,14 @@ wheels = [ [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] [[package]] @@ -862,103 +697,59 @@ wheels = [ [[package]] name = "uc-micro-py" -version = "1.0.3" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043, upload-time = "2024-02-09T16:52:01.654Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/67/9a363818028526e2d4579334460df777115bdec1bb77c08f9db88f6389f2/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811", size = 6611, upload-time = "2026-03-01T06:31:27.526Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/61/73/d21edf5b204d1467e06500080a50f79d49ef2b997c79123a536d4a17d97c/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c", size = 6383, upload-time = "2026-03-01T06:31:26.257Z" }, ] [[package]] name = "yarl" -version = "1.22.0" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, - { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, - { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, - { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, - { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, - { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, - { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, - { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, - { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, - { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, - { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, - { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, - { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, - { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, - { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, - { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, - { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, - { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, - { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, - { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, - { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, - { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, - { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, - { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, - { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, - { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, - { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, - { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, - { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, - { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, - { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, - { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, - { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, - { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, - { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, - { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, - { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, - { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, - { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, - { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, - { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, - { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, - { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, - { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, - { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, + { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, + { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, + { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, + { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, + { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, + { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, + { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, + { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, + { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, + { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, + { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, + { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, + { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] From 5c430595185368ebfdbbb8f40105145d6518e28b Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sun, 19 Apr 2026 12:08:58 +0800 Subject: [PATCH 31/79] =?UTF-8?q?fix:=20=E5=8F=98=E6=9B=B4=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E6=B3=A8=E5=86=8C=E8=A1=A8=E4=BB=A5=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=94=AE=E9=80=A0=E6=88=90=E7=9A=84=E5=B4=A9?= =?UTF-8?q?=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 4 ++-- data/repo/cngk-t/schedule.toml | 2 +- src/heurams/interface/screens/dashboard.py | 7 ++++--- src/heurams/interface/widgets/cloze_puzzle.py | 5 +++-- src/heurams/kernel/algorithms/base.py | 2 +- src/heurams/kernel/algorithms/fast0.py | 2 +- src/heurams/kernel/algorithms/sm2.py | 2 +- src/heurams/kernel/reactor/fission.py | 13 ++++++++----- src/heurams/services/hasher.py | 8 ++++---- 9 files changed, 25 insertions(+), 20 deletions(-) diff --git a/data/config/config.toml b/data/config/config.toml index 2e54fee..10f3d05 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -9,10 +9,10 @@ timestamp_override = -1 quick_pass = true # [调试] 自动化测试模式(仅用于测试完整性) -auto_pass = false +auto_pass = true # 对于每个项目的默认新记忆原子数量 -scheduled_num = 20 +scheduled_num = 100 # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 timezone_offset = +28800 # 中国标准时间 (UTC+8) diff --git a/data/repo/cngk-t/schedule.toml b/data/repo/cngk-t/schedule.toml index 2a34886..e3a808b 100644 --- a/data/repo/cngk-t/schedule.toml +++ b/data/repo/cngk-t/schedule.toml @@ -2,7 +2,7 @@ schedule = ["quick_review", "recognition", "final_review"] [phases] quick_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] -recognition = [["Recognition", "1.0"]] +recognition = [["FillBlank", "1.0"]] final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] [annotation] diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 3827214..6b6ea10 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -17,6 +17,7 @@ import heurams.services.version as version from heurams.context import * from heurams.kernel.particles import * from heurams.kernel.repolib import * +from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger from .about import AboutScreen @@ -58,14 +59,14 @@ class DashboardScreen(Screen): f"当前 UNIX 日时间戳: {timer.get_daystamp()}" ), Label(f"应用时区修正: UTC+{config_var.get()['timezone_offset'] / 3600}"), - Label(f"全局算法设置: {config_var.get()['algorithm']['default']}"), + Label(f"全局算法设置: {config_var.get()['algorithm']['default']}: {algorithms[config_var.get()['algorithm']['default']].desc}"), classes="column infview", ), Vertical( Label(f"已加载 {len(self.repostat)} 个单元集", classes='dataview'), Label(f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.get('unit_sum'), self.repostat.values()))} 个单元", classes='dataview'), Label(f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.get('activated_sum'), self.repostat.values()))} 个单元", classes='dataview'), - Label(f"终端尺寸: {os.get_terminal_size()[0]}x{os.get_terminal_size()[1]}"), + Label(f""), classes="column dataview", ), id="dashboardtop" @@ -191,4 +192,4 @@ class DashboardScreen(Screen): if str(event.button.id).startswith("launch_"): # type: ignore from .preparation import launch launch(repo=self.dirname2repo[event.button.id[7:]], app=self.app, scheduled_num=-1) # type: ignore - # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 \ No newline at end of file + # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index b0e3bd8..3a9a980 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -70,8 +70,9 @@ class ClozePuzzle(BasePuzzleWidget): # 渲染当前问题的选项 with Container(id="btn-container"): for i in self.ans: - self.hashmap[str(hash(i))] = i - btnid = f"sel000-{hash(i)}" + h = str(hash(i)) + self.hashmap[h] = i + btnid = f"sel000-{h}" logger.debug(f"建立按钮 {btnid}") yield Button(i, id=f"{btnid}") diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index 18c30ae..c89839d 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -8,7 +8,7 @@ logger = get_logger(__name__) class BaseAlgorithm: algo_name = "BaseAlgorithm" - + desc = '算法基类' class AlgodataDict(TypedDict): real_rept: int rept: int diff --git a/src/heurams/kernel/algorithms/fast0.py b/src/heurams/kernel/algorithms/fast0.py index 3c017b9..4548b17 100644 --- a/src/heurams/kernel/algorithms/fast0.py +++ b/src/heurams/kernel/algorithms/fast0.py @@ -10,7 +10,7 @@ logger = get_logger(__name__) class FAST0Algorithm(BaseAlgorithm): algo_name = "FAST-0" - + desc = '快速筛选用特殊调度器' class AlgodataDict(TypedDict): real_rept: int rept: int diff --git a/src/heurams/kernel/algorithms/sm2.py b/src/heurams/kernel/algorithms/sm2.py index 0d848aa..aa49538 100644 --- a/src/heurams/kernel/algorithms/sm2.py +++ b/src/heurams/kernel/algorithms/sm2.py @@ -10,7 +10,7 @@ logger = get_logger(__name__) class SM2Algorithm(BaseAlgorithm): algo_name = "SM-2" - + desc = '经典间隔重复算法' class AlgodataDict(TypedDict): efactor: float real_rept: int diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index 98ef82d..cf6cd8b 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -71,7 +71,8 @@ class Fission(Machine): "alia": item, } ) - self.current_puzzle_inf = self.puzzles_inf[0] + if self.puzzles_inf: + self.current_puzzle_inf = self.puzzles_inf[0] for i in range(len(self.puzzles_inf)): self.min_ratings.append(float('inf')) @@ -94,12 +95,14 @@ class Fission(Machine): return self.current_puzzle_inf def report(self, rating): - self.min_ratings[self.cursor] = min(rating, self.min_ratings[self.cursor]) + if self.puzzles_inf: + self.min_ratings[self.cursor] = min(rating, self.min_ratings[self.cursor]) def get_quality(self): - if self.is_state("retronly", self): - return reduce(lambda x, y: min(x, y), self.min_ratings) - raise IndexError + if self.puzzles_inf: + if self.is_state("retronly", self): + return reduce(lambda x, y: min(x, y), self.min_ratings) + raise IndexError def forward(self, step=1): """将谜题指针向前移动并依情况更新或完成""" diff --git a/src/heurams/services/hasher.py b/src/heurams/services/hasher.py index 60e1d6e..8a419f9 100644 --- a/src/heurams/services/hasher.py +++ b/src/heurams/services/hasher.py @@ -1,20 +1,20 @@ # 哈希服务 import hashlib - +import random from heurams.services.logger import get_logger logger = get_logger(__name__) def get_md5(text): - logger.debug(f"计算哈希, 输入`{text}`") + logger.debug(f"计算MD5哈希, 输入`{text}`") result = hashlib.md5(text.encode("utf-8")).hexdigest() logger.debug("哈希结果: %s...", result[:8]) return result def hash(text): - logger.debug(f"计算哈希, 输入`{text}`") - result = hashlib.md5(text.encode("utf-8")).hexdigest() + logger.debug(f"计算MD5-时间复合哈希, 输入`{text}`") + result = hashlib.md5(f"{text}{random.randint(0,1000)}".encode("utf-8")).hexdigest() logger.debug("哈希结果: %s...", result[:8]) return result From a38fd3d398c5ddd304d4e79edb4f474c66ab12ff Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 01:44:43 +0800 Subject: [PATCH 32/79] =?UTF-8?q?refactor:=20=E5=AF=B9=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8=E5=92=8C=E9=85=8D=E7=BD=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E8=BF=9B=E8=A1=8C=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 65 +- data/config/data/config/config.toml | 0 data/config/global.toml | 7 + data/config/interface/global.toml | 6 + data/config/interface/puzzles/cloze.toml | 1 + data/config/interface/puzzles/mcq.toml | 1 + data/config/interface/screens/memoqueue.toml | 1 + .../config/interface/widgets/recognition.toml | 1 + data/config/providers/tts/edgetts.toml | 24 + data/config/services/audio.toml | 8 + data/config/services/llm.toml | 5 + data/config/services/sync.toml | 6 + data/config/services/timer.toml | 3 + data/config/services/tts.toml | 6 + data/repo/cngk-t/algodata.json | 1438 ++++++++--------- src/heurams/context.py | 8 +- src/heurams/interface/__init__.py | 12 + src/heurams/interface/__main__.py | 2 +- src/heurams/interface/screens/dashboard.py | 6 +- src/heurams/interface/screens/favmgr.py | 2 +- src/heurams/interface/screens/memoqueue.py | 14 +- src/heurams/interface/screens/precache.py | 6 +- src/heurams/interface/screens/preparation.py | 6 +- src/heurams/interface/widgets/recognition.py | 2 +- src/heurams/kernel/algorithms/__init__.py | 6 +- .../kernel/algorithms/{fast0.py => nsp0.py} | 14 +- src/heurams/kernel/algorithms/sm15m.py | 2 +- src/heurams/kernel/particles/nucleon.py | 4 +- src/heurams/services/audio_service.py | 4 +- src/heurams/services/config copy.py | 127 ++ src/heurams/services/config.py | 181 +-- src/heurams/services/epath.py | 30 + src/heurams/services/exceptions.py | 4 + src/heurams/services/favorite_service.py | 2 +- src/heurams/services/timer.py | 6 +- src/heurams/services/tts_service.py | 4 +- 36 files changed, 1097 insertions(+), 917 deletions(-) delete mode 100644 data/config/data/config/config.toml create mode 100644 data/config/global.toml create mode 100644 data/config/interface/global.toml create mode 100644 data/config/interface/puzzles/cloze.toml create mode 100644 data/config/interface/puzzles/mcq.toml create mode 100644 data/config/interface/screens/memoqueue.toml create mode 100644 data/config/interface/widgets/recognition.toml create mode 100644 data/config/providers/tts/edgetts.toml create mode 100644 data/config/services/audio.toml create mode 100644 data/config/services/llm.toml create mode 100644 data/config/services/sync.toml create mode 100644 data/config/services/timer.toml create mode 100644 data/config/services/tts.toml rename src/heurams/kernel/algorithms/{fast0.py => nsp0.py} (86%) create mode 100644 src/heurams/services/config copy.py create mode 100644 src/heurams/services/epath.py create mode 100644 src/heurams/services/exceptions.py diff --git a/data/config/config.toml b/data/config/config.toml index 10f3d05..d737df1 100644 --- a/data/config/config.toml +++ b/data/config/config.toml @@ -1,32 +1,31 @@ -# [调试] 将更改保存到文件 persist_to_file = 1 - -# [调试] 覆写时间, 设为 -1 以禁用 daystamp_override = -1 timestamp_override = -1 - -# [调试] 一键通过 quick_pass = true - -# [调试] 自动化测试模式(仅用于测试完整性) -auto_pass = true - -# 对于每个项目的默认新记忆原子数量 -scheduled_num = 100 - -# UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 -timezone_offset = +28800 # 中国标准时间 (UTC+8) - -[interface] - -[interface.memorizor] -autovoice = true # 自动语音播放, 仅限于 recognition 组件 +auto_pass = false +scheduled_num = 420 +timezone_offset = 28800 [algorithm] -# default = "SM-2" # 主要算法; 可选项: SM-2, SM-15M, FSRS, FAST-0 -default = 'FAST-0' +default = "FAST-0" -[puzzles] # 谜题默认配置 +[paths] +data = "./data" +cache = "./data/cache" +config = "./data/config" +global = "./data/global" +repo = "./data/repo" + +[services] +audio = "playsound" +tts = "edgetts" +llm = "openai" +sync = "webdav" + +[sync] + +[interface.memorizor] +autovoice = true [puzzles.mcq] max_riddles_num = 2 @@ -34,30 +33,16 @@ max_riddles_num = 2 [puzzles.cloze] min_denominator = 3 -[paths] # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 -data = "./data" -cache = "./data/cache" -config = "./data/config" -global = "./data/global" -repo = "./data/repo" -[services] # 定义服务到提供者的映射 -audio = "playsound" # 可选项: playsound(通用), termux(仅用于支持 Android Termux), mpg123(TODO) -tts = "edgetts" # 可选项: edgetts -llm = "openai" # 可选项: openai -sync = "webdav" # 可选项: 留空, webdav +[providers.tts.edgetts] +voice = "zh-CN-XiaoxiaoNeural" -[providers.tts.edgetts] # EdgeTTS 设置 -voice = "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - -[providers.llm.openai] # 与 OpenAI 相容的语言模型接口服务设置 +[providers.llm.openai] url = "" key = "" -[providers.sync.webdav] # WebDAV 同步设置 +[providers.sync.webdav] url = "" username = "" password = "" remote_path = "/heurams/" verify_ssl = true - -[sync] diff --git a/data/config/data/config/config.toml b/data/config/data/config/config.toml deleted file mode 100644 index e69de29..0000000 diff --git a/data/config/global.toml b/data/config/global.toml new file mode 100644 index 0000000..74fc3ed --- /dev/null +++ b/data/config/global.toml @@ -0,0 +1,7 @@ +enable_built_in_interface = true + +[paths] +data = "./data" +cache = "./data/cache" +config = "./data/config" +repo = "./data/repo" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml new file mode 100644 index 0000000..ddf073e --- /dev/null +++ b/data/config/interface/global.toml @@ -0,0 +1,6 @@ +persist_to_file = true +quick_pass = true +auto_pass = false +scheduled_num = 420 +algorithm = "NSP-0" +_algorithm_candidate = [ "SM-2", "SM-15M", "FSRS", "NSP-0", "None",] diff --git a/data/config/interface/puzzles/cloze.toml b/data/config/interface/puzzles/cloze.toml new file mode 100644 index 0000000..74f917b --- /dev/null +++ b/data/config/interface/puzzles/cloze.toml @@ -0,0 +1 @@ +min_denominator = 3 diff --git a/data/config/interface/puzzles/mcq.toml b/data/config/interface/puzzles/mcq.toml new file mode 100644 index 0000000..b72b3dd --- /dev/null +++ b/data/config/interface/puzzles/mcq.toml @@ -0,0 +1 @@ +max_riddles_num = 2 diff --git a/data/config/interface/screens/memoqueue.toml b/data/config/interface/screens/memoqueue.toml new file mode 100644 index 0000000..cf80dfb --- /dev/null +++ b/data/config/interface/screens/memoqueue.toml @@ -0,0 +1 @@ +autovoice = true diff --git a/data/config/interface/widgets/recognition.toml b/data/config/interface/widgets/recognition.toml new file mode 100644 index 0000000..cf80dfb --- /dev/null +++ b/data/config/interface/widgets/recognition.toml @@ -0,0 +1 @@ +autovoice = true diff --git a/data/config/providers/tts/edgetts.toml b/data/config/providers/tts/edgetts.toml new file mode 100644 index 0000000..1ada64f --- /dev/null +++ b/data/config/providers/tts/edgetts.toml @@ -0,0 +1,24 @@ +voice = "zh-CN-XiaoxiaoNeural" + +[_voice_candidate] +zh-CN-XiaoxiaoNeural = "晓晓: 中文温柔女声" +zh-CN-XiaoyiNeural = "晓伊: 中文甜美女声" +zh-CN-XiaochenNeural = "晓辰: 中文知性女声" +zh-CN-XiaohanNeural = "晓涵: 中文优雅女声" +zh-CN-XiaomengNeural = "晓梦: 中文梦幻女声" +zh-CN-XiaomoNeural = "晓墨: 中文文艺女声" +zh-CN-XiaoqiuNeural = "晓秋: 中文成熟女声" +zh-CN-XiaoruiNeural = "晓睿: 中文智慧女声" +zh-CN-XiaoshuangNeural = "晓双: 中文活泼女声" +zh-CN-XiaoxuanNeural = "晓萱: 中文清新女声" +zh-CN-XiaoyanNeural = "晓颜: 中文柔美女声" +zh-CN-XiaoyouNeural = "晓悠: 中文悠扬女声" +zh-CN-XiaozhenNeural = "晓甄: 中文端庄女声" +zh-CN-YunxiNeural = "云希: 中文清朗男声" +zh-CN-YunyangNeural = "云扬: 中文阳光男声" +zh-CN-YunjianNeural = "云健: 中文稳重男声" +zh-CN-YunfengNeural = "云枫: 中文磁性男声" +zh-CN-YunhaoNeural = "云皓: 中文豪迈男声" +zh-CN-YunxiaNeural = "云夏: 中文热情男声" +zh-CN-YunyeNeural = "云野: 中文野性男声" +zh-CN-YunzeNeural = "云泽: 中文深沉男声" diff --git a/data/config/services/audio.toml b/data/config/services/audio.toml new file mode 100644 index 0000000..d1722d7 --- /dev/null +++ b/data/config/services/audio.toml @@ -0,0 +1,8 @@ +provider = "playsound" + +[_provider_candidate] +playsound = "python 跨平台音频系统" +termux = "Android Termux 音频系统" +mpg123 = "通用音频系统, 依赖系统 mpg123" +pulseaudio = "高级音频路由系统" +none = "不使用音频" diff --git a/data/config/services/llm.toml b/data/config/services/llm.toml new file mode 100644 index 0000000..5e9e971 --- /dev/null +++ b/data/config/services/llm.toml @@ -0,0 +1,5 @@ +provider = "openai" + +[_provider_candidate] +openai = "OpenAI 风格 API, 同时支持与其相容的模型服务 (如 deepseek)" +none = "不使用语言大模型" diff --git a/data/config/services/sync.toml b/data/config/services/sync.toml new file mode 100644 index 0000000..da9c57c --- /dev/null +++ b/data/config/services/sync.toml @@ -0,0 +1,6 @@ +provider = "webdav" + +[_provider_candidate] +webdav = "WebDAV 兼容网络文件系统 (包括 webdavs)" +official = "官方同步服务器" +none = "不使用同步服务器" diff --git a/data/config/services/timer.toml b/data/config/services/timer.toml new file mode 100644 index 0000000..69d414d --- /dev/null +++ b/data/config/services/timer.toml @@ -0,0 +1,3 @@ +daystamp_override = -1 +timestamp_override = -1 +timezone_offset = 28800 diff --git a/data/config/services/tts.toml b/data/config/services/tts.toml new file mode 100644 index 0000000..d2bf261 --- /dev/null +++ b/data/config/services/tts.toml @@ -0,0 +1,6 @@ +provider = "edgetts" + +[_provider_candidate] +edgetts = "微软神经网络语音合成, 依赖微软网络服务" +espeak = "低保真度本地语音合成" +none = "不使用文本转语音" diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json index 27df993..300550e 100644 --- a/data/repo/cngk-t/algodata.json +++ b/data/repo/cngk-t/algodata.json @@ -2,1441 +2,1441 @@ "临安春雨初霁": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4164822 + "last_modify": 1776577784.6136827 } }, "世味年来薄似纱, 谁令骑马客京华.": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4167655 + "last_modify": 1776577784.6139746 } }, "小楼一夜听春雨, 深巷明朝卖杏花.": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.417041 + "last_modify": 1776577784.6142678 } }, "矮纸斜行闲作草, 晴窗细乳戏分茶.": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4173286 + "last_modify": 1776577784.6145742 } }, "素衣莫起风尘叹, 犹及清明可到家.": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4176028 + "last_modify": 1776577784.6149702 } }, "书愤": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4178832 + "last_modify": 1776577784.6153867 } }, "早岁那知世事艰, 中原北望气如山": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.418158 + "last_modify": 1776577784.6157937 } }, "楼船夜雪瓜洲渡, 铁马秋风大散关": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.41845 + "last_modify": 1776577784.616204 } }, "塞上长城空自许, 镜中衰鬓已先斑": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.418725 + "last_modify": 1776577784.6166213 } }, "出师一表真名世, 千载谁堪伯仲间": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4190054 + "last_modify": 1776577784.6170292 } }, "五代史伶官传序": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4192874 + "last_modify": 1776577784.6174061 } }, "呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4195747 + "last_modify": 1776577784.6177616 } }, "原庄宗之所以得天下, 与其所以失之者, 可以知之矣": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4198568 + "last_modify": 1776577784.6181145 } }, "世言晋王之将终也, 以三矢赐庄宗而告之曰:": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4201329 + "last_modify": 1776577784.618471 } }, "梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4204254 + "last_modify": 1776577784.6188185 } }, "此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4207032 + "last_modify": 1776577784.619165 } }, "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之": { "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "efactor": 2.2199999999999998, + "real_rept": 4, + "rept": 2, + "interval": 13, + "last_date": 20562, + "next_date": 20575, "is_activated": 1, - "last_modify": 1776527873.420987 + "last_modify": 1776577784.6195261 } }, "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!": { "SM-2": { - "efactor": 2.5, - "real_rept": 2, + "efactor": 1.8599999999999997, + "real_rept": 4, "rept": 0, "interval": 1, - "last_date": 20561, - "next_date": 20562, + "last_date": 20562, + "next_date": 20563, "is_activated": 1, - "last_modify": 1776527873.4212651 + "last_modify": 1776577784.6198707 } }, "及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归": { "SM-2": { - "efactor": 2.5, - "real_rept": 2, + "efactor": 1.3, + "real_rept": 6, "rept": 0, "interval": 1, - "last_date": 20561, - "next_date": 20562, + "last_date": 20562, + "next_date": 20563, "is_activated": 1, - "last_modify": 1776527873.4215648 + "last_modify": 1776577784.6579466 } }, "至于誓天断发, 泣下沾襟, 何其衰也!": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20561, - "next_date": 20562, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20562, + "next_date": 20577, "is_activated": 1, - "last_modify": 1776527873.4218438 + "last_modify": 1776577784.6205814 } }, "岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6209705 } }, "《书》曰: 满招损, 谦得益.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6213555 } }, "忧劳可以兴国, 逸豫可以亡身, 自然之理也": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.621733 } }, "故方其盛也, 举天下之豪杰, 莫能与之争;": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6221194 } }, "及其衰也, 数十伶人困之, 而身死国灭, 为天下笑": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6225028 } }, "夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6228793 } }, "六国论": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.623255 } }, "六国破灭, 非兵不利, 战不善, 弊在赂秦.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6236465 } }, "赂秦而力亏, 破灭之道也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6240213 } }, "或曰: 六国互丧, 率赂秦耶?": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6244063 } }, "曰: 不赂者以赂者丧.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.624782 } }, "盖失强援, 不能独完.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6251616 } }, "故曰: 弊在赂秦也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6255794 } }, "秦以攻取之外, 小则获邑, 大则得城.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6259894 } }, "较秦之所得, 与战胜而得者, 其实百倍;": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6264102 } }, "诸侯之所亡, 与战败而亡者, 其实亦百倍.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.626829 } }, "则秦之所大欲, 诸侯之所大患, 固不在战矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6272392 } }, "思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6276643 } }, "子孙视之不甚惜, 举以予人, 如弃草芥.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.628089 } }, "今日割五城, 明日割十城, 然后得一夕安寝.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6285114 } }, "起视四境, 而秦兵又至矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6289263 } }, "然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6293442 } }, "故不战而强弱胜负已判矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.629762 } }, "至于颠覆, 理固宜然.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.630174 } }, "古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.630577 } }, "此言得之.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6308808 } }, "齐人未尝赂秦, 终继五国迁灭, 何哉?": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6311781 } }, "与嬴而不助五国也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.63148 } }, "五国既丧, 齐亦不免矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.631776 } }, "燕赵之君, 始有远略, 能守其土, 义不赂秦.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6320646 } }, "是故燕虽小国而后亡, 斯用兵之效也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6323593 } }, "至丹以荆卿为计, 始速祸焉.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6326425 } }, "赵尝五战于秦, 二败而三胜.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6329288 } }, "后秦击赵者再, 李牧连却之.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6332211 } }, "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6336164 } }, "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.633949 } }, "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6342893 } }, "则胜负之数, 存亡之理, 当与秦相较, 或未易量.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6346242 } }, "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.634954 } }, "则吾恐秦人食之不得下咽也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6352873 } }, "悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6356177 } }, "为国者无使为积威之所劫哉!": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6359751 } }, "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 4, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6582904 } }, "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6367347 } }, "劝学": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.637102 } }, "君子曰: 学不可以已.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6374843 } }, "青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6378508 } }, "木直中绳, 𫐓以为轮, 其曲中规.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6382143 } }, "虽有槁暴, 不复挺者, 𫐓使之然也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6385686 } }, "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.638898 } }, "吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6393514 } }, "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6398017 } }, "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6402524 } }, "君子生非异也, 善假于物也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6406782 } }, "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6410484 } }, "故不积跬步, 无以至千里; 不积小流, 无以成江海.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6414237 } }, "骐骥一跃, 不能十步; 驽马十驾, 功在不舍.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.641818 } }, "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 4, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6586235 } }, "蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.642687 } }, "蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6429799 } }, "声声慢·寻寻觅觅": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6432714 } }, "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6436827 } }, "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 4, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6589534 } }, "大道之行也": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6444263 } }, "大道之行也, 天下为公.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6447709 } }, "选贤与能, 讲信修睦.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6451163 } }, "故人不独亲其亲, 不独子其子.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6454694 } }, "使老有所终, 壮有所用, 幼有所长.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6458526 } }, "矜寡孤独废疾者皆有所养.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6462154 } }, "男有分, 女有归.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6465893 } }, "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6469772 } }, "是故谋闭不兴, 盗窃乱贼而不作.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.647417 } }, "故外户而不闭, 是谓大同.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6477902 } }, "客至": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.64818 } }, "舍南舍北皆春水, 但见群鸥日日来.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.648559 } }, "花径不曾缘客扫, 蓬门今始为君开.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6489382 } }, "盘飧市远无兼味, 樽酒家贫只旧醅.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6493144 } }, "肯与邻翁相对饮, 隔篱呼取尽余杯.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6496823 } }, "将进酒": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6500533 } }, "君不见, 黄河之水天上来, 奔流到海不复回.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6504254 } }, "君不见, 高堂明镜悲白发, 朝如青丝暮成雪!": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6507947 } }, "人生得意须尽欢, 莫使金樽空对月.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6511571 } }, "天生我材必有用, 千金散尽还复来.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.651622 } }, "烹羊宰牛且为乐, 会须一饮三百杯.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6520529 } }, "岑夫子, 丹丘生, 将进酒, 杯莫停.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6524749 } }, "与君歌一曲, 请君为我倾耳听.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6528883 } }, "钟鼓馔玉不足贵, 但愿长醉不复醒.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6533206 } }, "古来圣贤皆寂寞, 惟有饮者留其名.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6536992 } }, "陈王昔时宴平乐, 斗酒十千恣欢谑.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6540747 } }, "主人何为言少钱, 径须沽取对君酌.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6545231 } }, "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6548157 } }, "屈原列传": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6551015 } }, "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6554022 } }, "离骚者, 犹离忧也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6556945 } }, "夫天者, 人之始也; 父母者, 人之本也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6559892 } }, "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.656302 } }, "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6566348 } }, "信而见疑, 忠而被谤, 能无怨乎?": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.656969 } }, "屈平之作《离骚》, 盖自怨生也.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.6573117 } }, "《国风》好色而不淫, 《小雅》怨诽而不乱.": { "SM-2": { "efactor": 2.5, - "real_rept": 0, + "real_rept": 2, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 + "interval": 1, + "last_date": 20562, + "next_date": 20563, + "is_activated": 1, + "last_modify": 1776577784.657641 } }, "若《离骚》者, 可谓兼之矣.": { diff --git a/src/heurams/context.py b/src/heurams/context.py index c4c7af8..bd30f6a 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -6,7 +6,7 @@ import pathlib from contextvars import ContextVar -from heurams.services.config import ConfigFile +from heurams.services.config import ConfigDict from heurams.services.logger import get_logger # 默认数据目录, 以包目录下的 data 为准 @@ -24,9 +24,9 @@ logger.debug(f"工作目录: {workdir}") (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) -config_var: ContextVar[ConfigFile].get = ContextVar( +config_var: ContextVar[ConfigDict].get = ContextVar( "config_var", - default=ConfigFile(workdir / "data" / "config" / "config.toml"), + default=ConfigDict(workdir / "data" / "config"), ) """配置对象的全局引用对象.""" @@ -41,7 +41,7 @@ class ConfigContext: >>> get_daystamp() # 恢复原配置 """ - def __init__(self, config_provider: ConfigFile): + def __init__(self, config_provider: ConfigDict): self.config_provider = config_provider self._token = None diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index f02130e..faf1895 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -59,3 +59,15 @@ class HeurAMSApp(App): def action_do_nothing(self): self.refresh() + + # 移除烦人的 "rich traceback" + # Textual 官方不会管这破事, 写 Rich 写入脑了导致的 + # 不知道哪来的自信改标准库的 traceback + # https://github.com/Textualize/textual/discussions/6255 + def _fatal_error(self): + self._close_messages_no_wait() + raise self._exception + + def panic(self, *args): + self._close_messages_no_wait() + raise self._exception \ No newline at end of file diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 3600fe7..209f0a3 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -10,7 +10,7 @@ def environment_check(): logger.debug("检查环境路径") subdir = ["cache/voice", "repo", "global", "config"] for i in subdir: - i = Path(config_var.get()["paths"]["data"]) / i + i = Path(config_var.get()["global"]["paths"]["data"]) / i if not i.exists(): logger.info("创建目录: %s", i) print(f"创建 {i}") diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 6b6ea10..30889bf 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -58,8 +58,8 @@ class DashboardScreen(Screen): Label( f"当前 UNIX 日时间戳: {timer.get_daystamp()}" ), - Label(f"应用时区修正: UTC+{config_var.get()['timezone_offset'] / 3600}"), - Label(f"全局算法设置: {config_var.get()['algorithm']['default']}: {algorithms[config_var.get()['algorithm']['default']].desc}"), + Label(f"应用时区修正: UTC+{config_var.get()['services']['timer']['timezone_offset'] / 3600}"), + Label(f"全局算法设置: {config_var.get()['interface']['global']['algorithm']}: {algorithms[config_var.get()['interface']['global']['algorithm']].desc}"), classes="column infview", ), Vertical( @@ -78,7 +78,7 @@ class DashboardScreen(Screen): def _load_data(self): self.repo_dirs = Repo.probe_valid_repos_in_dir( - Path(config_var.get()["paths"]["data"]) / "repo" + Path(config_var.get()['global']["paths"]["data"]) / "repo" ) for repo_dir in self.repo_dirs: repo = Repo.create_from_repodir(repo_dir) diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index b90a957..4635cd4 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -115,7 +115,7 @@ class FavoriteManagerScreen(Screen): def _get_repo_info(self, repo_path: str, fav: FavoriteItem) -> Optional[dict]: """获取仓库信息(标题、原子内容预览)""" try: - data_repo = Path(config_var.get()["paths"]["data"]) / "repo" + data_repo = Path(config_var.get()['global']["paths"]["data"]) / "repo" repo_dir = data_repo / repo_path if not repo_dir.exists(): logger.warning("仓库目录不存在: %s", repo_dir) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index afab256..1d7c877 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -38,7 +38,7 @@ class MemScreen(Screen): ("0,1,2,3", "app.push_screen('about')", ""), ] - if config_var.get()["quick_pass"]: + if config_var.get()['interface']['global']["quick_pass"]: BINDINGS.append(("k", "quick_pass", "正确应答")) BINDINGS.append(("f", "quick_fail", "错误应答")) rating = reactive(-1) @@ -93,7 +93,7 @@ class MemScreen(Screen): if self.repo is not None: fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" s += f"收藏: {fav_status}\n" - if config_var.get().get("debug_topline", 0): + '''if config_var.get().get("debug_topline", 0): try: alia = self.fission.get_current_puzzle_inf()["alia"] # type: ignore s += f"谜题: {alia}\n" @@ -113,7 +113,7 @@ class MemScreen(Screen): stat = self.fission.__repr__("simple", "") s += f"{stat}\n" except Exception as e: - s = str(e) + s = str(e)''' s += f"进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s @@ -139,9 +139,9 @@ class MemScreen(Screen): i.remove() from heurams.interface.widgets.finished import Finished - if config_var.get().get("persist_to_file", 0): + if config_var.get()['interface']['global']["persist_to_file"]: self.save_func() - container.mount(Finished(is_saved=config_var.get().get("persist_to_file", 0))) + container.mount(Finished(is_saved=['interface']['global']["persist_to_file"])) def on_button_pressed(self, event): event.stop() @@ -156,7 +156,7 @@ class MemScreen(Screen): from heurams.services.audio_service import play_by_path from heurams.services.hasher import get_md5 - path = Path(config_var.get()["paths"]["data"]) / "cache" / "voice" + path = Path(config_var.get()['global']["paths"]["data"]) / "cache" / "voice" path = path / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" if path.exists(): play_by_path(path) @@ -226,7 +226,7 @@ class MemScreen(Screen): return "" # self.repo.source 是 Path 对象,指向仓库目录 repo_full_path = self.repo.source - data_repo_path = Path(config_var.get()["paths"]["data"]) / "repo" + data_repo_path = Path(config_var.get()['global']["paths"]["data"]) / "repo" try: rel_path = repo_full_path.relative_to(data_repo_path) return str(rel_path) diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 422f738..4b3d055 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -13,7 +13,7 @@ import heurams.services.hasher as hasher from heurams.context import * # 兼容性缓存路径:优先使用 paths.cache,否则使用 data/cache -paths = config_var.get()["paths"] +paths = config_var.get()['global']["paths"] cache_dir = pathlib.Path(paths.get("cache", paths["data"] + "/cache")) / "voice" @@ -61,7 +61,7 @@ class PrecachingScreen(Screen): """获取所有仓库的总单元数""" from heurams.context import config_var from heurams.kernel.repolib import Repo - repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / "repo" + repo_path = pathlib.Path(config_var.get()['global']["paths"]["data"]) / "repo" repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) repos = map(Repo.create_from_repodir, repo_dirs) total = 0 @@ -230,7 +230,7 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir from heurams.kernel.repolib import Repo - repo_path = pathlib.Path(config_var.get()["paths"]["data"]) / "repo" + repo_path = pathlib.Path(config_var.get()['global']["paths"]["data"]) / "repo" repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) repos = map(Repo.create_from_repodir, repo_dirs) diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 3ae7459..3a151a8 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -28,7 +28,7 @@ class PreparationScreen(Screen): ("0,1,2,3", "app.push_screen('about')", ""), ] - scheduled_num = reactive(config_var.get()["scheduled_num"]) + scheduled_num = reactive(config_var.get()['interface']['global']["scheduled_num"]) def __init__(self, repo: Repo, repostat: dict) -> None: super().__init__(name=None, id=None, classes=None) @@ -41,7 +41,7 @@ class PreparationScreen(Screen): with ScrollableContainer(id="vice_container"): yield Label(f"准备就绪: [b]{self.repostat['title']}[/b]\n") yield Label( - f"仓库路径: {config_var.get()['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]" + f"仓库路径: {config_var.get()['global']['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]" ) yield Label(f"\n单元数量: {len(self.repo)}\n") yield Label(f"最小记忆分组: {self.scheduled_num}\n", id="schnum_label") @@ -130,7 +130,7 @@ class PreparationScreen(Screen): def launch(repo, app, scheduled_num): if scheduled_num == -1: - scheduled_num = config_var.get()["scheduled_num"] + scheduled_num = config_var.get()['interface']['global']["scheduled_num"] atoms = list() for i in repo.ident_index: n = pt.Nucleon.create_on_nucleonic_data( diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 67f6091..0162519 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -51,7 +51,7 @@ class Recognition(BasePuzzleWidget): def compose(self): from heurams.context import config_var - autovoice = config_var.get()["interface"]["memorizor"]["autovoice"] + autovoice = config_var.get()["interface"]["widgets"]["autovoice"] if autovoice: self.screen.action_play_voice() # type: ignore cfg: RecognitionConfig = self.atom.registry["nucleon"]["puzzles"][self.alia] diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index 5114ed8..2161012 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -1,18 +1,18 @@ from .base import BaseAlgorithm from .sm2 import SM2Algorithm from .sm15m import SM15MAlgorithm -from .fast0 import FAST0Algorithm +from .nsp0 import NSP0Algorithm __all__ = [ "SM2Algorithm", "BaseAlgorithm", "SM15MAlgorithm", - "FAST0Algorithm", + "NSP0Algorithm", ] algorithms = { "SM-2": SM2Algorithm, - "FAST-0": FAST0Algorithm, + "NSP-0": NSP0Algorithm, "SM-15M": SM15MAlgorithm, "Base": BaseAlgorithm, } diff --git a/src/heurams/kernel/algorithms/fast0.py b/src/heurams/kernel/algorithms/nsp0.py similarity index 86% rename from src/heurams/kernel/algorithms/fast0.py rename to src/heurams/kernel/algorithms/nsp0.py index 4548b17..752a833 100644 --- a/src/heurams/kernel/algorithms/fast0.py +++ b/src/heurams/kernel/algorithms/nsp0.py @@ -8,8 +8,8 @@ from .base import BaseAlgorithm logger = get_logger(__name__) -class FAST0Algorithm(BaseAlgorithm): - algo_name = "FAST-0" +class NSP0Algorithm(BaseAlgorithm): + algo_name = "NSP-0" desc = '快速筛选用特殊调度器' class AlgodataDict(TypedDict): real_rept: int @@ -36,7 +36,7 @@ class FAST0Algorithm(BaseAlgorithm): def revisor( cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False ): - """FAST-0 算法迭代决策机制实现 + """NSP-0 算法迭代决策机制实现 根据 quality(0 ~ 5) 进行参数迭代最佳间隔 quality 由主程序评估 @@ -44,7 +44,7 @@ class FAST0Algorithm(BaseAlgorithm): quality (int): 记忆保留率量化参数 """ logger.debug( - "FAST0.revisor 开始, feedback: %d, is_new_activation: %s", + "NSP0.revisor 开始, feedback: %d, is_new_activation: %s", feedback, is_new_activation, ) @@ -71,7 +71,7 @@ class FAST0Algorithm(BaseAlgorithm): def is_due(cls, algodata): result = algodata[cls.algo_name]["next_date"] <= timer.get_daystamp() logger.debug( - "FAST0.is_due: next_date=%d, current_daystamp=%d, result=%s", + "NSP0.is_due: next_date=%d, current_daystamp=%d, result=%s", algodata[cls.algo_name]["next_date"], timer.get_daystamp(), result, @@ -81,11 +81,11 @@ class FAST0Algorithm(BaseAlgorithm): @classmethod def get_rating(cls, algodata): efactor = algodata[cls.algo_name]["efactor"] - logger.debug("FAST0.rate: efactor=%f", efactor) + logger.debug("NSP0.rate: efactor=%f", efactor) return str(efactor) @classmethod def nextdate(cls, algodata) -> int: next_date = algodata[cls.algo_name]["next_date"] - logger.debug("FAST0.nextdate: %d", next_date) + logger.debug("NSP0.nextdate: %d", next_date) return next_date diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index a909d58..83fa9e8 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -27,7 +27,7 @@ from heurams.kernel.algorithms.sm15m_calc import ( # 全局状态文件路径 _GLOBAL_STATE_FILE = os.path.expanduser( - pathlib.Path(config_var.get()["paths"]["data"]) + pathlib.Path(config_var.get()['global']["paths"]["data"]) / "global" / "sm15m_global_state.json" ) diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 9015be7..17affdb 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -19,14 +19,14 @@ class Nucleon: data_safe['puzzles'] = {} env = { "payload": data_safe, - "default": config_var.get()["puzzles"], + "default": config_var.get()['interface']["puzzles"], "nucleon": data_safe, } self.evalizer = Evalizer(environment=env) data_safe = self.evalizer(deepcopy(data_safe)) env = { "payload": data_safe, - "default": config_var.get()["puzzles"], + "default": config_var.get()['interface']["puzzles"], "nucleon": data_safe, } self.evalizer = Evalizer(environment=env) diff --git a/src/heurams/services/audio_service.py b/src/heurams/services/audio_service.py index 7693156..4eefd11 100644 --- a/src/heurams/services/audio_service.py +++ b/src/heurams/services/audio_service.py @@ -7,7 +7,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -play_by_path: Callable = prov[config_var.get()["services"]["audio"]].play_by_path +play_by_path: Callable = prov[config_var.get()["services"]["audio"]['provider']].play_by_path logger.debug( - "音频服务初始化完成, 使用 Provider: %s", config_var.get()["services"]["audio"] + "音频服务初始化完成, 使用 Provider: %s", config_var.get()["services"]["audio"]['provider'] ) diff --git a/src/heurams/services/config copy.py b/src/heurams/services/config copy.py new file mode 100644 index 0000000..e0c6b12 --- /dev/null +++ b/src/heurams/services/config copy.py @@ -0,0 +1,127 @@ +"""配置文件服务""" +import pathlib +import typing + +import toml + +from heurams.services.logger import get_logger + +default_config = { + "persist_to_file": 1, # 将更改保存到文件 + "daystamp_override": -1, # 覆写时间, 设为 -1 以禁用 + "timestamp_override": -1, # 覆写时间, 设为 -1 以禁用 + "quick_pass": 1, # 启用用于测试的快速通过 + "scheduled_num": 8, # 对于每个项目的默认新记忆原子数量 + "timezone_offset": 28800, # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 + # 28800 是中国标准时间 (UTC+8) + + "interface": { + "memorizor": { + "autovoice": True # 自动语音播放, 仅限于 recognition 组件 + } + }, + + "algorithm": { + "default": "SM-2" # 主要算法 + # 可选项: SM-2, SM-15M, FSRS + }, + + "puzzles": { # 谜题默认配置 + "mcq": { + "max_riddles_num": 2 + }, + "cloze": { + "min_denominator": 3 + } + }, + + "paths": { # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 + "data": "./data" + }, + + "services": { # 定义服务到提供者的映射 + "audio": "playsound", # 可选项: playsound(通用), termux(仅用于 Android Termux), mpg123(TODO) + "tts": "edgetts", # 可选项: edgetts + "llm": "openai", # 可选项: openai + "sync": "webdav" # 可选项: 留空, webdav + }, + + "providers": { + "tts": { + "edgetts": { # EdgeTTS 设置 + "voice": "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) + } + }, + "llm": { + "openai": { # 与 OpenAI 相容的语言模型接口服务设置 + "url": "", + "key": "" + } + }, + "sync": { + "webdav": { # WebDAV 同步设置 + "url": "", + "username": "", + "password": "", + "remote_path": "/heurams/", + "verify_ssl": True + } + } + }, +} + +class ConfigFile: + def __init__(self, path: pathlib.Path): + self.logger = get_logger(__name__) + self.path = path + self.data = dict() + if not self.path.exists(): + self.path.touch() + self.logger.debug("创建配置文件: %s", self.path) + self.data = default_config + self.valid_configfile = 1 + # 考虑到可能临时编辑格式错误, 所以不覆写格式错误的配置文件, 而是提示损坏并使用默认配置 + self._load() + + def _load(self): + """从文件加载配置数据""" + with open(self.path, "r") as f: + try: + self.data = toml.load(f) + self.logger.debug("配置文件加载成功: %s", self.path) + except toml.TomlDecodeError as e: + print(f"{e}") + self.logger.error("TOML解析错误: %s", e) + self.data = default_config + self.valid_configfile = 0 + + def modify(self, key: str, value: typing.Any): + """修改配置值并保存""" + self.data[key] = value + self.logger.debug("修改配置项: %s = %s", key, value) + self.save() + + def save(self, path: typing.Union[str, pathlib.Path] = ""): + """保存配置到文件""" + if self.valid_configfile: + save_path = pathlib.Path(path) if path else self.path + with open(save_path, "w") as f: + toml.dump(self.data, f) + self.logger.debug("配置文件已保存: %s", save_path) + else: + pass + + def get(self, key: str, default: typing.Any = None) -> typing.Any: + """获取配置值, 如果不存在返回默认值""" + return self.data.get(key, default) + + def __getitem__(self, key: str) -> typing.Any: + return self.data[key] + + def __setitem__(self, key: str, value: typing.Any): + self.data[key] = value + self.save() + + def __contains__(self, key: str) -> bool: + """支持 in 语法""" + return key in self.data diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index e0c6b12..7755bb3 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -1,127 +1,80 @@ -"""配置文件服务""" import pathlib import typing import toml +from collections import UserDict +import atexit from heurams.services.logger import get_logger +from heurams.services.exceptions import WTFException -default_config = { - "persist_to_file": 1, # 将更改保存到文件 - "daystamp_override": -1, # 覆写时间, 设为 -1 以禁用 - "timestamp_override": -1, # 覆写时间, 设为 -1 以禁用 - "quick_pass": 1, # 启用用于测试的快速通过 - "scheduled_num": 8, # 对于每个项目的默认新记忆原子数量 - "timezone_offset": 28800, # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 - # 28800 是中国标准时间 (UTC+8) - - "interface": { - "memorizor": { - "autovoice": True # 自动语音播放, 仅限于 recognition 组件 - } - }, - - "algorithm": { - "default": "SM-2" # 主要算法 - # 可选项: SM-2, SM-15M, FSRS - }, - - "puzzles": { # 谜题默认配置 - "mcq": { - "max_riddles_num": 2 - }, - "cloze": { - "min_denominator": 3 - } - }, - - "paths": { # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 - "data": "./data" - }, - - "services": { # 定义服务到提供者的映射 - "audio": "playsound", # 可选项: playsound(通用), termux(仅用于 Android Termux), mpg123(TODO) - "tts": "edgetts", # 可选项: edgetts - "llm": "openai", # 可选项: openai - "sync": "webdav" # 可选项: 留空, webdav - }, - - "providers": { - "tts": { - "edgetts": { # EdgeTTS 设置 - "voice": "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - } - }, - "llm": { - "openai": { # 与 OpenAI 相容的语言模型接口服务设置 - "url": "", - "key": "" - } - }, - "sync": { - "webdav": { # WebDAV 同步设置 - "url": "", - "username": "", - "password": "", - "remote_path": "/heurams/", - "verify_ssl": True - } - } - }, -} - -class ConfigFile: - def __init__(self, path: pathlib.Path): +# 我们的流程是: 找到文件名: 返回文件名里头的数据; 找不到: 继续查索引; 所以 self.data 除了存本级各种索引球用没得 +# 递归就是这么吊 +class ConfigDict(UserDict): # 舒服了 + def __init__(self, config_path: pathlib.Path, dict = None): # 需要自己把自己提起来 + if dict: + raise WTFException("不要放默认值...") + super().__init__(dict) self.logger = get_logger(__name__) - self.path = path - self.data = dict() - if not self.path.exists(): - self.path.touch() - self.logger.debug("创建配置文件: %s", self.path) - self.data = default_config - self.valid_configfile = 1 - # 考虑到可能临时编辑格式错误, 所以不覆写格式错误的配置文件, 而是提示损坏并使用默认配置 - self._load() - - def _load(self): - """从文件加载配置数据""" - with open(self.path, "r") as f: - try: - self.data = toml.load(f) - self.logger.debug("配置文件加载成功: %s", self.path) - except toml.TomlDecodeError as e: - print(f"{e}") - self.logger.error("TOML解析错误: %s", e) - self.data = default_config - self.valid_configfile = 0 - - def modify(self, key: str, value: typing.Any): - """修改配置值并保存""" - self.data[key] = value - self.logger.debug("修改配置项: %s = %s", key, value) - self.save() - - def save(self, path: typing.Union[str, pathlib.Path] = ""): - """保存配置到文件""" - if self.valid_configfile: - save_path = pathlib.Path(path) if path else self.path - with open(save_path, "w") as f: - toml.dump(self.data, f) - self.logger.debug("配置文件已保存: %s", save_path) + self.path = config_path + self.is_dir = self.path.is_dir() + if self.is_dir: + self.update_index() # 狗儿要唱狗儿歌 else: - pass + with open(self.path, 'r+') as f: #TODO: 给这个做缓存 + try: + self.data = toml.load(f) + except: + self.data = {} + self.persist = lambda: False # 不修改错误的配置文件 + + def __getitem__(self, key): + # 我们实现了先进的懒狗加载 + value = super().__getitem__(key) + if isinstance(value, pathlib.Path): + return ConfigDict(value) + return value - def get(self, key: str, default: typing.Any = None) -> typing.Any: - """获取配置值, 如果不存在返回默认值""" - return self.data.get(key, default) + def converter(self, s): + if (self.path / s).exists: + return self.path / s + return self.path / s+'.toml' - def __getitem__(self, key: str) -> typing.Any: - return self.data[key] + def __contains__(self, key): + if isinstance(key, str): + key = self.converter(key) + return super().__contains__(key) - def __setitem__(self, key: str, value: typing.Any): - self.data[key] = value - self.save() + def __setitem__(self, key, value): + if isinstance(key, str): + key = self.converter(key) + origvalue = super().__getitem__(key) # 所以你不该访问不存在的对象 + if isinstance(origvalue, ConfigDict): + if origvalue.path.is_dir(): + raise WTFException("你怎么能变更目录配置的内容呢?!") + else: + # 对文件, 我们允许这种覆写存在 + # 但是不准变类型 + origvalue.data = value + super().__setitem__(key, value) - def __contains__(self, key: str) -> bool: - """支持 in 语法""" - return key in self.data + def update_index(self): # 如果有人没事干在config里面创建指向config的符号链接 这玩意会崩溃 但是不要修复: 需要这个符号链接特性 + for i in self.path.iterdir(): + if i.is_dir(): + self.data[i.name] = i + else: + if i.suffix == '.toml': + self.data[i.stem] = i + else: + self.logger.log(f"配置目录中有无效的文件 {i.stem}") # what's up bro + + def persist(self): + if self.is_dir: + raise WTFException("不准这样浪费性能...") + + with open(self.path, 'w+') as f: + toml.dump(self.data, f) + + def __del__(self): + if not self.is_dir: + self.persist() # 不准循环引用, 懂了吧 \ No newline at end of file diff --git a/src/heurams/services/epath.py b/src/heurams/services/epath.py new file mode 100644 index 0000000..e95d6ee --- /dev/null +++ b/src/heurams/services/epath.py @@ -0,0 +1,30 @@ +def epath(dct, path: str = '', default=None, parents=False): + if not path: + return dct + + path = path.rstrip('/') + target = dct + + for i in path.split('/'): + # 处理字典键 + if isinstance(target, dict) and i in target: + target = target[i] + # 处理列表索引 + elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): + idx = int(i[1:-1]) + if 0 <= idx < len(target): + target = target[idx] + elif parents: + while len(target) <= idx: + target.append(None) + target[idx] = {} + target = target[idx] + else: + return default + elif parents: + target[i] = {} + target = target[i] + else: + return default + + return target \ No newline at end of file diff --git a/src/heurams/services/exceptions.py b/src/heurams/services/exceptions.py new file mode 100644 index 0000000..3708473 --- /dev/null +++ b/src/heurams/services/exceptions.py @@ -0,0 +1,4 @@ +from heurams.services.logger import get_logger + +class WTFException(Exception): + pass \ No newline at end of file diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py index a925a34..e0939e4 100644 --- a/src/heurams/services/favorite_service.py +++ b/src/heurams/services/favorite_service.py @@ -63,7 +63,7 @@ class FavoriteManager: def _get_file_path(self) -> Path: """获取收藏文件路径""" - config_path = Path(config_var.get()["paths"]["data"]) + config_path = Path(config_var.get()['global']["paths"]["data"]) fav_path = config_path / "global" / "favorites.json" fav_path.parent.mkdir(parents=True, exist_ok=True) return fav_path diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index 91bd55a..ec52336 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -9,12 +9,12 @@ logger = get_logger(__name__) def get_daystamp() -> int: """获取当前日戳(以天为单位的整数时间戳)""" - time_override = config_var.get().get("daystamp_override", -1) + time_override = config_var.get()['services']["timer"]["daystamp_override"] if time_override != -1: logger.debug("使用覆盖的日戳: %d", time_override) return int(time_override) - result = int((time.time() + config_var.get().get("timezone_offset")) // (24 * 3600)) + result = int((time.time() + config_var.get()['services']["timer"]["timezone_offset"]) // (24 * 3600)) logger.debug("计算日戳: %d", result) return result @@ -22,7 +22,7 @@ def get_daystamp() -> int: def get_timestamp() -> float: """获取 UNIX 时间戳""" # 搞这个类的原因是要支持可复现操作 - time_override = config_var.get().get("timestamp_override", -1) + time_override = config_var.get()['services']["timer"]["timestamp_override"] if time_override != -1: logger.debug("使用覆盖的时间戳: %f", time_override) return float(time_override) diff --git a/src/heurams/services/tts_service.py b/src/heurams/services/tts_service.py index 0c582f5..71d4524 100644 --- a/src/heurams/services/tts_service.py +++ b/src/heurams/services/tts_service.py @@ -7,7 +7,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -convertor: Callable = prov[config_var.get()["services"]["tts"]].convert +convertor: Callable = prov[config_var.get()['services']["tts"]["provider"]].convert logger.debug( - "TTS 服务初始化完成, 使用 provider: %s", config_var.get()["services"]["tts"] + "TTS 服务初始化完成, 使用 provider: %s", config_var.get()['services']["tts"]["provider"] ) From 4a4237acbdd85a466a8d9345f308c7ccc271c1e2 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 01:46:40 +0800 Subject: [PATCH 33/79] =?UTF-8?q?style:=20=E5=88=A0=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/config.toml | 48 ------------------------------------ data/data/config/config.toml | 0 2 files changed, 48 deletions(-) delete mode 100644 data/config/config.toml delete mode 100644 data/data/config/config.toml diff --git a/data/config/config.toml b/data/config/config.toml deleted file mode 100644 index d737df1..0000000 --- a/data/config/config.toml +++ /dev/null @@ -1,48 +0,0 @@ -persist_to_file = 1 -daystamp_override = -1 -timestamp_override = -1 -quick_pass = true -auto_pass = false -scheduled_num = 420 -timezone_offset = 28800 - -[algorithm] -default = "FAST-0" - -[paths] -data = "./data" -cache = "./data/cache" -config = "./data/config" -global = "./data/global" -repo = "./data/repo" - -[services] -audio = "playsound" -tts = "edgetts" -llm = "openai" -sync = "webdav" - -[sync] - -[interface.memorizor] -autovoice = true - -[puzzles.mcq] -max_riddles_num = 2 - -[puzzles.cloze] -min_denominator = 3 - -[providers.tts.edgetts] -voice = "zh-CN-XiaoxiaoNeural" - -[providers.llm.openai] -url = "" -key = "" - -[providers.sync.webdav] -url = "" -username = "" -password = "" -remote_path = "/heurams/" -verify_ssl = true diff --git a/data/data/config/config.toml b/data/data/config/config.toml deleted file mode 100644 index e69de29..0000000 From b3f95861f099564ec20d77ebf1ee247d274601a0 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 03:33:05 +0800 Subject: [PATCH 34/79] =?UTF-8?q?feat(interface):=20=E5=9B=BE=E5=BD=A2?= =?UTF-8?q?=E5=8C=96=E8=AE=BE=E7=BD=AE=E9=A1=B5=E5=8E=9F=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/test.toml | 4 + src/heurams/interface/__init__.py | 3 +- src/heurams/interface/screens/navigator.py | 2 +- src/heurams/interface/screens/setting.py | 116 +++++++++++++++++++ src/heurams/services/config copy.py | 127 --------------------- src/heurams/services/config.py | 13 ++- src/heurams/services/epath.py | 12 +- src/heurams/services/textproc.py | 6 + 8 files changed, 146 insertions(+), 137 deletions(-) create mode 100644 data/config/test.toml create mode 100644 src/heurams/interface/screens/setting.py delete mode 100644 src/heurams/services/config copy.py diff --git a/data/config/test.toml b/data/config/test.toml new file mode 100644 index 0000000..f41c16b --- /dev/null +++ b/data/config/test.toml @@ -0,0 +1,4 @@ +[aa.bb] +str = "sq" +boolean = true +int = 123 diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index faf1895..e52cdc9 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -20,6 +20,7 @@ from .screens.about import AboutScreen from .screens.dashboard import DashboardScreen from .screens.navigator import NavigatorScreen from .screens.precache import PrecachingScreen +from .screens.setting import SettingScreen from .screens.synctool import SyncScreen _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -44,7 +45,7 @@ class HeurAMSApp(App): "synctool": SyncScreen, "about": AboutScreen, "navigator": NavigatorScreen, -# "config": ConfigScreen, + "setting": SettingScreen, } def on_mount(self) -> None: diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index cd4907c..b8e3d90 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -27,7 +27,7 @@ class NavigatorScreen(ModalScreen): # ("创建仓库", "repo_creator"), ("缓存管理器", "precache_all"), ("收藏夹", FavoriteManagerScreen), - # ("配置设置", "config"), + ("设置页面", "setting"), # ("调试日志", "logviewer"), ("同步工具", "synctool"), ("关于此软件", "about"), diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py new file mode 100644 index 0000000..53aebac --- /dev/null +++ b/src/heurams/interface/screens/setting.py @@ -0,0 +1,116 @@ +"""设置页面""" + +from functools import reduce +import pathlib +from pathlib import Path +import os + +from textual.app import ComposeResult +from textual.containers import ScrollableContainer, Container, Horizontal, Vertical +from textual.screen import Screen +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Collapsible, Input, Switch +from textual.layouts import horizontal + +import heurams.kernel.particles as pt +import heurams.services.timer as timer +import heurams.services.version as version +from heurams.context import * +from heurams.kernel.particles import * +from heurams.kernel.repolib import * +from heurams.kernel.algorithms import algorithms +from heurams.services.logger import get_logger +from heurams.services.textproc import domize, undomize +from heurams.services.epath import epath + +logger = get_logger(__name__) + + +class SettingScreen(Screen): + """设置页面屏幕""" + + SUB_TITLE = "设置" + BINDINGS = [ + ("q", "go_back", "返回"), + ] + + def __init__( + self, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + ) -> None: + super().__init__(name, id, classes) + + def compose(self) -> ComposeResult: + """组合界面组件""" + yield Header(show_clock=True) + with ScrollableContainer(): + yield Label('设置页面') + for i in config_var.get(): + yield Collapsible(*self._get_subcfg(f'{i}'), title=i) + yield Footer() + + def _get_subcfg(self, parent_epath: str): + parent = epath(config_var.get(), parent_epath) + if isinstance(parent, ConfigDict): + if parent.is_dir: + lst = list() + for i in parent: + lst.append(Collapsible(*self._get_subcfg(f"{parent_epath}.{i}"), title=i)) + return lst + if isinstance(parent, dict) or (isinstance(parent, ConfigDict) and not parent.is_dir): + lst = list() + for i in parent: + if i.startswith('_'): + continue + if isinstance(parent[i], dict): + lst.append(Collapsible(*self._get_subcfg(f"{parent_epath}.{i}"), title=i)) + elif isinstance(parent[i], float): + lst.extend([ + Label(i), + Input(value=str(parent[i]), placeholder='要求一个浮点数', type='number', id=domize(f"{parent_epath}.{i}")) + ]) + elif isinstance(parent[i], str): + lst.extend([ + Label(i), + Input(value=parent[i], placeholder='要求一个字符串', type='text', id=domize(f"{parent_epath}.{i}")) + ]) + elif isinstance(parent[i], bool): + lst.extend([ + Label(i), + Switch(value=str(parent[i]), id=domize(f"{parent_epath}.{i}")) + ]) + elif isinstance(parent[i], int): + lst.extend([ + Label(i), + Input(value=str(parent[i]), placeholder='要求一个整数', type='integer', id=domize(f"{parent_epath}.{i}")) + ]) + elif isinstance(parent[i], list): + pass + else: + lst.append(Label('未知类型')) + + return lst + return [Label('无子项')] + + def on_mount(self) -> None: + """挂载组件时初始化""" + pass + + def action_quit_app(self) -> None: + """退出应用程序""" + self.app.exit() + + def action_open_navigator(self) -> None: + """打开导航器""" + self.app.push_screen(NavigatorScreen()) + + def on_button_pressed(self, event: Button.Pressed) -> None: + logger.debug(f"event.button.id: {event.button.id}") + """处理按钮点击事件""" + if str(event.button.id) == 'apply': + pass + if str(event.button.id) == 'openfolder': + pass + if str(event.button.id) == 'cancel': + pass diff --git a/src/heurams/services/config copy.py b/src/heurams/services/config copy.py deleted file mode 100644 index e0c6b12..0000000 --- a/src/heurams/services/config copy.py +++ /dev/null @@ -1,127 +0,0 @@ -"""配置文件服务""" -import pathlib -import typing - -import toml - -from heurams.services.logger import get_logger - -default_config = { - "persist_to_file": 1, # 将更改保存到文件 - "daystamp_override": -1, # 覆写时间, 设为 -1 以禁用 - "timestamp_override": -1, # 覆写时间, 设为 -1 以禁用 - "quick_pass": 1, # 启用用于测试的快速通过 - "scheduled_num": 8, # 对于每个项目的默认新记忆原子数量 - "timezone_offset": 28800, # UTC 时间戳修正 仅用于 UNIX 日时间戳的生成修正, 单位为秒 - # 28800 是中国标准时间 (UTC+8) - - "interface": { - "memorizor": { - "autovoice": True # 自动语音播放, 仅限于 recognition 组件 - } - }, - - "algorithm": { - "default": "SM-2" # 主要算法 - # 可选项: SM-2, SM-15M, FSRS - }, - - "puzzles": { # 谜题默认配置 - "mcq": { - "max_riddles_num": 2 - }, - "cloze": { - "min_denominator": 3 - } - }, - - "paths": { # 相对于配置文件的 ".." (即工作目录) 而言 或绝对路径 - "data": "./data" - }, - - "services": { # 定义服务到提供者的映射 - "audio": "playsound", # 可选项: playsound(通用), termux(仅用于 Android Termux), mpg123(TODO) - "tts": "edgetts", # 可选项: edgetts - "llm": "openai", # 可选项: openai - "sync": "webdav" # 可选项: 留空, webdav - }, - - "providers": { - "tts": { - "edgetts": { # EdgeTTS 设置 - "voice": "zh-CN-XiaoxiaoNeural" # 可选项: zh-CN-YunjianNeural (男声), zh-CN-XiaoxiaoNeural (女声) - } - }, - "llm": { - "openai": { # 与 OpenAI 相容的语言模型接口服务设置 - "url": "", - "key": "" - } - }, - "sync": { - "webdav": { # WebDAV 同步设置 - "url": "", - "username": "", - "password": "", - "remote_path": "/heurams/", - "verify_ssl": True - } - } - }, -} - -class ConfigFile: - def __init__(self, path: pathlib.Path): - self.logger = get_logger(__name__) - self.path = path - self.data = dict() - if not self.path.exists(): - self.path.touch() - self.logger.debug("创建配置文件: %s", self.path) - self.data = default_config - self.valid_configfile = 1 - # 考虑到可能临时编辑格式错误, 所以不覆写格式错误的配置文件, 而是提示损坏并使用默认配置 - self._load() - - def _load(self): - """从文件加载配置数据""" - with open(self.path, "r") as f: - try: - self.data = toml.load(f) - self.logger.debug("配置文件加载成功: %s", self.path) - except toml.TomlDecodeError as e: - print(f"{e}") - self.logger.error("TOML解析错误: %s", e) - self.data = default_config - self.valid_configfile = 0 - - def modify(self, key: str, value: typing.Any): - """修改配置值并保存""" - self.data[key] = value - self.logger.debug("修改配置项: %s = %s", key, value) - self.save() - - def save(self, path: typing.Union[str, pathlib.Path] = ""): - """保存配置到文件""" - if self.valid_configfile: - save_path = pathlib.Path(path) if path else self.path - with open(save_path, "w") as f: - toml.dump(self.data, f) - self.logger.debug("配置文件已保存: %s", save_path) - else: - pass - - def get(self, key: str, default: typing.Any = None) -> typing.Any: - """获取配置值, 如果不存在返回默认值""" - return self.data.get(key, default) - - def __getitem__(self, key: str) -> typing.Any: - return self.data[key] - - def __setitem__(self, key: str, value: typing.Any): - self.data[key] = value - self.save() - - def __contains__(self, key: str) -> bool: - """支持 in 语法""" - return key in self.data diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index 7755bb3..c88b727 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -41,13 +41,9 @@ class ConfigDict(UserDict): # 舒服了 return self.path / s+'.toml' def __contains__(self, key): - if isinstance(key, str): - key = self.converter(key) return super().__contains__(key) def __setitem__(self, key, value): - if isinstance(key, str): - key = self.converter(key) origvalue = super().__getitem__(key) # 所以你不该访问不存在的对象 if isinstance(origvalue, ConfigDict): if origvalue.path.is_dir(): @@ -77,4 +73,11 @@ class ConfigDict(UserDict): # 舒服了 def __del__(self): if not self.is_dir: - self.persist() # 不准循环引用, 懂了吧 \ No newline at end of file + self.persist() # 不准循环引用, 懂了吧 + + @staticmethod + def titleize(objt): + if isinstance(objt, pathlib.Path): + return objt.stem + else: + return objt \ No newline at end of file diff --git a/src/heurams/services/epath.py b/src/heurams/services/epath.py index e95d6ee..185b640 100644 --- a/src/heurams/services/epath.py +++ b/src/heurams/services/epath.py @@ -1,13 +1,19 @@ +from heurams.services.config import ConfigDict +from heurams.services.logger import get_logger + +logger = get_logger(__name__) def epath(dct, path: str = '', default=None, parents=False): if not path: return dct - path = path.rstrip('/') + path = path.rstrip('.') + path = path.lstrip('.') target = dct - for i in path.split('/'): + for i in path.split('.'): # 处理字典键 - if isinstance(target, dict) and i in target: + logger.debug(f'处理 {i}, {(isinstance(target, dict) or isinstance(target, ConfigDict))} {i in target}') + if (isinstance(target, dict) or isinstance(target, ConfigDict)) and i in target: target = target[i] # 处理列表索引 elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): diff --git a/src/heurams/services/textproc.py b/src/heurams/services/textproc.py index fd78134..0df352a 100644 --- a/src/heurams/services/textproc.py +++ b/src/heurams/services/textproc.py @@ -2,3 +2,9 @@ def truncate(text): if len(text) <= 3: return text return text[:3] + ">" + +def domize(text): + return text.replace('.', '--DOT--') + +def undomize(text): + return text.replace('--DOT--', '.') \ No newline at end of file From 41af2ada4500c5289fafb6e6f57db6a229172223 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 05:05:44 +0800 Subject: [PATCH 35/79] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=A8=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=8F=90=E7=A4=BA=E4=B8=8E=E5=AE=8C=E5=96=84=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/_.toml | 6 ++ data/config/global.toml | 6 ++ data/config/interface/_.toml | 4 + data/config/interface/global.toml | 13 ++- data/config/interface/puzzles/_.toml | 2 + data/config/interface/puzzles/cloze.toml | 1 + data/config/interface/puzzles/mcq.toml | 1 + data/config/interface/screens/memoqueue.toml | 1 - data/config/interface/widgets/_.toml | 1 + .../config/interface/widgets/recognition.toml | 1 + data/config/providers/_.toml | 1 + data/config/providers/tts/_.toml | 1 + data/config/providers/tts/edgetts.toml | 1 + data/config/services/_.toml | 5 ++ data/config/services/audio.toml | 1 + data/config/services/llm.toml | 1 + data/config/services/sync.toml | 1 + data/config/services/timer.toml | 3 + data/config/services/tts.toml | 1 + data/config/test.toml | 4 - src/heurams/interface/css/main.tcss | 5 +- src/heurams/interface/screens/setting.py | 85 ++++++++++++------- src/heurams/services/config.py | 5 ++ 23 files changed, 114 insertions(+), 36 deletions(-) create mode 100644 data/config/_.toml create mode 100644 data/config/interface/_.toml create mode 100644 data/config/interface/puzzles/_.toml delete mode 100644 data/config/interface/screens/memoqueue.toml create mode 100644 data/config/interface/widgets/_.toml create mode 100644 data/config/providers/_.toml create mode 100644 data/config/providers/tts/_.toml create mode 100644 data/config/services/_.toml delete mode 100644 data/config/test.toml diff --git a/data/config/_.toml b/data/config/_.toml new file mode 100644 index 0000000..741ab92 --- /dev/null +++ b/data/config/_.toml @@ -0,0 +1,6 @@ +_services_desc = '服务模块(services)设置' +_providers_desc = '驱动模块(providers)设置' +_repo_desc = '单元集独立设置' +_interface_desc = '基本用户界面设置' +_default_desc = '默认设置' +_global_desc = '底层设置' diff --git a/data/config/global.toml b/data/config/global.toml index 74fc3ed..257649b 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,7 +1,13 @@ enable_built_in_interface = true +_enable_built_in_interface_desc = "启用内置基本用户界面\n(当且仅当 HeurAMS 作为程序库时禁用, 以跳过用户界面逻辑)" +_paths_desc = "用户数据路径定义" [paths] data = "./data" +_data_desc = "用户数据根目录" cache = "./data/cache" +_cache_desc = "缓存根目录\n(如音频缓存在 voice 子目录)" config = "./data/config" +_config_desc = "配置文件根目录" repo = "./data/repo" +_repo_desc = "记忆单元集根目录" diff --git a/data/config/interface/_.toml b/data/config/interface/_.toml new file mode 100644 index 0000000..84f18c8 --- /dev/null +++ b/data/config/interface/_.toml @@ -0,0 +1,4 @@ +_global_desc = "用户界面通用设置" +_widgets_desc = "各组件设置" +_screens_desc = "各界面设置" +_puzzles_desc = "谜题生成器设置" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index ddf073e..e6e60fd 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -1,6 +1,17 @@ persist_to_file = true +_persist_to_file_desc = "[调试] 将记忆更改保存到文件" quick_pass = true +_quick_pass_desc = "[调试] 启用快速应答功能(跳过测验)" auto_pass = false +_auto_pass_desc = "[调试] 自动通过测试模式" scheduled_num = 420 +_scheduled_num_desc = "默认记忆单元数量(可被单元集设置覆盖)" algorithm = "NSP-0" -_algorithm_candidate = [ "SM-2", "SM-15M", "FSRS", "NSP-0", "None",] +_algorithm_desc = "默认记忆调度算法(可被单元集设置覆盖)" + +[_algorithm_candidate] +NSP-0 = "筛选用非间隔重复调度器" +none = "不设置默认调度器" +SM-2 = "第二代 SuperMemo 简单间隔重复调度器" +SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" +FSRS = "先进开放间隔重复调度器" diff --git a/data/config/interface/puzzles/_.toml b/data/config/interface/puzzles/_.toml new file mode 100644 index 0000000..5164f75 --- /dev/null +++ b/data/config/interface/puzzles/_.toml @@ -0,0 +1,2 @@ +_cloze_desc = "填空题" +_mcq_desc = "选择题" diff --git a/data/config/interface/puzzles/cloze.toml b/data/config/interface/puzzles/cloze.toml index 74f917b..d467db1 100644 --- a/data/config/interface/puzzles/cloze.toml +++ b/data/config/interface/puzzles/cloze.toml @@ -1 +1,2 @@ min_denominator = 3 +_min_denominator_desc = "设空比例系数的倒数" diff --git a/data/config/interface/puzzles/mcq.toml b/data/config/interface/puzzles/mcq.toml index b72b3dd..f0fe9ca 100644 --- a/data/config/interface/puzzles/mcq.toml +++ b/data/config/interface/puzzles/mcq.toml @@ -1 +1,2 @@ max_riddles_num = 2 +_max_riddles_num_desc = "单次生成的最大谜题数量" diff --git a/data/config/interface/screens/memoqueue.toml b/data/config/interface/screens/memoqueue.toml deleted file mode 100644 index cf80dfb..0000000 --- a/data/config/interface/screens/memoqueue.toml +++ /dev/null @@ -1 +0,0 @@ -autovoice = true diff --git a/data/config/interface/widgets/_.toml b/data/config/interface/widgets/_.toml new file mode 100644 index 0000000..5a8d43a --- /dev/null +++ b/data/config/interface/widgets/_.toml @@ -0,0 +1 @@ +_recognition_desc = "用于 '辨识' 组件的设置" diff --git a/data/config/interface/widgets/recognition.toml b/data/config/interface/widgets/recognition.toml index cf80dfb..4fa9d77 100644 --- a/data/config/interface/widgets/recognition.toml +++ b/data/config/interface/widgets/recognition.toml @@ -1 +1,2 @@ autovoice = true +_autovoice_desc = "自动语音播放" diff --git a/data/config/providers/_.toml b/data/config/providers/_.toml new file mode 100644 index 0000000..a592309 --- /dev/null +++ b/data/config/providers/_.toml @@ -0,0 +1 @@ +_tts_desc = '文本转语音驱动' diff --git a/data/config/providers/tts/_.toml b/data/config/providers/tts/_.toml new file mode 100644 index 0000000..8ba734b --- /dev/null +++ b/data/config/providers/tts/_.toml @@ -0,0 +1 @@ +_edgetts_desc = "微软文本转语音驱动" diff --git a/data/config/providers/tts/edgetts.toml b/data/config/providers/tts/edgetts.toml index 1ada64f..a88ee6e 100644 --- a/data/config/providers/tts/edgetts.toml +++ b/data/config/providers/tts/edgetts.toml @@ -1,4 +1,5 @@ voice = "zh-CN-XiaoxiaoNeural" +_voice_desc = "音色" [_voice_candidate] zh-CN-XiaoxiaoNeural = "晓晓: 中文温柔女声" diff --git a/data/config/services/_.toml b/data/config/services/_.toml new file mode 100644 index 0000000..38ebb9f --- /dev/null +++ b/data/config/services/_.toml @@ -0,0 +1,5 @@ +_audio_desc = '音频服务' +_llm_desc = '语言模型服务' +_sync_desc = '数据同步服务' +_timer_desc = '时间服务' +_tts_desc = '文本转语音服务' diff --git a/data/config/services/audio.toml b/data/config/services/audio.toml index d1722d7..ac42f77 100644 --- a/data/config/services/audio.toml +++ b/data/config/services/audio.toml @@ -1,4 +1,5 @@ provider = "playsound" +_provider_desc = "音频驱动类型" [_provider_candidate] playsound = "python 跨平台音频系统" diff --git a/data/config/services/llm.toml b/data/config/services/llm.toml index 5e9e971..6f748c0 100644 --- a/data/config/services/llm.toml +++ b/data/config/services/llm.toml @@ -1,4 +1,5 @@ provider = "openai" +_provider_desc = "模型接口类型" [_provider_candidate] openai = "OpenAI 风格 API, 同时支持与其相容的模型服务 (如 deepseek)" diff --git a/data/config/services/sync.toml b/data/config/services/sync.toml index da9c57c..037a247 100644 --- a/data/config/services/sync.toml +++ b/data/config/services/sync.toml @@ -1,4 +1,5 @@ provider = "webdav" +_provider_desc = "同步服务驱动类型" [_provider_candidate] webdav = "WebDAV 兼容网络文件系统 (包括 webdavs)" diff --git a/data/config/services/timer.toml b/data/config/services/timer.toml index 69d414d..6fe395a 100644 --- a/data/config/services/timer.toml +++ b/data/config/services/timer.toml @@ -1,3 +1,6 @@ daystamp_override = -1 +_daystamp_override_desc = "[调试] 覆写 UNIX 日时间戳, 单位为日\n(设为 -1 禁用)" timestamp_override = -1 +_timestamp_override_desc = "[调试] 覆写 UNIX 时间戳, 单位为秒\n(设为 -1 禁用)" timezone_offset = 28800 +_timezone_offset_desc = "时区偏移设置, 用于取消跨天时区误差, 单位为秒\n(如 28800 为 UTC+8.0, 中国标准时间)" diff --git a/data/config/services/tts.toml b/data/config/services/tts.toml index d2bf261..89b3273 100644 --- a/data/config/services/tts.toml +++ b/data/config/services/tts.toml @@ -1,4 +1,5 @@ provider = "edgetts" +_provider_desc = "文本转语音驱动类型" [_provider_candidate] edgetts = "微软神经网络语音合成, 依赖微软网络服务" diff --git a/data/config/test.toml b/data/config/test.toml deleted file mode 100644 index f41c16b..0000000 --- a/data/config/test.toml +++ /dev/null @@ -1,4 +0,0 @@ -[aa.bb] -str = "sq" -boolean = true -int = 123 diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index ac93bce..911f205 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -39,7 +39,10 @@ NavigatorScreen { margin-top: 1; align: center middle; } - +.container { + height: auto; + padding: 0 0 1 0; +} #message-input { width: 1fr; margin-right: 1; diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index 53aebac..cdf3c6a 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -8,7 +8,7 @@ import os from textual.app import ComposeResult from textual.containers import ScrollableContainer, Container, Horizontal, Vertical from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Collapsible, Input, Switch +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Collapsible, Input, Switch, Select from textual.layouts import horizontal import heurams.kernel.particles as pt @@ -45,9 +45,13 @@ class SettingScreen(Screen): """组合界面组件""" yield Header(show_clock=True) with ScrollableContainer(): - yield Label('设置页面') + yield Label('[b]设置页面[/b]') for i in config_var.get(): - yield Collapsible(*self._get_subcfg(f'{i}'), title=i) + if i.startswith('_'): + continue + a = self._get_subcfg(f'{i}') + if a: + yield Collapsible(*a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}') yield Footer() def _get_subcfg(self, parent_epath: str): @@ -56,7 +60,11 @@ class SettingScreen(Screen): if parent.is_dir: lst = list() for i in parent: - lst.append(Collapsible(*self._get_subcfg(f"{parent_epath}.{i}"), title=i)) + if i.startswith('_'): + continue + a = self._get_subcfg(f"{parent_epath}.{i}") + if a: + lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}')) return lst if isinstance(parent, dict) or (isinstance(parent, ConfigDict) and not parent.is_dir): lst = list() @@ -64,32 +72,47 @@ class SettingScreen(Screen): if i.startswith('_'): continue if isinstance(parent[i], dict): - lst.append(Collapsible(*self._get_subcfg(f"{parent_epath}.{i}"), title=i)) - elif isinstance(parent[i], float): - lst.extend([ - Label(i), - Input(value=str(parent[i]), placeholder='要求一个浮点数', type='number', id=domize(f"{parent_epath}.{i}")) - ]) - elif isinstance(parent[i], str): - lst.extend([ - Label(i), - Input(value=parent[i], placeholder='要求一个字符串', type='text', id=domize(f"{parent_epath}.{i}")) - ]) - elif isinstance(parent[i], bool): - lst.extend([ - Label(i), - Switch(value=str(parent[i]), id=domize(f"{parent_epath}.{i}")) - ]) - elif isinstance(parent[i], int): - lst.extend([ - Label(i), - Input(value=str(parent[i]), placeholder='要求一个整数', type='integer', id=domize(f"{parent_epath}.{i}")) - ]) - elif isinstance(parent[i], list): - pass + a = self._get_subcfg(f"{parent_epath}.{i}") + if a: + lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}')) + elif f'_{i}_candidate' in parent: + if isinstance(parent[f'_{i}_candidate'], dict): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Select((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()), + classes='container' + )) + elif isinstance(parent[f'_{i}_candidate'], list): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Select((j, j) for j in parent[f'_{i}_candidate']), + classes='container' + )) else: - lst.append(Label('未知类型')) - + if isinstance(parent[i], float): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input(value=str(parent[i]), placeholder='要求一个浮点数', type='number', id=domize(f"{parent_epath}.{i}")), + classes='container')) + elif isinstance(parent[i], str): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input(value=parent[i], placeholder='要求一个字符串', type='text', id=domize(f"{parent_epath}.{i}")), + classes='container')) + elif isinstance(parent[i], bool): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Switch(value=str(parent[i]), id=domize(f"{parent_epath}.{i}")), + classes='container')) + elif isinstance(parent[i], int): + lst.append(Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input(value=str(parent[i]), placeholder='要求一个整数', type='integer', id=domize(f"{parent_epath}.{i}")), + classes='container')) + elif isinstance(parent[i], list): + pass + else: + lst.append(Label('未知类型')) return lst return [Label('无子项')] @@ -97,6 +120,10 @@ class SettingScreen(Screen): """挂载组件时初始化""" pass + def action_go_back(self) -> None: + """返回上一屏幕""" + self.app.pop_screen() + def action_quit_app(self) -> None: """退出应用程序""" self.app.exit() diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index c88b727..7119fc2 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -56,6 +56,11 @@ class ConfigDict(UserDict): # 舒服了 def update_index(self): # 如果有人没事干在config里面创建指向config的符号链接 这玩意会崩溃 但是不要修复: 需要这个符号链接特性 for i in self.path.iterdir(): + if i.name.startswith('_'): + if i.name == '_.toml' and not i.is_dir(): + with open(self.path/'_.toml', 'r+') as f: + self.data.update(dict(toml.load(f))) + continue if i.is_dir(): self.data[i.name] = i else: From d16ec03da67f04d66885adfec9980742657390c8 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 06:37:46 +0800 Subject: [PATCH 36/79] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20ZMQ=20?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=B9=B6=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E8=AE=BE=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 6 +- data/config/interface/global.toml | 2 +- data/config/interface/puzzles/cloze.toml | 2 +- data/config/interface/puzzles/mcq.toml | 2 +- pyproject.toml | 1 + src/heurams/interface/__main__.py | 37 +++++++++++ src/heurams/interface/screens/setting.py | 42 ++++++++---- src/heurams/services/config.py | 54 ++++++++------- src/heurams/services/epath.py | 62 +++++++++++------ src/heurams/tools/zmqclient.py | 55 ++++++++++++++++ uv.lock | 84 ++++++++++++++++++++++++ 11 files changed, 289 insertions(+), 58 deletions(-) create mode 100644 src/heurams/tools/zmqclient.py diff --git a/data/config/global.toml b/data/config/global.toml index 257649b..47d5999 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,4 +1,8 @@ -enable_built_in_interface = true +zmq_debug = false +_zmq_debug_desc = "[调试] ZMQ 调试服务器, 这会在 zmq_debug_port 上打开调试服务器\n可作为 HeurAMS 执行任意 python 代码, 如无必要请关闭" +zmq_debug_port = 5555 +_zmq_debug_port_desc = "ZMQ 调试服务器端口" +enable_built_in_interface = false _enable_built_in_interface_desc = "启用内置基本用户界面\n(当且仅当 HeurAMS 作为程序库时禁用, 以跳过用户界面逻辑)" _paths_desc = "用户数据路径定义" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index e6e60fd..d9d800b 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -4,7 +4,7 @@ quick_pass = true _quick_pass_desc = "[调试] 启用快速应答功能(跳过测验)" auto_pass = false _auto_pass_desc = "[调试] 自动通过测试模式" -scheduled_num = 420 +scheduled_num = "420" _scheduled_num_desc = "默认记忆单元数量(可被单元集设置覆盖)" algorithm = "NSP-0" _algorithm_desc = "默认记忆调度算法(可被单元集设置覆盖)" diff --git a/data/config/interface/puzzles/cloze.toml b/data/config/interface/puzzles/cloze.toml index d467db1..a2e0ed8 100644 --- a/data/config/interface/puzzles/cloze.toml +++ b/data/config/interface/puzzles/cloze.toml @@ -1,2 +1,2 @@ -min_denominator = 3 +min_denominator = "3" _min_denominator_desc = "设空比例系数的倒数" diff --git a/data/config/interface/puzzles/mcq.toml b/data/config/interface/puzzles/mcq.toml index f0fe9ca..558ca8f 100644 --- a/data/config/interface/puzzles/mcq.toml +++ b/data/config/interface/puzzles/mcq.toml @@ -1,2 +1,2 @@ -max_riddles_num = 2 +max_riddles_num = "2" _max_riddles_num_desc = "单次生成的最大谜题数量" diff --git a/pyproject.toml b/pyproject.toml index 92772aa..18cc5b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ dependencies = [ "textual>=8.2.3", "toml>=0.10.2", "transitions>=0.9.3", + "zmq>=0.0.0", ] [project.scripts] diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 209f0a3..65f8454 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -1,6 +1,9 @@ from heurams.interface import * from heurams.context import config_var from heurams.services.logger import get_logger +import threading +import zmq +import pickle logger = get_logger(__name__) @@ -20,9 +23,43 @@ def environment_check(): print(f"找到 {i}") logger.debug("环境检查完成") +def start_debug_server(app): + logger = get_logger("zmq_debug") + context = zmq.Context() + socket = context.socket(zmq.REP) + port = config_var.get()['global'].get('zmq_debug_port', 5555) + socket.bind(f"tcp://*:{port}") + logger.info(f"ZMQ Debug server started on port {port}") + first = 1 + while True: + msg = socket.recv() + code = pickle.loads(msg) + namespace = {"app": app, "logger": logger, "config_var": config_var} + if first: + app.title += ' [调试已连接]' + first = 0 + try: + # 先尝试 eval + result = eval(code, namespace) + socket.send(pickle.dumps(f"成功: {result}")) + except SyntaxError: + # 再尝试 exec + try: + exec(code, namespace) + socket.send(pickle.dumps(f"成功: 执行完成")) + except Exception as e: + socket.send(pickle.dumps(f"错误: {e}")) + except Exception as e: + socket.send(pickle.dumps(f"错误: {e}")) + def main(): environment_check() + app = HeurAMSApp() + + if config_var.get()['global'].get('zmq_debug', False): + threading.Thread(target=start_debug_server, args=(app,), daemon=True).start() + app.run(inline=False) if __name__ == "__main__": diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index cdf3c6a..04c9f60 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -75,17 +75,17 @@ class SettingScreen(Screen): a = self._get_subcfg(f"{parent_epath}.{i}") if a: lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}')) - elif f'_{i}_candidate' in parent: + elif f'_{i}_candidate' in parent: # 选择框模式 if isinstance(parent[f'_{i}_candidate'], dict): lst.append(Horizontal( Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Select((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()), + Select(((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")), classes='container' )) elif isinstance(parent[f'_{i}_candidate'], list): lst.append(Horizontal( Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Select((j, j) for j in parent[f'_{i}_candidate']), + Select(((j, j) for j in parent[f'_{i}_candidate']), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")), classes='container' )) else: @@ -102,7 +102,7 @@ class SettingScreen(Screen): elif isinstance(parent[i], bool): lst.append(Horizontal( Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Switch(value=str(parent[i]), id=domize(f"{parent_epath}.{i}")), + Switch(value=parent[i], id=domize(f"{parent_epath}.{i}")), classes='container')) elif isinstance(parent[i], int): lst.append(Horizontal( @@ -122,6 +122,7 @@ class SettingScreen(Screen): def action_go_back(self) -> None: """返回上一屏幕""" + config_var.get().persist() self.app.pop_screen() def action_quit_app(self) -> None: @@ -132,12 +133,27 @@ class SettingScreen(Screen): """打开导航器""" self.app.push_screen(NavigatorScreen()) - def on_button_pressed(self, event: Button.Pressed) -> None: - logger.debug(f"event.button.id: {event.button.id}") - """处理按钮点击事件""" - if str(event.button.id) == 'apply': - pass - if str(event.button.id) == 'openfolder': - pass - if str(event.button.id) == 'cancel': - pass + + def on_input_changed(self, event: Input.Changed) -> None: + widget_id = event.input.id + if not widget_id: + return + eepath = undomize(widget_id) + value = event.value + epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) + + def on_switch_changed(self, event: Switch.Changed) -> None: + widget_id = event.switch.id + if not widget_id: + return + eepath = undomize(widget_id) + value = event.value + epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) + + def on_select_changed(self, event: Select.Changed) -> None: + widget_id = event.select.id + if not widget_id: + return + eepath = undomize(widget_id) + value = event.value + epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) \ No newline at end of file diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index 7119fc2..9f6b2a5 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -9,17 +9,38 @@ from heurams.services.logger import get_logger from heurams.services.exceptions import WTFException # 我们的流程是: 找到文件名: 返回文件名里头的数据; 找不到: 继续查索引; 所以 self.data 除了存本级各种索引球用没得 -# 递归就是这么吊 +logger = get_logger(__name__) + class ConfigDict(UserDict): # 舒服了 + _instances = {} # 必须使用单例模式, 不然有严重的多实例导致的配置无法持久化问题 + + def __new__(cls, config_path: pathlib.Path, dict=None): + if dict: + raise WTFException("不要放默认值...") + + # 规范化路径, 免得单例存在"别名" + path_key = config_path.resolve() + + if path_key in cls._instances: + return cls._instances[path_key] + + instance = super().__new__(cls) + cls._instances[path_key] = instance + return instance + def __init__(self, config_path: pathlib.Path, dict = None): # 需要自己把自己提起来 + # 避免重复初始化 + if hasattr(self, '_initialized'): + return + self._initialized = True if dict: raise WTFException("不要放默认值...") super().__init__(dict) - self.logger = get_logger(__name__) + logger = get_logger(__name__) self.path = config_path self.is_dir = self.path.is_dir() if self.is_dir: - self.update_index() # 狗儿要唱狗儿歌 + self.update_index() else: with open(self.path, 'r+') as f: #TODO: 给这个做缓存 try: @@ -35,11 +56,6 @@ class ConfigDict(UserDict): # 舒服了 return ConfigDict(value) return value - def converter(self, s): - if (self.path / s).exists: - return self.path / s - return self.path / s+'.toml' - def __contains__(self, key): return super().__contains__(key) @@ -67,22 +83,16 @@ class ConfigDict(UserDict): # 舒服了 if i.suffix == '.toml': self.data[i.stem] = i else: - self.logger.log(f"配置目录中有无效的文件 {i.stem}") # what's up bro + logger.debug(f"配置目录中有无效的文件 {i.stem}") # what's up bro def persist(self): if self.is_dir: - raise WTFException("不准这样浪费性能...") + for i in self.data.keys(): + j = self[i] + if isinstance(j, ConfigDict): + j.persist() + logger.debug("完成配置持久化") + return with open(self.path, 'w+') as f: - toml.dump(self.data, f) - - def __del__(self): - if not self.is_dir: - self.persist() # 不准循环引用, 懂了吧 - - @staticmethod - def titleize(objt): - if isinstance(objt, pathlib.Path): - return objt.stem - else: - return objt \ No newline at end of file + toml.dump(self.data, f) \ No newline at end of file diff --git a/src/heurams/services/epath.py b/src/heurams/services/epath.py index 185b640..91d0504 100644 --- a/src/heurams/services/epath.py +++ b/src/heurams/services/epath.py @@ -2,35 +2,59 @@ from heurams.services.config import ConfigDict from heurams.services.logger import get_logger logger = get_logger(__name__) -def epath(dct, path: str = '', default=None, parents=False): + +def epath(dct, path: str = '', default=None, parents=False, enable_modify=False, new_value=None): if not path: return dct path = path.rstrip('.') path = path.lstrip('.') target = dct - - for i in path.split('.'): + keys = path.split('.') + logger.debug(f"处理 EPATH {path}, {new_value}") + for idx, i in enumerate(keys): + is_last = (idx == len(keys) - 1) + # 处理字典键 logger.debug(f'处理 {i}, {(isinstance(target, dict) or isinstance(target, ConfigDict))} {i in target}') - if (isinstance(target, dict) or isinstance(target, ConfigDict)) and i in target: - target = target[i] - # 处理列表索引 - elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): - idx = int(i[1:-1]) - if 0 <= idx < len(target): - target = target[idx] - elif parents: - while len(target) <= idx: - target.append(None) - target[idx] = {} - target = target[idx] + + if is_last and enable_modify: + # 最后一次循环执行修改 + if (isinstance(target, dict) or isinstance(target, ConfigDict)): + target[i] = new_value + return new_value + elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): + idx_num = int(i[1:-1]) + if 0 <= idx_num < len(target): + target[idx_num] = new_value + return new_value + elif parents: + while len(target) <= idx_num: + target.append(None) + target[idx_num] = new_value + return new_value + else: + return default else: return default - elif parents: - target[i] = {} - target = target[i] else: - return default + if (isinstance(target, dict) or isinstance(target, ConfigDict)) and i in target: + target = target[i] + elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): + idx_num = int(i[1:-1]) + if 0 <= idx_num < len(target): + target = target[idx_num] + elif parents: + while len(target) <= idx_num: + target.append(None) + target[idx_num] = {} + target = target[idx_num] + else: + return default + elif parents: + target[i] = {} + target = target[i] + else: + return default return target \ No newline at end of file diff --git a/src/heurams/tools/zmqclient.py b/src/heurams/tools/zmqclient.py new file mode 100644 index 0000000..1a7a481 --- /dev/null +++ b/src/heurams/tools/zmqclient.py @@ -0,0 +1,55 @@ +import zmq +import pickle +import readline +import sys + +class DebugClient: + def __init__(self, port=5555): + self.context = zmq.Context() + self.socket = self.context.socket(zmq.REQ) + self.socket.connect(f"tcp://localhost:{port}") + print(f"已连接到调试服务器 (端口 {port})") + print("输入Python代码并按回车执行, 输入 'exit' 退出") + print("可用变量: app, logger") + print("-" * 50) + + def execute(self, code): + """执行代码并返回结果""" + try: + self.socket.send(pickle.dumps(code)) + response = pickle.loads(self.socket.recv()) + return response + except Exception as e: + return f"连接错误: {e}" + + def repl(self): + """交互式REPL循环""" + self.execute('print("test")') + while True: + try: + # 获取用户输入 + code = input(">>> ").strip() + + if not code: + continue + + if code.lower() in ['exit', 'quit']: + print("退出调试客户端") + break + + # 执行代码 + result = self.execute(code) + print(f"结果: {result}\n") + + except KeyboardInterrupt: + print("\n退出调试客户端") + break + except EOFError: + break + +if __name__ == "__main__": + # 从命令行参数获取端口 + port = int(sys.argv[1]) if len(sys.argv) > 1 else 5555 + + client = DebugClient(port) + client.repl() \ No newline at end of file diff --git a/uv.lock b/uv.lock index bca2161..961fbd6 100644 --- a/uv.lock +++ b/uv.lock @@ -113,6 +113,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -211,6 +244,7 @@ dependencies = [ { name = "textual" }, { name = "toml" }, { name = "transitions" }, + { name = "zmq" }, ] [package.metadata] @@ -225,6 +259,7 @@ requires-dist = [ { name = "textual", specifier = ">=8.2.3" }, { name = "toml", specifier = ">=0.10.2" }, { name = "transitions", specifier = ">=0.9.3" }, + { name = "zmq", specifier = ">=0.0.0" }, ] [[package]] @@ -510,6 +545,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, ] +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + [[package]] name = "pydantic" version = "2.13.2" @@ -584,6 +628,37 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/a2/80/09247a2be28af2c2240132a0af6c1005a2b1d089242b13a2cd782d2de8d7/pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313", size = 1409059, upload-time = "2026-03-25T16:14:04.008Z" } +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + [[package]] name = "rich" version = "15.0.0" @@ -753,3 +828,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] + +[[package]] +name = "zmq" +version = "0.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyzmq" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/78/833b2808793c1619835edb1a4e17a023d5d625f4f97ff25ffff986d1f472/zmq-0.0.0.tar.gz", hash = "sha256:6b1a1de53338646e8c8405803cffb659e8eb7bb02fff4c9be62a7acfac8370c9", size = 966, upload-time = "2015-05-21T17:34:26.603Z" } From 845a505ca171ac149974aa9e2e8677d29f28b1b0 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 07:39:57 +0800 Subject: [PATCH 37/79] =?UTF-8?q?feat:=20=E8=AF=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E5=85=83=E9=9B=86=E7=8B=AC=E7=AB=8B=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/repo/_.toml | 2 ++ data/config/repo/高考必背古诗文-0.toml | 11 +++++++++++ data/config/repo/高考必背古诗文.toml | 11 +++++++++++ src/heurams/interface/__init__.py | 1 + src/heurams/interface/screens/dashboard.py | 3 ++- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 data/config/repo/_.toml create mode 100644 data/config/repo/高考必背古诗文-0.toml create mode 100644 data/config/repo/高考必背古诗文.toml diff --git a/data/config/repo/_.toml b/data/config/repo/_.toml new file mode 100644 index 0000000..d471edb --- /dev/null +++ b/data/config/repo/_.toml @@ -0,0 +1,2 @@ +_cngk-t_desc = "高考必备古诗文" +_cngk_desc = "高考必备古诗文" diff --git a/data/config/repo/高考必背古诗文-0.toml b/data/config/repo/高考必背古诗文-0.toml new file mode 100644 index 0000000..3cd8fc9 --- /dev/null +++ b/data/config/repo/高考必背古诗文-0.toml @@ -0,0 +1,11 @@ +algorithm = "NSP-0" +_algorithm_desc = "记忆调度算法" +scheduled_num = 420 +_scheduled_num_desc = "单次记忆单元数量" + +[_algorithm_candidate] +NSP-0 = "筛选用非间隔重复调度器" +none = "不设置默认调度器" +SM-2 = "第二代 SuperMemo 简单间隔重复调度器" +SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" +FSRS = "先进开放间隔重复调度器" diff --git a/data/config/repo/高考必背古诗文.toml b/data/config/repo/高考必背古诗文.toml new file mode 100644 index 0000000..19dff73 --- /dev/null +++ b/data/config/repo/高考必背古诗文.toml @@ -0,0 +1,11 @@ +algorithm = "SM-2" +_algorithm_desc = "记忆调度算法" +scheduled_num = 20 +_scheduled_num_desc = "单次记忆单元数量" + +[_algorithm_candidate] +NSP-0 = "筛选用非间隔重复调度器" +none = "不设置默认调度器" +SM-2 = "第二代 SuperMemo 简单间隔重复调度器" +SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" +FSRS = "先进开放间隔重复调度器" diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index e52cdc9..8454e4f 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -37,6 +37,7 @@ class HeurAMSApp(App): ("q", "go_back", "退出"), ("d", "toggle_dark", "主题"), ("n", "app.push_screen('navigator')", "导航"), + ("s", "app.push_screen('setting')", "设置"), ("z", "app.push_screen('about')", "关于"), ] SCREENS = { diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 30889bf..de85d2c 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -96,7 +96,8 @@ class DashboardScreen(Screen): nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) ) electron = pt.Electron.create_on_electonic_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + electronic_data=repo.electronic_data_lict.get_itemic_unit(i), + algo_name=config_var.get()['repo'][repo.manifest['title']]['algorithm'] ) if electron.is_activated(): activated_sum += 1 From 65fbdec0a96a0138bca0e5435d66421aec2f776a Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 16:30:04 +0800 Subject: [PATCH 38/79] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96,=20=E6=94=B9=E8=BF=9B=E4=BB=AA=E8=A1=A8?= =?UTF-8?q?=E7=9B=98,=20=E6=96=B0=E5=A2=9E=E5=A4=9ACSS=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 6 +- data/config/interface/global.toml | 2 +- .../{高考必背古诗文-0.toml => cngk-0.toml} | 0 .../repo/{高考必背古诗文.toml => cngk.toml} | 0 data/repo/cngk-t/manifest.toml | 1 + examples/simplemem.py | 8 +- src/heurams/__main__.py | 4 +- src/heurams/context.py | 1 + src/heurams/interface/__init__.py | 9 +- src/heurams/interface/__main__.py | 18 +- .../interface/css/screens/dashboard.tcss | 18 ++ src/heurams/interface/screens/about.py | 40 ++-- src/heurams/interface/screens/dashboard.py | 168 +++++++++-------- src/heurams/interface/screens/favmgr.py | 8 +- src/heurams/interface/screens/memoqueue.py | 16 +- src/heurams/interface/screens/navigator.py | 6 +- src/heurams/interface/screens/precache.py | 58 ++++-- src/heurams/interface/screens/preparation.py | 49 +++-- src/heurams/interface/screens/setting.py | 172 +++++++++++++----- .../interface/widgets/base_puzzle_widget.py | 4 +- src/heurams/interface/widgets/cloze_puzzle.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 4 +- src/heurams/interface/widgets/placeholder.py | 4 +- src/heurams/interface/widgets/recognition.py | 4 +- src/heurams/kernel/algorithms/base.py | 3 +- src/heurams/kernel/algorithms/nsp0.py | 11 +- src/heurams/kernel/algorithms/sm15m.py | 2 +- src/heurams/kernel/algorithms/sm2.py | 3 +- src/heurams/kernel/particles/atom.py | 2 +- src/heurams/kernel/particles/electron.py | 9 +- src/heurams/kernel/particles/nucleon.py | 16 +- src/heurams/kernel/reactor/fission.py | 2 +- src/heurams/kernel/repolib/repo.py | 37 ++-- src/heurams/services/audio_service.py | 8 +- src/heurams/services/config.py | 41 +++-- src/heurams/services/epath.py | 50 +++-- src/heurams/services/exceptions.py | 3 +- src/heurams/services/favorite_service.py | 2 +- src/heurams/services/textproc.py | 6 +- src/heurams/services/timer.py | 9 +- src/heurams/services/tts_service.py | 5 +- src/heurams/tools/csv2payload.py | 69 +++---- src/heurams/tools/zmqclient.py | 20 +- 43 files changed, 551 insertions(+), 349 deletions(-) rename data/config/repo/{高考必背古诗文-0.toml => cngk-0.toml} (100%) rename data/config/repo/{高考必背古诗文.toml => cngk.toml} (100%) create mode 100644 src/heurams/interface/css/screens/dashboard.tcss diff --git a/data/config/global.toml b/data/config/global.toml index 47d5999..c4ef4c2 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,7 +1,7 @@ -zmq_debug = false -_zmq_debug_desc = "[调试] ZMQ 调试服务器, 这会在 zmq_debug_port 上打开调试服务器\n可作为 HeurAMS 执行任意 python 代码, 如无必要请关闭" +zmq_debug = true +_zmq_debug_desc = "[调试] ZMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 -_zmq_debug_port_desc = "ZMQ 调试服务器端口" +_zmq_debug_port_desc = "[调试] ZMQ 调试服务器端口" enable_built_in_interface = false _enable_built_in_interface_desc = "启用内置基本用户界面\n(当且仅当 HeurAMS 作为程序库时禁用, 以跳过用户界面逻辑)" _paths_desc = "用户数据路径定义" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index d9d800b..e6e60fd 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -4,7 +4,7 @@ quick_pass = true _quick_pass_desc = "[调试] 启用快速应答功能(跳过测验)" auto_pass = false _auto_pass_desc = "[调试] 自动通过测试模式" -scheduled_num = "420" +scheduled_num = 420 _scheduled_num_desc = "默认记忆单元数量(可被单元集设置覆盖)" algorithm = "NSP-0" _algorithm_desc = "默认记忆调度算法(可被单元集设置覆盖)" diff --git a/data/config/repo/高考必背古诗文-0.toml b/data/config/repo/cngk-0.toml similarity index 100% rename from data/config/repo/高考必背古诗文-0.toml rename to data/config/repo/cngk-0.toml diff --git a/data/config/repo/高考必背古诗文.toml b/data/config/repo/cngk.toml similarity index 100% rename from data/config/repo/高考必背古诗文.toml rename to data/config/repo/cngk.toml diff --git a/data/repo/cngk-t/manifest.toml b/data/repo/cngk-t/manifest.toml index 4a5e9c3..95a8a4a 100644 --- a/data/repo/cngk-t/manifest.toml +++ b/data/repo/cngk-t/manifest.toml @@ -1,3 +1,4 @@ title = "高考必背古诗文-0" +package = "cngk-0" author = "__heurams__" desc = "高考古诗文 60 篇" diff --git a/examples/simplemem.py b/examples/simplemem.py index 55c0a9f..44d4483 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -5,14 +5,12 @@ import heurams.kernel.particles as pt import heurams.kernel.repolib as repolib from heurams.services.textproc import truncate -repo = repolib.Repo.create_from_repodir(Path("./test_repo")) +repo = repolib.Repo.from_repodir(Path("./test_repo")) alist = list() print(repo.ident_index) for i in repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data( - nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) - ) - e = pt.Electron.create_on_electonic_data( + n = pt.Nucleon.from_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) + e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict.get_itemic_unit(i) ) print(n) diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index 81065af..942f389 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -1,5 +1,6 @@ import heurams.services.version as ver + # __main__.py def main(): prompt = f"""HeurAMS {ver.ver} 已经被成功地安装在系统中. @@ -17,5 +18,6 @@ python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 注意: 一个常见的误区是, 执行 interface 下的 __main__.py 运行基本用户界面, 这会导致 Python 上下文环境异常, 请不要这样做.""" print(prompt) + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/src/heurams/context.py b/src/heurams/context.py index bd30f6a..b0e008d 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -30,6 +30,7 @@ config_var: ContextVar[ConfigDict].get = ContextVar( ) """配置对象的全局引用对象.""" + class ConfigContext: """ 功能完备的上下文管理器 diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 8454e4f..b01807a 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -1,9 +1,11 @@ from time import sleep, perf_counter + print("欢迎使用基本用户界面!") print("加载配置与上下文... ", end="", flush=True) _start1 = perf_counter() _start = perf_counter() from heurams.context import * + _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -11,6 +13,7 @@ print("加载用户界面框架... ", end="", flush=True) _start = perf_counter() from textual.app import App from textual.widgets import Button + _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -22,6 +25,7 @@ from .screens.navigator import NavigatorScreen from .screens.precache import PrecachingScreen from .screens.setting import SettingScreen from .screens.synctool import SyncScreen + _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -29,9 +33,12 @@ print(f"组件目录: {rootdir}") print(f"工作目录: {workdir}") _end1 = perf_counter() print(f"前置工作共计耗时: {round(1000 * (_end1 - _start1))}ms") + + class HeurAMSApp(App): TITLE = "潜进" CSS_PATH = "css/main.tcss" + css_dir = pathlib.Path("css").resolve() SUB_TITLE = "启发式辅助记忆调度器" BINDINGS = [ ("q", "go_back", "退出"), @@ -72,4 +79,4 @@ class HeurAMSApp(App): def panic(self, *args): self._close_messages_no_wait() - raise self._exception \ No newline at end of file + raise self._exception diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 65f8454..5dbacab 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -7,6 +7,7 @@ import pickle logger = get_logger(__name__) + def environment_check(): from pathlib import Path @@ -23,11 +24,12 @@ def environment_check(): print(f"找到 {i}") logger.debug("环境检查完成") + def start_debug_server(app): logger = get_logger("zmq_debug") context = zmq.Context() socket = context.socket(zmq.REP) - port = config_var.get()['global'].get('zmq_debug_port', 5555) + port = config_var.get()["global"].get("zmq_debug_port", 5555) socket.bind(f"tcp://*:{port}") logger.info(f"ZMQ Debug server started on port {port}") first = 1 @@ -36,7 +38,7 @@ def start_debug_server(app): code = pickle.loads(msg) namespace = {"app": app, "logger": logger, "config_var": config_var} if first: - app.title += ' [调试已连接]' + app.title += " [调试已连接]" first = 0 try: # 先尝试 eval @@ -52,15 +54,17 @@ def start_debug_server(app): except Exception as e: socket.send(pickle.dumps(f"错误: {e}")) + def main(): environment_check() - + app = HeurAMSApp() - - if config_var.get()['global'].get('zmq_debug', False): + + if config_var.get()["global"].get("zmq_debug", False): threading.Thread(target=start_debug_server, args=(app,), daemon=True).start() - + app.run(inline=False) + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/src/heurams/interface/css/screens/dashboard.tcss b/src/heurams/interface/css/screens/dashboard.tcss new file mode 100644 index 0000000..05ae942 --- /dev/null +++ b/src/heurams/interface/css/screens/dashboard.tcss @@ -0,0 +1,18 @@ +.repo-list { + +} + +#header { + height: 4; +} + +.repo-list-item { + layout: grid; + grid-size: 2; + height: 3; +} + +.repo-list-item-shortcut { + dock: right; + offset: -5% 0 +} diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index f7d6b19..77f635b 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -23,7 +23,7 @@ class AboutScreen(Screen): yield Header(show_clock=True) with ScrollableContainer(id="about_container"): yield Label("[b]关于与版本信息[/b]") - + # 获取系统信息 textual_version = self._get_textual_version() terminal_info = self._get_terminal_info() @@ -31,7 +31,7 @@ class AboutScreen(Screen): os_version = self._get_os_version() disk_usage = self._get_disk_usage() memory_info = self._get_memory_info() - + about_text = f""" # 关于 "潜进" @@ -95,36 +95,39 @@ Textual 框架版本: {textual_version} event.stop() if event.button.id == "back_button": self.action_go_back() - + def _get_textual_version(self) -> str: """获取 Textual 框架版本""" try: import textual + return textual.__version__ - except (ImportError, AttributeError): + except ImportError, AttributeError: return "未知" - + def _get_terminal_info(self) -> str: """获取终端模拟器信息""" terminal = shutil.which("terminal") if terminal: return terminal # 尝试从环境变量获取 - terminal_env = os.environ.get('TERM_PROGRAM') or os.environ.get('TERM') + terminal_env = os.environ.get("TERM_PROGRAM") or os.environ.get("TERM") return terminal_env or "未知" - + def _get_python_version(self) -> str: """获取 Python 解释器版本""" return platform.python_version() - + def _get_os_version(self) -> str: """获取操作系统版本""" try: if platform.system() == "Darwin": # macOS import subprocess - result = subprocess.run(['sw_vers', '-productVersion'], - capture_output=True, text=True) + + result = subprocess.run( + ["sw_vers", "-productVersion"], capture_output=True, text=True + ) return f"macOS {result.stdout.strip()}" elif platform.system() == "Windows": # Windows @@ -133,30 +136,31 @@ Textual 框架版本: {textual_version} # Linux - 尝试获取发行版信息 try: import distro + return f"{distro.name()} {distro.version()}" - except (ImportError, AttributeError): + except ImportError, AttributeError: return platform.platform() else: return platform.platform() except Exception: return platform.platform() - + def _get_disk_usage(self) -> str: """获取磁盘使用情况""" try: - usage = psutil.disk_usage('/') - free_gb = usage.free / (1024 ** 3) - total_gb = usage.total / (1024 ** 3) + usage = psutil.disk_usage("/") + free_gb = usage.free / (1024**3) + total_gb = usage.total / (1024**3) percent_free = (free_gb / total_gb) * 100 return f"{free_gb:.1f} GB ({percent_free:.1f}%)" except Exception: return "未知" - + def _get_memory_info(self) -> str: """获取内存信息""" try: memory = psutil.virtual_memory() - total_gb = memory.total / (1024 ** 3) + total_gb = memory.total / (1024**3) return f"{total_gb:.1f} GB" except Exception: - return "未知" \ No newline at end of file + return "未知" diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index de85d2c..1fce3ee 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -35,6 +35,8 @@ class DashboardScreen(Screen): ("q", "go_back", "返回"), ] + CSS_PATH = Path(__file__).parent.parent / 'css' / "screens" / "dashboard.tcss" + def __init__( self, name: str | None = None, @@ -42,97 +44,91 @@ class DashboardScreen(Screen): classes: str | None = None, ) -> None: super().__init__(name, id, classes) - self.repostat = {} - self.title2dirname = {} - self.title2repo = {} - self.dirname2repo = {} - self._load_data() + self.repolink = {} def compose(self) -> ComposeResult: """组合界面组件""" + self._load_data() yield Header(show_clock=True) with ScrollableContainer(): - yield Horizontal( + yield Horizontal( # 顶部的状态 Vertical( Label(f'欢迎使用 "潜进" 版本 {version.ver}'), + Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()}"), Label( - f"当前 UNIX 日时间戳: {timer.get_daystamp()}" + f"应用时区修正: UTC+{config_var.get()['services']['timer']['timezone_offset'] / 3600}" ), - Label(f"应用时区修正: UTC+{config_var.get()['services']['timer']['timezone_offset'] / 3600}"), - Label(f"全局算法设置: {config_var.get()['interface']['global']['algorithm']}: {algorithms[config_var.get()['interface']['global']['algorithm']].desc}"), - classes="column infview", + Label( + f"默认算法设置: {config_var.get()['interface']['global']['algorithm']}" + ), + classes="left", ), Vertical( - Label(f"已加载 {len(self.repostat)} 个单元集", classes='dataview'), - Label(f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.get('unit_sum'), self.repostat.values()))} 个单元", classes='dataview'), - Label(f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.get('activated_sum'), self.repostat.values()))} 个单元", classes='dataview'), + Label(f"已加载 {len(self.repos)} 个单元集"), + Label( + f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.progress['total'], self.repos))} 个单元" + ), + Label( + f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.progress['touched'], self.repos))} 个单元" + ), Label(f""), - classes="column dataview", + classes="right", ), - id="dashboardtop" + id="header", ) - yield ListView(id="repo-list", classes="repo-list-view") - yield Label(f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} {version.stage.capitalize()}') + yield ListView(id="repo_list", classes="repo-list") # 单元集选择 + + yield Label( + f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} {version.stage.capitalize()}' + ) # 版本信息 yield Footer() def _load_data(self): - self.repo_dirs = Repo.probe_valid_repos_in_dir( - Path(config_var.get()['global']["paths"]["data"]) / "repo" + repo_dirs = Repo.probe_valid_repos_in_dir( + Path(config_var.get()["global"]["paths"]["repo"]) ) - for repo_dir in self.repo_dirs: - repo = Repo.create_from_repodir(repo_dir) + self.repos = list(map(Repo.from_repodir, repo_dirs)) + for repo in self.repos: self._analyse_repo(repo) def _analyse_repo(self, repo: Repo): - dirname = repo.source.name # type: ignore - title = repo.manifest["title"] - is_due = 0 - unit_sum = len(repo) - activated_sum = 0 - nextdate = float('inf') - for i in repo.ident_index: - nucleon = pt.Nucleon.create_on_nucleonic_data( - nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) - ) - electron = pt.Electron.create_on_electonic_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i), - algo_name=config_var.get()['repo'][repo.manifest['title']]['algorithm'] - ) - if electron.is_activated(): - activated_sum += 1 - if electron.is_due(): - is_due = 1 - nextdate = min(nextdate, electron.nextdate()) - is_unfinished = unit_sum > activated_sum - if is_unfinished: - nextdate = min(nextdate, timer.get_daystamp()) - need_to_study = is_due or is_unfinished - prompt = f"{title}\0\n 进度: {activated_sum}/{unit_sum} ({round(activated_sum/unit_sum*100)}%)\n {'需要学习' if need_to_study else '无需操作'}" - stat = { - "is_due": is_due, - "unit_sum": unit_sum, - "title": title, - "activated_sum": activated_sum, - "nextdate": nextdate, - "is_unfinished": is_unfinished, - "need_to_study": need_to_study, - "prompt": prompt, - "dirname": dirname, + # need_review: 需要/不需要学习 + # nearest_review_time: 最近下次学习时间 + # progress: 进度 + # algotype: 算法类型 + ## initial_time: 起始时间 + # package: 包名 + # prompt: 最终呈现信息 + repo.package = repo.manifest["package"] + repo.nearest_review_time = float("inf") + repo.progress = { + "total": repo.data_length, + "touched": 0, } - self.repostat[dirname] = stat - self.title2dirname[title] = dirname - self.title2repo[title] = repo - self.dirname2repo[dirname] = repo + initial_time = float("inf") + for i in range(repo.data_length): + e = pt.Electron.from_data(repo.electronic_data_lict[i]) + n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) + if e.is_activated(): + repo.algotype = e.algoname + repo.progress["touched"] += 1 + repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) + # initial_time = min(initial_time, e.) + repo.need_review = timer.get_daystamp() >= repo.nearest_review_time + repo.prompt = f"""{repo.manifest['title']} ({repo.algotype}) + 进度: {repo.progress['touched']}/{repo.progress['total']} ({round(repo.progress['touched']/repo.progress['total']*100, 1)}%) + {'需要学习' if repo.need_review else "无需操作"} + """ def on_mount(self) -> None: """挂载组件时初始化""" - repo_list_widget = self.query_one("#repo-list", ListView) + repo_list_widget = self.query_one("#repo_list", ListView) # 按下次复习时间排序 repodirs = sorted( - self.repo_dirs, - key=lambda f: self.repostat[f.name]["nextdate"], + self.repos, + key=lambda r: r.nearest_review_time, reverse=True, ) repotitles = map(lambda f: self.repostat[f.name]["title"], repodirs) @@ -141,43 +137,44 @@ class DashboardScreen(Screen): repo_list_widget.append( ListItem( Static( - "在 ./data/repo/ 中未找到任何仓库.\n" + f"在 {config_var.get()['global']['paths']['repo']} 中未找到任何仓库.\n" "请导入仓库后重启应用, 或者新建空的仓库." - ) + ), + id="not-found", ) ) repo_list_widget.disabled = True return - for repotitle in repotitles: - prompt = self.repostat[self.title2dirname[repotitle]]["prompt"] - list_item = ListItem(Label(prompt), Button(f"开始学习", flat=True, variant="primary", classes="repo_listitem_btn", id=f"launch_{self.repostat[self.title2dirname[repotitle]]['dirname']}"), classes="repo_listitem") + for r in self.repos: + self.repolink[str(id(r))] = r # 用于规避 ctype id 对象还原 + list_item = ListItem( + Label(r.prompt), + Button( + f"开始学习", + flat=True, + variant="primary", + id=f"slaunch_repo_{id(r)}", + classes="repo-list-item-shortcut", + ), + classes="repo-list-item", + id=f"launch_repo_{id(r)}", + ) repo_list_widget.append(list_item) - # if not self.stay_enabled[repodir]: - # list_item.disabled = True - def on_list_view_selected(self, event) -> None: """处理列表项选择事件""" if not isinstance(event.item, ListItem): return - selected_label = event.item.query_one(Label) - label_text = str(selected_label.render()) - - if "未找到任何仓库" in label_text: + if "not-found" == event.item.id: return - # 提取文件名 - selected_repotitle = label_text.partition("\0")[0].replace("*", "") - selected_repo = self.title2repo[label_text.partition("\0")[0].replace("*", "")] + # 还原对象 + selected_repo = self.repolink[event.item.id.lstrip("launch_repo_")] # 跳转到准备屏幕 - self.app.push_screen( - PreparationScreen( - selected_repo, self.repostat[self.title2dirname[selected_repotitle]] - ) - ) + self.app.push_screen(PreparationScreen(selected_repo)) def action_quit_app(self) -> None: """退出应用程序""" @@ -188,9 +185,10 @@ class DashboardScreen(Screen): self.app.push_screen(NavigatorScreen()) def on_button_pressed(self, event: Button.Pressed) -> None: - logger.debug(f"event.button.id: {event.button.id}") """处理按钮点击事件""" - if str(event.button.id).startswith("launch_"): # type: ignore + logger.debug(f"event.button.id: {event.button.id}") + if event.button.id.startswith("slaunch_repo_"): # type: ignore from .preparation import launch - launch(repo=self.dirname2repo[event.button.id[7:]], app=self.app, scheduled_num=-1) # type: ignore + + launch(repo=self.repolink[event.button.id.lstrip("slaunch_repo_")], app=self.app, scheduled_num=-1) # type: ignore # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index 4635cd4..01bf024 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -68,7 +68,7 @@ class FavoriteManagerScreen(Screen): if self.favorites: list_view = self.query_one("#favorites-list") for fav in self.favorites: - list_view.append(self._create_favorite_item(fav)) # type: ignore + list_view.append(self._create_favorite_item(fav)) # type: ignore def _encode_favorite_key(self, repo_path: str, ident: str) -> str: """编码仓库路径和标识符为安全的按钮 ID 部分""" @@ -115,12 +115,12 @@ class FavoriteManagerScreen(Screen): def _get_repo_info(self, repo_path: str, fav: FavoriteItem) -> Optional[dict]: """获取仓库信息(标题、原子内容预览)""" try: - data_repo = Path(config_var.get()['global']["paths"]["data"]) / "repo" + data_repo = Path(config_var.get()["global"]["paths"]["data"]) / "repo" repo_dir = data_repo / repo_path if not repo_dir.exists(): logger.warning("仓库目录不存在: %s", repo_dir) return None - repo = Repo.create_from_repodir(repo_dir) + repo = Repo.from_repodir(repo_dir) # 获取原子内容预览 content_preview = "" payload = repo.payload @@ -201,4 +201,4 @@ class FavoriteManagerScreen(Screen): def action_toggle_dark(self) -> None: """切换暗黑模式""" - self.app.dark = not self.app.dark # type: ignore + self.app.dark = not self.app.dark # type: ignore diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 1d7c877..68782d7 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -38,7 +38,7 @@ class MemScreen(Screen): ("0,1,2,3", "app.push_screen('about')", ""), ] - if config_var.get()['interface']['global']["quick_pass"]: + if config_var.get()["interface"]["global"]["quick_pass"]: BINDINGS.append(("k", "quick_pass", "正确应答")) BINDINGS.append(("f", "quick_fail", "错误应答")) rating = reactive(-1) @@ -70,7 +70,6 @@ class MemScreen(Screen): """更新状态机""" self.procession: Procession = self.phaser.current_procession() # type: ignore self.atom: pt.Atom = self.procession.current_atom # type: ignore - def on_mount(self): self.fission = self.procession.get_fission() @@ -93,7 +92,7 @@ class MemScreen(Screen): if self.repo is not None: fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" s += f"收藏: {fav_status}\n" - '''if config_var.get().get("debug_topline", 0): + """if config_var.get().get("debug_topline", 0): try: alia = self.fission.get_current_puzzle_inf()["alia"] # type: ignore s += f"谜题: {alia}\n" @@ -113,7 +112,7 @@ class MemScreen(Screen): stat = self.fission.__repr__("simple", "") s += f"{stat}\n" except Exception as e: - s = str(e)''' + s = str(e)""" s += f"进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s @@ -139,9 +138,9 @@ class MemScreen(Screen): i.remove() from heurams.interface.widgets.finished import Finished - if config_var.get()['interface']['global']["persist_to_file"]: + if config_var.get()["interface"]["global"]["persist_to_file"]: self.save_func() - container.mount(Finished(is_saved=['interface']['global']["persist_to_file"])) + container.mount(Finished(is_saved=["interface"]["global"]["persist_to_file"])) def on_button_pressed(self, event): event.stop() @@ -156,7 +155,7 @@ class MemScreen(Screen): from heurams.services.audio_service import play_by_path from heurams.services.hasher import get_md5 - path = Path(config_var.get()['global']["paths"]["data"]) / "cache" / "voice" + path = Path(config_var.get()["global"]["paths"]["data"]) / "cache" / "voice" path = path / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" if path.exists(): play_by_path(path) @@ -177,7 +176,6 @@ class MemScreen(Screen): self.forward(new_rating) self.rating = -1 - def forward(self, rating): self.update_state() allow_forward = 1 if rating >= 4 else 0 @@ -226,7 +224,7 @@ class MemScreen(Screen): return "" # self.repo.source 是 Path 对象,指向仓库目录 repo_full_path = self.repo.source - data_repo_path = Path(config_var.get()['global']["paths"]["data"]) / "repo" + data_repo_path = Path(config_var.get()["global"]["paths"]["data"]) / "repo" try: rel_path = repo_full_path.relative_to(data_repo_path) return str(rel_path) diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index b8e3d90..724ce7e 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -53,7 +53,11 @@ class NavigatorScreen(ModalScreen): ) yield Static("按下回车以完成切换\n所有会话将被保存") yield Button( - "关闭 (n)", id="close_button", variant="primary", classes="close-button", flat=True + "关闭 (n)", + id="close_button", + variant="primary", + classes="close-button", + flat=True, ) def on_mount(self) -> None: diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 4b3d055..e775c74 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -13,16 +13,16 @@ import heurams.services.hasher as hasher from heurams.context import * # 兼容性缓存路径:优先使用 paths.cache,否则使用 data/cache -paths = config_var.get()['global']["paths"] +paths = config_var.get()["global"]["paths"] cache_dir = pathlib.Path(paths.get("cache", paths["data"] + "/cache")) / "voice" def format_size(bytes_num: int) -> str: """将字节数格式化为人类可读的字符串""" - for unit in ['B', 'KB', 'MB', 'GB', 'TB']: + for unit in ["B", "KB", "MB", "GB", "TB"]: if bytes_num < 1024.0: return f"{bytes_num:.2f} {unit}" - bytes_num /= 1024.0 # type: ignore + bytes_num /= 1024.0 # type: ignore return f"{bytes_num:.2f} PB" @@ -54,16 +54,24 @@ class PrecachingScreen(Screen): self.cancel_flag = 0 self.desc = desc # 不再需要缓存配置,保留配置读取以兼容 - self.cache_stats = {"total_size": 0, "file_count": 0, "human_size": "0 B", "cached_units": 0, "total_units": 0, "cache_rate": 0} + self.cache_stats = { + "total_size": 0, + "file_count": 0, + "human_size": "0 B", + "cached_units": 0, + "total_units": 0, + "cache_rate": 0, + } self._update_cache_stats() def _get_total_units(self) -> int: """获取所有仓库的总单元数""" from heurams.context import config_var from heurams.kernel.repolib import Repo - repo_path = pathlib.Path(config_var.get()['global']["paths"]["data"]) / "repo" + + repo_path = pathlib.Path(config_var.get()["global"]["paths"]["data"]) / "repo" repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) - repos = map(Repo.create_from_repodir, repo_dirs) + repos = map(Repo.from_repodir, repo_dirs) total = 0 for repo in repos: try: @@ -86,7 +94,7 @@ class PrecachingScreen(Screen): cached_units += 1 total_units = self._get_total_units() cache_rate = (cached_units / total_units * 100) if total_units > 0 else 0 - + self.cache_stats["total_size"] = total_size self.cache_stats["file_count"] = file_count self.cache_stats["human_size"] = format_size(total_size) @@ -101,11 +109,15 @@ class PrecachingScreen(Screen): with Container(): yield Static( f"缓存率: {self.cache_stats.get('cache_rate', 0):.1f}% (已缓存 {self.cache_stats.get('cached_units', 0)} / {self.cache_stats.get('total_units', 0)} 个单元)", - classes="cache-usage-text" + classes="cache-usage-text", ) if self.nucleons: - yield Static(f"目标单元归属: [b]{self.desc}[/b]", classes="target-info") - yield Static(f"单元数量: {len(self.nucleons)}", classes="target-info") + yield Static( + f"目标单元归属: [b]{self.desc}[/b]", classes="target-info" + ) + yield Static( + f"单元数量: {len(self.nucleons)}", classes="target-info" + ) else: yield Static("目标: 所有单元", classes="target-info") @@ -114,16 +126,26 @@ class PrecachingScreen(Screen): yield ProgressBar(total=100, show_eta=False, id="progress_bar") with Horizontal(classes="button-group"): if not self.is_precaching: - yield Button("开始预缓存", id="start_precache", variant="primary") + yield Button( + "开始预缓存", id="start_precache", variant="primary" + ) else: - yield Button("取消预缓存", id="cancel_precache", variant="error") + yield Button( + "取消预缓存", id="cancel_precache", variant="error" + ) yield Button("清空缓存", id="clear_cache", variant="warning") yield Button("返回", id="go_back", variant="default") with Container(classes="cache-info"): yield Static(f"缓存路径: {cache_dir}", classes="cache-path") - yield Static(f"文件数: {self.cache_stats['file_count']}", classes="cache-count") - yield Static(f"总大小: {self.cache_stats['human_size']}", classes="cache-size") - yield Button("刷新", id="refresh_cache_stats", variant="default", flat=True) + yield Static( + f"文件数: {self.cache_stats['file_count']}", classes="cache-count" + ) + yield Static( + f"总大小: {self.cache_stats['human_size']}", classes="cache-size" + ) + yield Button( + "刷新", id="refresh_cache_stats", variant="default", flat=True + ) yield Static("若您离开此界面, 未完成的缓存进程会自动停止.") yield Static('缓存程序支持 "断点续传".') @@ -230,9 +252,9 @@ class PrecachingScreen(Screen): from heurams.context import config_var, rootdir, workdir from heurams.kernel.repolib import Repo - repo_path = pathlib.Path(config_var.get()['global']["paths"]["data"]) / "repo" + repo_path = pathlib.Path(config_var.get()["global"]["paths"]["data"]) / "repo" repo_dirs = Repo.probe_valid_repos_in_dir(repo_path) - repos = map(Repo.create_from_repodir, repo_dirs) + repos = map(Repo.from_repodir, repo_dirs) # 计算总项目数 self.total = 0 @@ -241,7 +263,7 @@ class PrecachingScreen(Screen): try: for i in repo.ident_index: nucleon_list.append( - pt.Nucleon.create_on_nucleonic_data( + pt.Nucleon.from_data( repo.nucleonic_data_lict.get_itemic_unit(i) ) ) diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 3a151a8..b9de967 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -5,7 +5,16 @@ from textual.containers import ScrollableContainer from textual.reactive import reactive from textual.screen import Screen from textual.widget import Widget -from textual.widgets import Button, Footer, Header, Label, Markdown, Static, Rule, Sparkline +from textual.widgets import ( + Button, + Footer, + Header, + Label, + Markdown, + Static, + Rule, + Sparkline, +) import heurams.kernel.particles as pt import heurams.services.hasher as hasher @@ -28,20 +37,19 @@ class PreparationScreen(Screen): ("0,1,2,3", "app.push_screen('about')", ""), ] - scheduled_num = reactive(config_var.get()['interface']['global']["scheduled_num"]) + scheduled_num = reactive(config_var.get()["interface"]["global"]["scheduled_num"]) - def __init__(self, repo: Repo, repostat: dict) -> None: + def __init__(self, repo: Repo) -> None: super().__init__(name=None, id=None, classes=None) self.repo = repo - self.repostat = repostat self.load_data() def compose(self) -> ComposeResult: yield Header(show_clock=True) with ScrollableContainer(id="vice_container"): - yield Label(f"准备就绪: [b]{self.repostat['title']}[/b]\n") + yield Label(f"准备就绪: [b]{self.repo.manifest['title']}[/b]\n") yield Label( - f"仓库路径: {config_var.get()['global']['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]" + f"[b]仓库路径: {self.repo.source}[/b]" ) yield Label(f"\n单元数量: {len(self.repo)}\n") yield Label(f"最小记忆分组: {self.scheduled_num}\n", id="schnum_label") @@ -62,12 +70,12 @@ class PreparationScreen(Screen): yield Static() yield Sparkline(self.spark_line_arr, summary_function=max) yield Rule() - #yield Static(str(self.spark_line_arr)) + # yield Static(str(self.spark_line_arr)) yield Static(f"单元状态预览:\n") for i in self.content.splitlines(): yield Static(i, classes="full") yield Footer() - + # def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num): # logger.debug("响应", old_scheduled_num, "->", new_scheduled_num) # try: @@ -80,19 +88,21 @@ class PreparationScreen(Screen): content = "" spark_line_arr = [] for i in self.repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data( + n = pt.Nucleon.from_data( nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) ) - e = pt.Electron.create_on_electonic_data(electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i)) + e = pt.Electron.from_data( + electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i) + ) statstr = "" if e.is_activated(): - statstr = '[#00ff00]A[/]' + statstr = "[#00ff00]A[/]" if e.is_due(): - statstr = '[#ffff00]R[/]' - #statstr += ('[dim]' + str(e.rept(real_rept=True)).zfill(2)+'[/]') + statstr = "[#ffff00]R[/]" + # statstr += ('[dim]' + str(e.rept(real_rept=True)).zfill(2)+'[/]') else: - statstr = '[#ff0000]U[/]' + statstr = "[#ff0000]U[/]" spark_line_arr.append(e.rept(real_rept=True)) content += f" {statstr} {n['content'].replace('/', '')} \n" self.content = content @@ -107,9 +117,7 @@ class PreparationScreen(Screen): lst = list() for i in self.repo.ident_index: lst.append( - pt.Nucleon.create_on_nucleonic_data( - self.repo.nucleonic_data_lict.get_itemic_unit(i) - ) + pt.Nucleon.from_data(self.repo.nucleonic_data_lict.get_itemic_unit(i)) ) precache_screen = PrecachingScreen( nucleons=lst, desc=self.repo.manifest["title"] @@ -128,15 +136,16 @@ class PreparationScreen(Screen): elif event.button.id == "precache_button": self.action_precache() + def launch(repo, app, scheduled_num): if scheduled_num == -1: - scheduled_num = config_var.get()['interface']['global']["scheduled_num"] + scheduled_num = config_var.get()["interface"]["global"]["scheduled_num"] atoms = list() for i in repo.ident_index: - n = pt.Nucleon.create_on_nucleonic_data( + n = pt.Nucleon.from_data( nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) ) - e = pt.Electron.create_on_electonic_data( + e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict.get_itemic_unit(i) ) a = pt.Atom(n, e, repo.orbitic_data) diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index 04c9f60..9976d74 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -8,7 +8,19 @@ import os from textual.app import ComposeResult from textual.containers import ScrollableContainer, Container, Horizontal, Vertical from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Collapsible, Input, Switch, Select +from textual.widgets import ( + Button, + Footer, + Header, + Label, + ListItem, + ListView, + Static, + Collapsible, + Input, + Switch, + Select, +) from textual.layouts import horizontal import heurams.kernel.particles as pt @@ -45,13 +57,15 @@ class SettingScreen(Screen): """组合界面组件""" yield Header(show_clock=True) with ScrollableContainer(): - yield Label('[b]设置页面[/b]') + yield Label("[b]设置页面[/b]") for i in config_var.get(): - if i.startswith('_'): + if i.startswith("_"): continue - a = self._get_subcfg(f'{i}') + a = self._get_subcfg(f"{i}") if a: - yield Collapsible(*a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}') + yield Collapsible( + *a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}' + ) yield Footer() def _get_subcfg(self, parent_epath: str): @@ -60,61 +74,115 @@ class SettingScreen(Screen): if parent.is_dir: lst = list() for i in parent: - if i.startswith('_'): + if i.startswith("_"): continue a = self._get_subcfg(f"{parent_epath}.{i}") if a: - lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}')) + lst.append( + Collapsible( + *a, title=i + f'\n{parent.get(f"_{i}_desc", "")}' + ) + ) return lst - if isinstance(parent, dict) or (isinstance(parent, ConfigDict) and not parent.is_dir): + if isinstance(parent, dict) or ( + isinstance(parent, ConfigDict) and not parent.is_dir + ): lst = list() for i in parent: - if i.startswith('_'): + if i.startswith("_"): continue if isinstance(parent[i], dict): a = self._get_subcfg(f"{parent_epath}.{i}") if a: - lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}')) - elif f'_{i}_candidate' in parent: # 选择框模式 - if isinstance(parent[f'_{i}_candidate'], dict): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Select(((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")), - classes='container' - )) - elif isinstance(parent[f'_{i}_candidate'], list): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Select(((j, j) for j in parent[f'_{i}_candidate']), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")), - classes='container' - )) + lst.append( + Collapsible( + *a, title=i + f'\n{parent.get(f"_{i}_desc", "")}' + ) + ) + elif f"_{i}_candidate" in parent: # 选择框模式 + if isinstance(parent[f"_{i}_candidate"], dict): + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Select( + ( + (f"{j} ({k})", j) + for j, k in parent[f"_{i}_candidate"].items() + ), + prompt=f'{parent.get(f"{i}", "")}', + id=domize(f"{parent_epath}.{i}"), + ), + classes="container", + ) + ) + elif isinstance(parent[f"_{i}_candidate"], list): + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Select( + ((j, j) for j in parent[f"_{i}_candidate"]), + prompt=f'{parent.get(f"{i}", "")}', + id=domize(f"{parent_epath}.{i}"), + ), + classes="container", + ) + ) else: if isinstance(parent[i], float): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Input(value=str(parent[i]), placeholder='要求一个浮点数', type='number', id=domize(f"{parent_epath}.{i}")), - classes='container')) + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input( + value=str(parent[i]), + placeholder="要求一个浮点数", + type="number", + id=domize(f"{parent_epath}.{i}"), + ), + classes="container", + ) + ) elif isinstance(parent[i], str): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Input(value=parent[i], placeholder='要求一个字符串', type='text', id=domize(f"{parent_epath}.{i}")), - classes='container')) + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input( + value=parent[i], + placeholder="要求一个字符串", + type="text", + id=domize(f"{parent_epath}.{i}"), + ), + classes="container", + ) + ) elif isinstance(parent[i], bool): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Switch(value=parent[i], id=domize(f"{parent_epath}.{i}")), - classes='container')) + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Switch( + value=parent[i], id=domize(f"{parent_epath}.{i}") + ), + classes="container", + ) + ) elif isinstance(parent[i], int): - lst.append(Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), - Input(value=str(parent[i]), placeholder='要求一个整数', type='integer', id=domize(f"{parent_epath}.{i}")), - classes='container')) + lst.append( + Horizontal( + Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Input( + value=str(parent[i]), + placeholder="要求一个整数", + type="integer", + id=domize(f"{parent_epath}.{i}"), + ), + classes="container", + ) + ) elif isinstance(parent[i], list): pass else: - lst.append(Label('未知类型')) + lst.append(Label("未知类型")) return lst - return [Label('无子项')] + return [Label("无子项")] def on_mount(self) -> None: """挂载组件时初始化""" @@ -133,14 +201,18 @@ class SettingScreen(Screen): """打开导航器""" self.app.push_screen(NavigatorScreen()) - def on_input_changed(self, event: Input.Changed) -> None: widget_id = event.input.id if not widget_id: return eepath = undomize(widget_id) value = event.value - epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) + epath( + config_var.get(), + eepath, + enable_modify=True, + new_value=type(epath(config_var.get(), eepath))(value), + ) def on_switch_changed(self, event: Switch.Changed) -> None: widget_id = event.switch.id @@ -148,7 +220,12 @@ class SettingScreen(Screen): return eepath = undomize(widget_id) value = event.value - epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) + epath( + config_var.get(), + eepath, + enable_modify=True, + new_value=type(epath(config_var.get(), eepath))(value), + ) def on_select_changed(self, event: Select.Changed) -> None: widget_id = event.select.id @@ -156,4 +233,9 @@ class SettingScreen(Screen): return eepath = undomize(widget_id) value = event.value - epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value)) \ No newline at end of file + epath( + config_var.get(), + eepath, + enable_modify=True, + new_value=type(epath(config_var.get(), eepath))(value), + ) diff --git a/src/heurams/interface/widgets/base_puzzle_widget.py b/src/heurams/interface/widgets/base_puzzle_widget.py index e0eba81..46fd537 100644 --- a/src/heurams/interface/widgets/base_puzzle_widget.py +++ b/src/heurams/interface/widgets/base_puzzle_widget.py @@ -15,7 +15,7 @@ class BasePuzzleWidget(Widget): id: str | None = None, classes: str | None = None, disabled: bool = False, - markup: bool = True + markup: bool = True, ) -> None: super().__init__( *children, @@ -23,7 +23,7 @@ class BasePuzzleWidget(Widget): id=id, classes=classes, disabled=disabled, - markup=markup + markup=markup, ) self.atom = atom diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 3a9a980..12a9e13 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -83,7 +83,7 @@ class ClozePuzzle(BasePuzzleWidget): if lst: lastone = lst[-1] for i in lst[:-1]: - s += (i + ' ') + s += i + " " s += f" `{lastone}`" return s diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index d724a15..400a601 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -55,8 +55,8 @@ class MCQPuzzle(BasePuzzleWidget): def _load(self): cfg = self.atom.registry["nucleon"]["puzzles"][self.alia] - if cfg['mapping'] == {}: - self.screen.rating = 5 # type: ignore + if cfg["mapping"] == {}: + self.screen.rating = 5 # type: ignore self.puzzle = pz.MCQPuzzle( cfg["mapping"], cfg["jammer"], int(cfg["max_riddles_num"]), cfg["prefix"] ) diff --git a/src/heurams/interface/widgets/placeholder.py b/src/heurams/interface/widgets/placeholder.py index e5e7b70..9814e9e 100644 --- a/src/heurams/interface/widgets/placeholder.py +++ b/src/heurams/interface/widgets/placeholder.py @@ -11,7 +11,7 @@ class Placeholder(Widget): id: str | None = None, classes: str | None = None, disabled: bool = False, - markup: bool = True + markup: bool = True, ) -> None: super().__init__( *children, @@ -19,7 +19,7 @@ class Placeholder(Widget): id=id, classes=classes, disabled=disabled, - markup=markup + markup=markup, ) def compose(self): diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 0162519..9504e5d 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -67,7 +67,7 @@ class Recognition(BasePuzzleWidget): f";{delim}": ";", f":{delim}": ":", } - + primary = cfg["primary"] with Center(): @@ -88,7 +88,7 @@ class Recognition(BasePuzzleWidget): for item in cfg["secondary"]: if isinstance(item, list): for j in item: - yield Markdown(f"### 笔记: {j}") #TODO ANNOTATION + yield Markdown(f"### 笔记: {j}") # TODO ANNOTATION continue if isinstance(item, Dict): total = "" diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index c89839d..b71d6c9 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -8,7 +8,8 @@ logger = get_logger(__name__) class BaseAlgorithm: algo_name = "BaseAlgorithm" - desc = '算法基类' + desc = "算法基类" + class AlgodataDict(TypedDict): real_rept: int rept: int diff --git a/src/heurams/kernel/algorithms/nsp0.py b/src/heurams/kernel/algorithms/nsp0.py index 752a833..45557d2 100644 --- a/src/heurams/kernel/algorithms/nsp0.py +++ b/src/heurams/kernel/algorithms/nsp0.py @@ -10,7 +10,8 @@ logger = get_logger(__name__) class NSP0Algorithm(BaseAlgorithm): algo_name = "NSP-0" - desc = '快速筛选用特殊调度器' + desc = "快速筛选用特殊调度器" + class AlgodataDict(TypedDict): real_rept: int rept: int @@ -23,7 +24,7 @@ class NSP0Algorithm(BaseAlgorithm): defaults = { "real_rept": 0, - 'important': 0, + "important": 0, "rept": 0, "interval": 0, "last_date": 0, @@ -52,8 +53,10 @@ class NSP0Algorithm(BaseAlgorithm): if feedback == -1: logger.debug("feedback 为 -1, 跳过更新") return - algodata[cls.algo_name]["interval"] = (1 if feedback <= 3 else float('inf')) - algodata[cls.algo_name]["important"] = (1 if feedback <= 3 else algodata[cls.algo_name]["important"]) + algodata[cls.algo_name]["interval"] = 1 if feedback <= 3 else float("inf") + algodata[cls.algo_name]["important"] = ( + 1 if feedback <= 3 else algodata[cls.algo_name]["important"] + ) algodata[cls.algo_name]["last_date"] = timer.get_daystamp() algodata[cls.algo_name]["next_date"] = ( timer.get_daystamp() + algodata[cls.algo_name]["interval"] diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 83fa9e8..6f84996 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -27,7 +27,7 @@ from heurams.kernel.algorithms.sm15m_calc import ( # 全局状态文件路径 _GLOBAL_STATE_FILE = os.path.expanduser( - pathlib.Path(config_var.get()['global']["paths"]["data"]) + pathlib.Path(config_var.get()["global"]["paths"]["data"]) / "global" / "sm15m_global_state.json" ) diff --git a/src/heurams/kernel/algorithms/sm2.py b/src/heurams/kernel/algorithms/sm2.py index aa49538..bb8d187 100644 --- a/src/heurams/kernel/algorithms/sm2.py +++ b/src/heurams/kernel/algorithms/sm2.py @@ -10,7 +10,8 @@ logger = get_logger(__name__) class SM2Algorithm(BaseAlgorithm): algo_name = "SM-2" - desc = '经典间隔重复算法' + desc = "经典间隔重复算法" + class AlgodataDict(TypedDict): efactor: float real_rept: int diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index cc2baef..c572755 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -32,7 +32,7 @@ class Atom: default_runtime = { "locked": False, - "min_rate": float('inf'), + "min_rate": float("inf"), "new_activation": False, } diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 8f4901c..0bfeb7d 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -24,6 +24,7 @@ class Electron: algo_name = "SM-2" self.algodata = algodata self.ident = ident + self.algoname = algo_name self.algo: algolib.BaseAlgorithm = algorithms[algo_name] if not self.algo.check_integrity(self.algodata): @@ -53,10 +54,10 @@ class Electron: result = self.algo.is_due(self.algodata) return result and self.is_activated() - def rept(self, real_rept = False): + def rept(self, real_rept=False): if real_rept: - return self.algodata[self.algo.algo_name]['real_rept'] - return self.algodata[self.algo.algo_name]['rept'] + return self.algodata[self.algo.algo_name]["real_rept"] + return self.algodata[self.algo.algo_name]["rept"] def is_activated(self): result = self.algodata[self.algo.algo_name]["is_activated"] @@ -112,7 +113,7 @@ class Electron: return len(self.algodata[self.algo.algo_name]) @staticmethod - def create_on_electonic_data(electronic_data: tuple, algo_name: str = ""): + def from_data(electronic_data: tuple, algo_name: str = ""): _data = electronic_data ident = _data[0] algodata = _data[1] diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 17affdb..8435644 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -15,26 +15,26 @@ class Nucleon: self.ident = ident try: data_safe = deepcopy((payload | common)) - data_puz = deepcopy(data_safe['puzzles']) - data_safe['puzzles'] = {} + data_puz = deepcopy(data_safe["puzzles"]) + data_safe["puzzles"] = {} env = { "payload": data_safe, - "default": config_var.get()['interface']["puzzles"], + "default": config_var.get()["interface"]["puzzles"], "nucleon": data_safe, } self.evalizer = Evalizer(environment=env) data_safe = self.evalizer(deepcopy(data_safe)) env = { "payload": data_safe, - "default": config_var.get()['interface']["puzzles"], + "default": config_var.get()["interface"]["puzzles"], "nucleon": data_safe, } self.evalizer = Evalizer(environment=env) data_puz = self.evalizer(deepcopy(data_puz)) - data_safe['puzzles'] = data_puz # type: ignore - self.data: dict = data_safe # type: ignore + data_safe["puzzles"] = data_puz # type: ignore + self.data: dict = data_safe # type: ignore except Exception: - self.data = (payload | common) + self.data = payload | common def __getitem__(self, key): if isinstance(key, str): @@ -71,7 +71,7 @@ class Nucleon: return s @staticmethod - def create_on_nucleonic_data(nucleonic_data: tuple): + def from_data(nucleonic_data: tuple): _data = nucleonic_data payload = _data[1][0] common = _data[1][1] diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/fission.py index cf6cd8b..4d1d100 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/fission.py @@ -75,7 +75,7 @@ class Fission(Machine): self.current_puzzle_inf = self.puzzles_inf[0] for i in range(len(self.puzzles_inf)): - self.min_ratings.append(float('inf')) + self.min_ratings.append(float("inf")) Machine.__init__( self, diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index b863a34..b8cd9a5 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -13,10 +13,14 @@ from heurams.kernel.auxiliary.lict import Lict class RepoManifest(TypedDict): title: str author: str + package: str desc: str class Repo: + """只维护仓库本身 + 上层 API 请访问此对象下粒子对象列表""" + file_mapping = { "schedule": "schedule.toml", "payload": "payload.toml", @@ -58,14 +62,15 @@ class Repo: "algodata": self.algodata, "source": self.source, } - self.generate_particles_data() - - def generate_particles_data(self): + self._generate_particles_data() + def _generate_particles_data(self): + """生成上层的粒子对象组和 API 交互, 会在 init 后自动调用""" self.nucleonic_data_lict = Lict( initlist=list(map(self._nucleonic_proc, self.payload)) ) self.orbitic_data = self.schedule + self.data_length = len(self.nucleonic_data_lict) self.ident_index = self.nucleonic_data_lict.keys() for i in self.ident_index: self.algodata.append_new((i, {})) @@ -76,13 +81,6 @@ class Repo: common = self.typedef["common"] return (ident, (unit[1], common)) - @staticmethod - def _merge(value): - def inner(x): - return (x, value) - - return inner - def __len__(self): return len(self.payload) @@ -95,6 +93,7 @@ class Repo: def persist_to_repodir( self, save_list: list | None = None, source: Path | None = None ): + """保存单元集数据到目录""" if save_list == None: save_list = self.default_save_list if self.source != None and source == None: @@ -116,11 +115,13 @@ class Repo: else: raise ValueError(f"不支持的文件类型: {filename}") - def export_to_single_dict(self): + def export_to_dict(self): + """导出至单个字典""" return self.database @classmethod def create_new_repo(cls, source=None): + """创建新的空单元集""" default_database = { "schedule": {}, "payload": Lict([]), @@ -132,7 +133,8 @@ class Repo: return Repo(**default_database) @classmethod - def create_from_repodir(cls, source: Path): + def from_repodir(cls, source: Path): + """从目录创建单元集""" database = {} for keyname, filename in cls.file_mapping.items(): with open(source / filename, "r") as f: @@ -153,21 +155,24 @@ class Repo: return Repo(**database) @classmethod - def create_from_single_dict(cls, dictdata, source: Path | None = None): + def from_dict(cls, dictdata, source: Path | None = None): + """从单一字典创建单元集""" database = dictdata database["source"] = source return Repo(**database) @classmethod def check_repodir(cls, source: Path): + """检测单元集目录合法性""" try: - cls.create_from_repodir(source) - return 1 + cls.from_repodir(source) + return True except: - return 0 + return False @classmethod def probe_valid_repos_in_dir(cls, folder: Path): + """返回一个合法的子目录 Path() 列表""" lst = list() for i in folder.iterdir(): if i.is_dir(): diff --git a/src/heurams/services/audio_service.py b/src/heurams/services/audio_service.py index 4eefd11..c662d10 100644 --- a/src/heurams/services/audio_service.py +++ b/src/heurams/services/audio_service.py @@ -1,4 +1,5 @@ """音频服务""" + from typing import Callable from heurams.context import config_var @@ -7,7 +8,10 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -play_by_path: Callable = prov[config_var.get()["services"]["audio"]['provider']].play_by_path +play_by_path: Callable = prov[ + config_var.get()["services"]["audio"]["provider"] +].play_by_path logger.debug( - "音频服务初始化完成, 使用 Provider: %s", config_var.get()["services"]["audio"]['provider'] + "音频服务初始化完成, 使用 Provider: %s", + config_var.get()["services"]["audio"]["provider"], ) diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index 9f6b2a5..d52355a 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -11,26 +11,27 @@ from heurams.services.exceptions import WTFException # 我们的流程是: 找到文件名: 返回文件名里头的数据; 找不到: 继续查索引; 所以 self.data 除了存本级各种索引球用没得 logger = get_logger(__name__) -class ConfigDict(UserDict): # 舒服了 - _instances = {} # 必须使用单例模式, 不然有严重的多实例导致的配置无法持久化问题 + +class ConfigDict(UserDict): # 舒服了 + _instances = {} # 必须使用单例模式, 不然有严重的多实例导致的配置无法持久化问题 def __new__(cls, config_path: pathlib.Path, dict=None): if dict: raise WTFException("不要放默认值...") - + # 规范化路径, 免得单例存在"别名" path_key = config_path.resolve() - + if path_key in cls._instances: return cls._instances[path_key] - + instance = super().__new__(cls) cls._instances[path_key] = instance return instance - def __init__(self, config_path: pathlib.Path, dict = None): # 需要自己把自己提起来 + def __init__(self, config_path: pathlib.Path, dict=None): # 需要自己把自己提起来 # 避免重复初始化 - if hasattr(self, '_initialized'): + if hasattr(self, "_initialized"): return self._initialized = True if dict: @@ -42,13 +43,13 @@ class ConfigDict(UserDict): # 舒服了 if self.is_dir: self.update_index() else: - with open(self.path, 'r+') as f: #TODO: 给这个做缓存 + with open(self.path, "r+") as f: # TODO: 给这个做缓存 try: self.data = toml.load(f) except: self.data = {} - self.persist = lambda: False # 不修改错误的配置文件 - + self.persist = lambda: False # 不修改错误的配置文件 + def __getitem__(self, key): # 我们实现了先进的懒狗加载 value = super().__getitem__(key) @@ -60,7 +61,7 @@ class ConfigDict(UserDict): # 舒服了 return super().__contains__(key) def __setitem__(self, key, value): - origvalue = super().__getitem__(key) # 所以你不该访问不存在的对象 + origvalue = super().__getitem__(key) # 所以你不该访问不存在的对象 if isinstance(origvalue, ConfigDict): if origvalue.path.is_dir(): raise WTFException("你怎么能变更目录配置的内容呢?!") @@ -70,20 +71,22 @@ class ConfigDict(UserDict): # 舒服了 origvalue.data = value super().__setitem__(key, value) - def update_index(self): # 如果有人没事干在config里面创建指向config的符号链接 这玩意会崩溃 但是不要修复: 需要这个符号链接特性 + def update_index( + self, + ): # 如果有人没事干在config里面创建指向config的符号链接 这玩意会崩溃 但是不要修复: 需要这个符号链接特性 for i in self.path.iterdir(): - if i.name.startswith('_'): - if i.name == '_.toml' and not i.is_dir(): - with open(self.path/'_.toml', 'r+') as f: + if i.name.startswith("_"): + if i.name == "_.toml" and not i.is_dir(): + with open(self.path / "_.toml", "r+") as f: self.data.update(dict(toml.load(f))) continue if i.is_dir(): self.data[i.name] = i else: - if i.suffix == '.toml': + if i.suffix == ".toml": self.data[i.stem] = i else: - logger.debug(f"配置目录中有无效的文件 {i.stem}") # what's up bro + logger.debug(f"配置目录中有无效的文件 {i.stem}") # what's up bro def persist(self): if self.is_dir: @@ -94,5 +97,5 @@ class ConfigDict(UserDict): # 舒服了 logger.debug("完成配置持久化") return - with open(self.path, 'w+') as f: - toml.dump(self.data, f) \ No newline at end of file + with open(self.path, "w+") as f: + toml.dump(self.data, f) diff --git a/src/heurams/services/epath.py b/src/heurams/services/epath.py index 91d0504..c9fa953 100644 --- a/src/heurams/services/epath.py +++ b/src/heurams/services/epath.py @@ -3,27 +3,41 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -def epath(dct, path: str = '', default=None, parents=False, enable_modify=False, new_value=None): + +def epath( + dct, + path: str = "", + default=None, + parents=False, + enable_modify=False, + new_value=None, +): if not path: return dct - - path = path.rstrip('.') - path = path.lstrip('.') + + path = path.rstrip(".") + path = path.lstrip(".") target = dct - keys = path.split('.') + keys = path.split(".") logger.debug(f"处理 EPATH {path}, {new_value}") for idx, i in enumerate(keys): - is_last = (idx == len(keys) - 1) - + is_last = idx == len(keys) - 1 + # 处理字典键 - logger.debug(f'处理 {i}, {(isinstance(target, dict) or isinstance(target, ConfigDict))} {i in target}') - + logger.debug( + f"处理 {i}, {(isinstance(target, dict) or isinstance(target, ConfigDict))} {i in target}" + ) + if is_last and enable_modify: # 最后一次循环执行修改 - if (isinstance(target, dict) or isinstance(target, ConfigDict)): + if isinstance(target, dict) or isinstance(target, ConfigDict): target[i] = new_value return new_value - elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): + elif ( + i.startswith("[") + and i.endswith("]") + and isinstance(target, (list, tuple)) + ): idx_num = int(i[1:-1]) if 0 <= idx_num < len(target): target[idx_num] = new_value @@ -38,9 +52,15 @@ def epath(dct, path: str = '', default=None, parents=False, enable_modify=False, else: return default else: - if (isinstance(target, dict) or isinstance(target, ConfigDict)) and i in target: + if ( + isinstance(target, dict) or isinstance(target, ConfigDict) + ) and i in target: target = target[i] - elif i.startswith('[') and i.endswith(']') and isinstance(target, (list, tuple)): + elif ( + i.startswith("[") + and i.endswith("]") + and isinstance(target, (list, tuple)) + ): idx_num = int(i[1:-1]) if 0 <= idx_num < len(target): target = target[idx_num] @@ -56,5 +76,5 @@ def epath(dct, path: str = '', default=None, parents=False, enable_modify=False, target = target[i] else: return default - - return target \ No newline at end of file + + return target diff --git a/src/heurams/services/exceptions.py b/src/heurams/services/exceptions.py index 3708473..741b86a 100644 --- a/src/heurams/services/exceptions.py +++ b/src/heurams/services/exceptions.py @@ -1,4 +1,5 @@ from heurams.services.logger import get_logger + class WTFException(Exception): - pass \ No newline at end of file + pass diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py index e0939e4..b21e804 100644 --- a/src/heurams/services/favorite_service.py +++ b/src/heurams/services/favorite_service.py @@ -63,7 +63,7 @@ class FavoriteManager: def _get_file_path(self) -> Path: """获取收藏文件路径""" - config_path = Path(config_var.get()['global']["paths"]["data"]) + config_path = Path(config_var.get()["global"]["paths"]["data"]) fav_path = config_path / "global" / "favorites.json" fav_path.parent.mkdir(parents=True, exist_ok=True) return fav_path diff --git a/src/heurams/services/textproc.py b/src/heurams/services/textproc.py index 0df352a..dc9030e 100644 --- a/src/heurams/services/textproc.py +++ b/src/heurams/services/textproc.py @@ -3,8 +3,10 @@ def truncate(text): return text return text[:3] + ">" + def domize(text): - return text.replace('.', '--DOT--') + return text.replace(".", "--DOT--") + def undomize(text): - return text.replace('--DOT--', '.') \ No newline at end of file + return text.replace("--DOT--", ".") diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index ec52336..6081401 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -9,12 +9,15 @@ logger = get_logger(__name__) def get_daystamp() -> int: """获取当前日戳(以天为单位的整数时间戳)""" - time_override = config_var.get()['services']["timer"]["daystamp_override"] + time_override = config_var.get()["services"]["timer"]["daystamp_override"] if time_override != -1: logger.debug("使用覆盖的日戳: %d", time_override) return int(time_override) - result = int((time.time() + config_var.get()['services']["timer"]["timezone_offset"]) // (24 * 3600)) + result = int( + (time.time() + config_var.get()["services"]["timer"]["timezone_offset"]) + // (24 * 3600) + ) logger.debug("计算日戳: %d", result) return result @@ -22,7 +25,7 @@ def get_daystamp() -> int: def get_timestamp() -> float: """获取 UNIX 时间戳""" # 搞这个类的原因是要支持可复现操作 - time_override = config_var.get()['services']["timer"]["timestamp_override"] + time_override = config_var.get()["services"]["timer"]["timestamp_override"] if time_override != -1: logger.debug("使用覆盖的时间戳: %f", time_override) return float(time_override) diff --git a/src/heurams/services/tts_service.py b/src/heurams/services/tts_service.py index 71d4524..f9ed645 100644 --- a/src/heurams/services/tts_service.py +++ b/src/heurams/services/tts_service.py @@ -7,7 +7,8 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -convertor: Callable = prov[config_var.get()['services']["tts"]["provider"]].convert +convertor: Callable = prov[config_var.get()["services"]["tts"]["provider"]].convert logger.debug( - "TTS 服务初始化完成, 使用 provider: %s", config_var.get()['services']["tts"]["provider"] + "TTS 服务初始化完成, 使用 provider: %s", + config_var.get()["services"]["tts"]["provider"], ) diff --git a/src/heurams/tools/csv2payload.py b/src/heurams/tools/csv2payload.py index 4caa023..509b69c 100755 --- a/src/heurams/tools/csv2payload.py +++ b/src/heurams/tools/csv2payload.py @@ -23,7 +23,7 @@ ident, content, meaning, ... , "Woof", "狗发出的声音" ``` -转换后的 TOML: +转换后的 TOML: ```toml [Fox] content = "Fox" @@ -65,6 +65,7 @@ meaning = "狗发出的声音" - 如果 CSV 包含更多列,它们也会以相同方式转换为键值对 - 支持 `-r` 参数指定随机种子来打乱 section 顺序 """ + import csv import sys import os @@ -72,10 +73,11 @@ import random import argparse from pathlib import Path + def csv_to_toml(csv_path, toml_path=None, random_seed=None): """ 将CSV文件转换为TOML格式 - + Args: csv_path (str): 输入CSV文件路径 toml_path (str): 输出TOML文件路径,默认为相同目录下同名文件 @@ -86,92 +88,97 @@ def csv_to_toml(csv_path, toml_path=None, random_seed=None): if not csv_file.exists(): print(f"错误: CSV文件不存在 - {csv_path}") sys.exit(1) - + # 确定输出TOML文件路径 if toml_path is None: - toml_path = csv_file.with_suffix('.toml') + toml_path = csv_file.with_suffix(".toml") else: toml_path = Path(toml_path) - + # 读取CSV文件 try: - with open(csv_file, 'r', encoding='utf-8') as f: + with open(csv_file, "r", encoding="utf-8") as f: reader = csv.DictReader(f) rows = list(reader) except Exception as e: print(f"错误: 无法读取CSV文件 - {e}") sys.exit(1) - + # 检查CSV文件是否有数据 if not rows: print("错误: CSV文件为空或格式不正确") sys.exit(1) - + # 如果指定了随机种子,设置随机种子并打乱行顺序 if random_seed is not None: random.seed(random_seed) random.shuffle(rows) print(f"提示: 使用随机种子 {random_seed} 打乱了 section 顺序") - + # 生成TOML内容 toml_content = [] idx_counter = 1 - + for row in rows: # 处理ident列,为空时生成自动标识符 - ident = row.get('ident', '').strip() + ident = row.get("ident", "").strip() if not ident: ident = f"idx_{idx_counter}" idx_counter += 1 - + # 添加section标题 toml_content.append(f"[{ident}]") - + # 添加所有其他列作为键值对(排除ident列) for key, value in row.items(): - if key == 'ident': + if key == "ident": continue - + # 确保值存在且不为空 - if value is not None and str(value).strip() != '': + if value is not None and str(value).strip() != "": # 转义特殊字符并添加引号 escaped_value = str(value).replace('"', '\\"') toml_content.append(f'"{key}" = "{escaped_value}"') - + # section之间添加空行 toml_content.append("") - + # 写入TOML文件 try: - with open(toml_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(toml_content).strip()) + with open(toml_path, "w", encoding="utf-8") as f: + f.write("\n".join(toml_content).strip()) print(f"成功: 已生成TOML文件 - {toml_path}") except Exception as e: print(f"错误: 无法写入TOML文件 - {e}") sys.exit(1) + def main(): """主函数""" parser = argparse.ArgumentParser( - description='将CSV文件转换为TOML格式,支持随机打乱section顺序', + description="将CSV文件转换为TOML格式,支持随机打乱section顺序", formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=''' + epilog=""" 示例: %(prog)s input.csv output.toml %(prog)s input.csv # 自动生成input.toml %(prog)s input.csv -r 42 # 使用种子42打乱顺序 %(prog)s input.csv -r 123 output.toml # 指定种子和输出路径 - ''' + """, ) - - parser.add_argument('csv_path', help='输入的CSV文件路径') - parser.add_argument('toml_path', nargs='?', help='输出的TOML文件路径,默认为CSV同名文件') - parser.add_argument('-r', '--random-seed', type=int, - help='随机种子,用于打乱TOML section的顺序') - + + parser.add_argument("csv_path", help="输入的CSV文件路径") + parser.add_argument( + "toml_path", nargs="?", help="输出的TOML文件路径,默认为CSV同名文件" + ) + parser.add_argument( + "-r", "--random-seed", type=int, help="随机种子,用于打乱TOML section的顺序" + ) + args = parser.parse_args() - + csv_to_toml(args.csv_path, args.toml_path, args.random_seed) + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/src/heurams/tools/zmqclient.py b/src/heurams/tools/zmqclient.py index 1a7a481..cab1d5b 100644 --- a/src/heurams/tools/zmqclient.py +++ b/src/heurams/tools/zmqclient.py @@ -3,6 +3,7 @@ import pickle import readline import sys + class DebugClient: def __init__(self, port=5555): self.context = zmq.Context() @@ -12,7 +13,7 @@ class DebugClient: print("输入Python代码并按回车执行, 输入 'exit' 退出") print("可用变量: app, logger") print("-" * 50) - + def execute(self, code): """执行代码并返回结果""" try: @@ -21,7 +22,7 @@ class DebugClient: return response except Exception as e: return f"连接错误: {e}" - + def repl(self): """交互式REPL循环""" self.execute('print("test")') @@ -29,27 +30,28 @@ class DebugClient: try: # 获取用户输入 code = input(">>> ").strip() - + if not code: continue - - if code.lower() in ['exit', 'quit']: + + if code.lower() in ["exit", "quit"]: print("退出调试客户端") break - + # 执行代码 result = self.execute(code) print(f"结果: {result}\n") - + except KeyboardInterrupt: print("\n退出调试客户端") break except EOFError: break + if __name__ == "__main__": # 从命令行参数获取端口 port = int(sys.argv[1]) if len(sys.argv) > 1 else 5555 - + client = DebugClient(port) - client.repl() \ No newline at end of file + client.repl() From 417588acea455a9a9c5d52c6e6f0a5492121adbb Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 17:50:36 +0800 Subject: [PATCH 39/79] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=AE=9E=E7=8E=B0=E7=AE=97=E6=B3=95=E5=85=B1=E5=AD=98?= =?UTF-8?q?=E4=B8=8E=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/_.toml | 5 ++--- examples/simplemem.py | 3 ++- src/heurams/interface/screens/about.py | 1 + src/heurams/interface/screens/dashboard.py | 5 ++--- src/heurams/interface/screens/preparation.py | 6 ++++-- src/heurams/kernel/repolib/repo.py | 9 +++++++++ src/heurams/tools/zmqclient.py | 2 +- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/data/config/_.toml b/data/config/_.toml index 741ab92..2c1de0f 100644 --- a/data/config/_.toml +++ b/data/config/_.toml @@ -1,6 +1,5 @@ -_services_desc = '服务模块(services)设置' -_providers_desc = '驱动模块(providers)设置' +_services_desc = '服务模块设置' +_providers_desc = '驱动模块设置' _repo_desc = '单元集独立设置' _interface_desc = '基本用户界面设置' -_default_desc = '默认设置' _global_desc = '底层设置' diff --git a/examples/simplemem.py b/examples/simplemem.py index 44d4483..121b123 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -11,7 +11,8 @@ print(repo.ident_index) for i in repo.ident_index: n = pt.Nucleon.from_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) e = pt.Electron.from_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + electronic_data=repo.electronic_data_lict.get_itemic_unit(i), + algo_name=repo.config['algorithm'] ) print(n) input() diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 77f635b..0bb8da3 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -70,6 +70,7 @@ API 版本代号: `{version.codename.capitalize()}` # 运行环境信息 Python 解释器版本: {python_version} +Python 解释器路径: {sys.executable} Textual 框架版本: {textual_version} 终端模拟器: {terminal_info} 操作系统版本: {os_version} diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 1fce3ee..8fbdf2b 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -108,15 +108,14 @@ class DashboardScreen(Screen): } initial_time = float("inf") for i in range(repo.data_length): - e = pt.Electron.from_data(repo.electronic_data_lict[i]) + e = pt.Electron.from_data(electronic_data=repo.electronic_data_lict[i], algo_name=repo.config['algorithm']) n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) if e.is_activated(): - repo.algotype = e.algoname repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) # initial_time = min(initial_time, e.) repo.need_review = timer.get_daystamp() >= repo.nearest_review_time - repo.prompt = f"""{repo.manifest['title']} ({repo.algotype}) + repo.prompt = f"""{repo.manifest['title']} ({repo.config['algorithm']}) 进度: {repo.progress['touched']}/{repo.progress['total']} ({round(repo.progress['touched']/repo.progress['total']*100, 1)}%) {'需要学习' if repo.need_review else "无需操作"} """ diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index b9de967..14a1382 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -92,7 +92,8 @@ class PreparationScreen(Screen): nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i) ) e = pt.Electron.from_data( - electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i) + electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i), + algo_name=self.repo.config['algorithm'] ) statstr = "" @@ -146,7 +147,8 @@ def launch(repo, app, scheduled_num): nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i) ) e = pt.Electron.from_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i) + electronic_data=repo.electronic_data_lict.get_itemic_unit(i), + algo_name=repo.config['algorithm'] ) a = pt.Atom(n, e, repo.orbitic_data) atoms.append(a) diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index b8cd9a5..54b56b1 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -7,6 +7,7 @@ import toml import heurams.kernel.particles as pt +from heurams.context import config_var from heurams.kernel.auxiliary.lict import Lict @@ -62,6 +63,14 @@ class Repo: "algodata": self.algodata, "source": self.source, } + self.config = { + "algorithm": config_var.get()['interface']['global']['algorithm'], + "scheduled_num": config_var.get()['interface']['global']['scheduled_num'], + } + try: + self.config.update(dict(config_var.get()['repo'][self.manifest['package']])) + except: + pass self._generate_particles_data() def _generate_particles_data(self): diff --git a/src/heurams/tools/zmqclient.py b/src/heurams/tools/zmqclient.py index cab1d5b..8adcb7d 100644 --- a/src/heurams/tools/zmqclient.py +++ b/src/heurams/tools/zmqclient.py @@ -11,7 +11,7 @@ class DebugClient: self.socket.connect(f"tcp://localhost:{port}") print(f"已连接到调试服务器 (端口 {port})") print("输入Python代码并按回车执行, 输入 'exit' 退出") - print("可用变量: app, logger") + print("可用变量: app, logger, config_var") print("-" * 50) def execute(self, code): From 2a47cad2d5694bf75c3690c4b91d038d28788826 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 18:43:27 +0800 Subject: [PATCH 40/79] =?UTF-8?q?perf:=20=E8=84=8F=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20Lict=20=E5=AF=B9=E8=B1=A1=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=A4=8D=E6=9D=82=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 4 +- data/config/interface/global.toml | 2 +- src/heurams/interface/screens/dashboard.py | 7 +- src/heurams/kernel/auxiliary/lict.py | 214 +++++++++++--------- src/heurams/kernel/auxiliary/lict_legacy.py | 140 +++++++++++++ src/heurams/kernel/particles/electron.py | 1 + src/heurams/kernel/repolib/repo.py | 2 +- 7 files changed, 267 insertions(+), 103 deletions(-) create mode 100644 src/heurams/kernel/auxiliary/lict_legacy.py diff --git a/data/config/global.toml b/data/config/global.toml index c4ef4c2..5089605 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,7 +1,7 @@ zmq_debug = true -_zmq_debug_desc = "[调试] ZMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" +_zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 -_zmq_debug_port_desc = "[调试] ZMQ 调试服务器端口" +_zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" enable_built_in_interface = false _enable_built_in_interface_desc = "启用内置基本用户界面\n(当且仅当 HeurAMS 作为程序库时禁用, 以跳过用户界面逻辑)" _paths_desc = "用户数据路径定义" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index e6e60fd..f8eaaff 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -6,7 +6,7 @@ auto_pass = false _auto_pass_desc = "[调试] 自动通过测试模式" scheduled_num = 420 _scheduled_num_desc = "默认记忆单元数量(可被单元集设置覆盖)" -algorithm = "NSP-0" +algorithm = "SM-2" _algorithm_desc = "默认记忆调度算法(可被单元集设置覆盖)" [_algorithm_candidate] diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 8fbdf2b..49d2a81 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -105,20 +105,21 @@ class DashboardScreen(Screen): repo.progress = { "total": repo.data_length, "touched": 0, + "have_activated_ever": 0, } initial_time = float("inf") for i in range(repo.data_length): e = pt.Electron.from_data(electronic_data=repo.electronic_data_lict[i], algo_name=repo.config['algorithm']) n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) if e.is_activated(): + repo.progress["have_activated_ever"] = 1 repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) # initial_time = min(initial_time, e.) repo.need_review = timer.get_daystamp() >= repo.nearest_review_time repo.prompt = f"""{repo.manifest['title']} ({repo.config['algorithm']}) - 进度: {repo.progress['touched']}/{repo.progress['total']} ({round(repo.progress['touched']/repo.progress['total']*100, 1)}%) - {'需要学习' if repo.need_review else "无需操作"} - """ + [d]进度: {repo.progress['touched']}/{repo.progress['total']} ({round(repo.progress['touched']/repo.progress['total']*100, 1)}%)[/d] + [d]{'需要复习' if repo.need_review else ("暂未开始" if not repo.progress['have_activated_ever'] else '无需操作')}[/d]""" def on_mount(self) -> None: """挂载组件时初始化""" diff --git a/src/heurams/kernel/auxiliary/lict.py b/src/heurams/kernel/auxiliary/lict.py index 6ad5e48..110738b 100644 --- a/src/heurams/kernel/auxiliary/lict.py +++ b/src/heurams/kernel/auxiliary/lict.py @@ -1,124 +1,139 @@ -from collections import UserList -from typing import Any, Iterator +from collections.abc import MutableSequence +from typing import Any, Iterator, Optional - -class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) - """ "列典" 对象 - - 同时兼容字典和列表大多数 API, 两边数据同步的容器 - 列表数据是 dictobj.items() 的格式 - 支持根据字典或列表初始化 - 限制要求: - - 键名一定唯一, 且仅能为字符串 - - 值一定是引用对象 - - 不使用并发 - - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 - - 只有在 Python 3.7+ 中, forced_order 行为才能被取消. - """ - - def __init__( - self, - initlist: list | None = None, - initdict: dict | None = None, - forced_order=False, - ): - self.dicted_data = {} - if initdict != None: - initlist = list(initdict.items()) - super().__init__(initlist=initlist) +class Lict(MutableSequence): + + def __init__(self, initlist: Optional[list] = None, + initdict: Optional[dict] = None, + forced_order: bool = False): + self._dict = {} + self._list = [] + self._dict_dirty = False + self._list_dirty = False self.forced_order = forced_order - self._sync_based_on_list() - if self.forced_order: - self.data.sort() + + if initdict: # initdict 更优先 + self._dict = initdict.copy() + self._list_dirty = True + elif initlist: + self._list = initlist.copy() + self._dict_dirty = True + + self._sync_if_needed() - def _sync_based_on_dict(self): - self.data = list(self.dicted_data.items()) - if self.forced_order: - self.data.sort() - - def _sync_based_on_list(self): - self.dicted_data = {} - for i in self.data: - self.dicted_data[i[0]] = i[1] - - def __iter__(self) -> Iterator: - return self.data.__iter__() - - def __getitem__(self, i): - if isinstance(i, str): - return self.dicted_data[i] + def _sync_if_needed(self): + """只在需要时同步""" + if self._dict_dirty: + self._dict = {k: v for k, v in self._list} + if self.forced_order: + self._list.sort() + self._dict_dirty = False + + if self._list_dirty: + self._list = list(self._dict.items()) + if self.forced_order: + self._list.sort() + self._list_dirty = False + + def __getitem__(self, key): + if isinstance(key, str): + return self._dict[key] else: - return super().__getitem__(i) - - def get_itemic_unit(self, ident): - return (ident, self.dicted_data[ident]) - - def __setitem__(self, i, item): - if isinstance(i, str): - self.dicted_data[i] = item - self._sync_based_on_dict() + self._sync_if_needed() + return self._list[key] + + def __setitem__(self, key, value): + """传入键值对时等同于操作字典, 传入索引+元组时等用于替换某索引的列表值为新元组""" + if isinstance(key, str): + self._dict[key] = value + self._list_dirty = True else: - if item != (item[0], item[1]): + if value != (value[0], value[1]): raise NotImplementedError - super().__setitem__(i, item) - self._sync_based_on_list() + self._sync_if_needed() + old_key = self._list[key][0] + self._dict.pop(old_key) + self._list[key] = value + self._dict[value[0]] = value[1] # 避免全量同步 - def __delitem__(self, i): - if isinstance(i, str): - del self.dicted_data[i] - self._sync_based_on_dict() - else: - super().__delitem__(i) - self._sync_based_on_list() + def __delitem__(self, key): + if isinstance(key, str): # 字符串键 + del self._dict[key] + self._list_dirty = True + else: # 数字索引 + self._sync_if_needed() + del_key = self._list[key][0] + del self._list[key] + del self._dict[del_key] + + def keys(self): + self._sync_if_needed() + return self._dict.keys() + + def values(self): + self._sync_if_needed() + return self._dict.values() + + def items(self): + self._sync_if_needed() + return self._list + + def __len__(self): + self._sync_if_needed() + return len(self._list) + + def __iter__(self): + self._sync_if_needed() + return iter(self._list) def __contains__(self, item): - return item in self.data or item in self.keys() or item in self.values() - - def append(self, item: Any) -> None: + self._sync_if_needed() + return item in self._list or item in self.keys() or item in self.values() + + def append(self, item): if item != (item[0], item[1]): raise NotImplementedError - super().append(item) - self._sync_based_on_list() - if self.forced_order: - self.data.sort() + self._sync_if_needed() # 以防 forced_order + key, value = item + self._dict[key] = value + self._list.append(item) # 两端都已同步 + self._sync_if_needed() # 以防 forced_order - def append_new(self, item: Any): + def append_if_it_donesnt_exist_before(self, item: Any): if item != (item[0], item[1]): raise NotImplementedError + self._sync_if_needed() if item[0] not in self: super().append(item) - self._sync_based_on_list() - if self.forced_order: - self.data.sort() - + self._sync_if_needed() + def insert(self, i: int, item: Any) -> None: - if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 + if item != (item[0], item[1]): raise NotImplementedError - super().insert(i, item) - self._sync_based_on_list() - if self.forced_order: - self.data.sort() + self._sync_if_needed() + self._list.insert(i, item) + self._dict_dirty = True def pop(self, i: int = -1) -> Any: - res = super().pop(i) - self._sync_based_on_list() + self._sync_if_needed() + res = self._list.pop(i) + self._dict_dirty = True return res def remove(self, item: Any) -> None: if isinstance(item, str): - item = (item, self.dicted_data[item]) + item = (item, self._dict[item]) if item != (item[0], item[1]): raise NotImplementedError - super().remove(item) - self._sync_based_on_list() - if self.forced_order: - self.data.sort() + self._sync_if_needed() + self._list.remove(item) + self._dict_dirty = True def clear(self) -> None: - super().clear() - self._sync_based_on_list() + self._dict.clear() + self._list.clear() + self._dict_dirty = False + self._list_dirty = False def index(self): raise NotImplementedError @@ -133,15 +148,22 @@ class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) raise NotImplementedError def keys(self): - return self.dicted_data.keys() + self._sync_if_needed() + return self._dict.keys() def values(self): - return self.dicted_data.values() + self._sync_if_needed() + return self._dict.values() def items(self): - return self.data + self._sync_if_needed() + return self._list + + def get_itemic_unit(self, ident): + return (ident, self._dict[ident]) def keys_equal_with(self, other): + self._sync_if_needed() return self.key_equality(self, other) @classmethod diff --git a/src/heurams/kernel/auxiliary/lict_legacy.py b/src/heurams/kernel/auxiliary/lict_legacy.py new file mode 100644 index 0000000..446cae9 --- /dev/null +++ b/src/heurams/kernel/auxiliary/lict_legacy.py @@ -0,0 +1,140 @@ +from collections import UserList +from typing import Any, Iterator + + +class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) + """ "列典" 对象 + + 同时兼容字典和列表大多数 API, 两边数据同步的容器 + 列表数据是 dictobj.items() 的格式 + 支持根据字典或列表初始化 + 限制要求: + - 键名一定唯一, 且仅能为字符串 + - 值一定是引用对象 + - 不使用并发 + - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + + """ + + def __init__( + self, + initlist: list | None = None, + initdict: dict | None = None, + ): + self.dicted_data = {} + if initdict != None: + initlist = list(initdict.items()) + super().__init__(initlist=initlist) + self._sync_based_on_list() + self.data.sort() + + def _sync_based_on_dict(self): + self.data = list(self.dicted_data.items()) + self.data.sort() + + def _sync_based_on_list(self): + self.dicted_data = {} + for i in self.data: + self.dicted_data[i[0]] = i[1] + + def __iter__(self) -> Iterator: + return self.data.__iter__() + + def __getitem__(self, i): + if isinstance(i, str): + return self.dicted_data[i] + else: + return super().__getitem__(i) + + def get_itemic_unit(self, ident): + return (ident, self.dicted_data[ident]) + + def __setitem__(self, i, item): + if isinstance(i, str): + self.dicted_data[i] = item + self._sync_based_on_dict() + else: + if item != (item[0], item[1]): + raise NotImplementedError + super().__setitem__(i, item) + self._sync_based_on_list() + + def __delitem__(self, i): + if isinstance(i, str): + del self.dicted_data[i] + self._sync_based_on_dict() + else: + super().__delitem__(i) + self._sync_based_on_list() + + def __contains__(self, item): + return item in self.data or item in self.keys() or item in self.values() + + def append(self, item: Any) -> None: + if item != (item[0], item[1]): + raise NotImplementedError + super().append(item) + self._sync_based_on_list() + self.data.sort() + + def append_new(self, item: Any): + if item != (item[0], item[1]): + raise NotImplementedError + if item[0] not in self: + super().append(item) + self._sync_based_on_list() + self.data.sort() + + def insert(self, i: int, item: Any) -> None: + if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 + raise NotImplementedError + super().insert(i, item) + self._sync_based_on_list() + self.data.sort() + + def pop(self, i: int = -1) -> Any: + res = super().pop(i) + self._sync_based_on_list() + return res + + def remove(self, item: Any) -> None: + if isinstance(item, str): + item = (item, self.dicted_data[item]) + if item != (item[0], item[1]): + raise NotImplementedError + super().remove(item) + self._sync_based_on_list() + self.data.sort() + + def clear(self) -> None: + super().clear() + self._sync_based_on_list() + + def index(self): + raise NotImplementedError + + def extend(self): + raise NotImplementedError + + def sort(self): + raise NotImplementedError + + def reverse(self): + raise NotImplementedError + + def keys(self): + return self.dicted_data.keys() + + def values(self): + return self.dicted_data.values() + + def items(self): + return self.data + + def keys_equal_with(self, other): + return self.key_equality(self, other) + + @classmethod + def key_equality(cls, a, b): + return a.keys() == b.keys() diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 0bfeb7d..576810f 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -5,6 +5,7 @@ import heurams.kernel.algorithms as algolib import heurams.services.timer as timer from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger +from heurams.context import config_var logger = get_logger(__name__) diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index 54b56b1..cd2acb7 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -82,7 +82,7 @@ class Repo: self.data_length = len(self.nucleonic_data_lict) self.ident_index = self.nucleonic_data_lict.keys() for i in self.ident_index: - self.algodata.append_new((i, {})) + self.algodata.append_if_it_donesnt_exist_before((i, {})) self.electronic_data_lict = self.algodata def _nucleonic_proc(self, unit): From e943b1b7d7e9ef6a850e47ac19120a601caff42a Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 20 Apr 2026 18:55:25 +0800 Subject: [PATCH 41/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Lict=20?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/simplemem.py | 2 +- src/heurams/interface/screens/dashboard.py | 9 ++- src/heurams/interface/screens/preparation.py | 8 +- .../{lict_legacy.py => lict.deprecated.py} | 1 + src/heurams/kernel/auxiliary/lict.py | 73 ++++++++++--------- .../{refvar.py => refvar.deprecated.py} | 1 + src/heurams/kernel/repolib/repo.py | 8 +- 7 files changed, 53 insertions(+), 49 deletions(-) rename src/heurams/kernel/auxiliary/{lict_legacy.py => lict.deprecated.py} (99%) rename src/heurams/kernel/auxiliary/{refvar.py => refvar.deprecated.py} (99%) diff --git a/examples/simplemem.py b/examples/simplemem.py index 121b123..f1ee28a 100644 --- a/examples/simplemem.py +++ b/examples/simplemem.py @@ -12,7 +12,7 @@ for i in repo.ident_index: n = pt.Nucleon.from_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict.get_itemic_unit(i), - algo_name=repo.config['algorithm'] + algo_name=repo.config["algorithm"], ) print(n) input() diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 49d2a81..afd4941 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -35,8 +35,8 @@ class DashboardScreen(Screen): ("q", "go_back", "返回"), ] - CSS_PATH = Path(__file__).parent.parent / 'css' / "screens" / "dashboard.tcss" - + CSS_PATH = Path(__file__).parent.parent / "css" / "screens" / "dashboard.tcss" + def __init__( self, name: str | None = None, @@ -109,7 +109,10 @@ class DashboardScreen(Screen): } initial_time = float("inf") for i in range(repo.data_length): - e = pt.Electron.from_data(electronic_data=repo.electronic_data_lict[i], algo_name=repo.config['algorithm']) + e = pt.Electron.from_data( + electronic_data=repo.electronic_data_lict[i], + algo_name=repo.config["algorithm"], + ) n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) if e.is_activated(): repo.progress["have_activated_ever"] = 1 diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 14a1382..77d092a 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -48,9 +48,7 @@ class PreparationScreen(Screen): yield Header(show_clock=True) with ScrollableContainer(id="vice_container"): yield Label(f"准备就绪: [b]{self.repo.manifest['title']}[/b]\n") - yield Label( - f"[b]仓库路径: {self.repo.source}[/b]" - ) + yield Label(f"[b]仓库路径: {self.repo.source}[/b]") yield Label(f"\n单元数量: {len(self.repo)}\n") yield Label(f"最小记忆分组: {self.scheduled_num}\n", id="schnum_label") @@ -93,7 +91,7 @@ class PreparationScreen(Screen): ) e = pt.Electron.from_data( electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i), - algo_name=self.repo.config['algorithm'] + algo_name=self.repo.config["algorithm"], ) statstr = "" @@ -148,7 +146,7 @@ def launch(repo, app, scheduled_num): ) e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict.get_itemic_unit(i), - algo_name=repo.config['algorithm'] + algo_name=repo.config["algorithm"], ) a = pt.Atom(n, e, repo.orbitic_data) atoms.append(a) diff --git a/src/heurams/kernel/auxiliary/lict_legacy.py b/src/heurams/kernel/auxiliary/lict.deprecated.py similarity index 99% rename from src/heurams/kernel/auxiliary/lict_legacy.py rename to src/heurams/kernel/auxiliary/lict.deprecated.py index 446cae9..9d86005 100644 --- a/src/heurams/kernel/auxiliary/lict_legacy.py +++ b/src/heurams/kernel/auxiliary/lict.deprecated.py @@ -1,3 +1,4 @@ +# 已弃用 from collections import UserList from typing import Any, Iterator diff --git a/src/heurams/kernel/auxiliary/lict.py b/src/heurams/kernel/auxiliary/lict.py index 110738b..b625ed6 100644 --- a/src/heurams/kernel/auxiliary/lict.py +++ b/src/heurams/kernel/auxiliary/lict.py @@ -2,23 +2,36 @@ from collections.abc import MutableSequence from typing import Any, Iterator, Optional class Lict(MutableSequence): - - def __init__(self, initlist: Optional[list] = None, + """ "列典" 对象 + + 同时兼容字典和列表大多数 API, 两边数据同步的容器, 性能与 list/dict 大体相当 + 列表数据是 dictobj.items() 的格式 + 支持根据字典或列表初始化 + 限制要求: + - 键名一定唯一, 且仅能为字符串 + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + + """ + + def __init__( + self, + initlist: Optional[list] = None, initdict: Optional[dict] = None, - forced_order: bool = False): + forced_order: bool = False, + ): self._dict = {} self._list = [] self._dict_dirty = False self._list_dirty = False self.forced_order = forced_order - - if initdict: # initdict 更优先 + + if initdict: # initdict 更优先 self._dict = initdict.copy() self._list_dirty = True elif initlist: self._list = initlist.copy() self._dict_dirty = True - + self._sync_if_needed() def _sync_if_needed(self): @@ -28,20 +41,20 @@ class Lict(MutableSequence): if self.forced_order: self._list.sort() self._dict_dirty = False - + if self._list_dirty: self._list = list(self._dict.items()) if self.forced_order: self._list.sort() self._list_dirty = False - + def __getitem__(self, key): if isinstance(key, str): return self._dict[key] else: self._sync_if_needed() return self._list[key] - + def __setitem__(self, key, value): """传入键值对时等同于操作字典, 传入索引+元组时等用于替换某索引的列表值为新元组""" if isinstance(key, str): @@ -54,34 +67,34 @@ class Lict(MutableSequence): old_key = self._list[key][0] self._dict.pop(old_key) self._list[key] = value - self._dict[value[0]] = value[1] # 避免全量同步 + self._dict[value[0]] = value[1] # 避免全量同步 def __delitem__(self, key): - if isinstance(key, str): # 字符串键 + if isinstance(key, str): # 字符串键 del self._dict[key] self._list_dirty = True - else: # 数字索引 + else: # 数字索引 self._sync_if_needed() del_key = self._list[key][0] del self._list[key] del self._dict[del_key] - + def keys(self): self._sync_if_needed() return self._dict.keys() - + def values(self): self._sync_if_needed() return self._dict.values() - + def items(self): self._sync_if_needed() return self._list - + def __len__(self): self._sync_if_needed() return len(self._list) - + def __iter__(self): self._sync_if_needed() return iter(self._list) @@ -89,24 +102,24 @@ class Lict(MutableSequence): def __contains__(self, item): self._sync_if_needed() return item in self._list or item in self.keys() or item in self.values() - + def append(self, item): if item != (item[0], item[1]): raise NotImplementedError - self._sync_if_needed() # 以防 forced_order + self._sync_if_needed() # 以防 forced_order key, value = item self._dict[key] = value - self._list.append(item) # 两端都已同步 - self._sync_if_needed() # 以防 forced_order + self._list.append(item) # 两端都已同步 + self._sync_if_needed() # 以防 forced_order - def append_if_it_donesnt_exist_before(self, item: Any): + def append_if_it_doesnt_exist_before(self, item: Any): if item != (item[0], item[1]): raise NotImplementedError self._sync_if_needed() if item[0] not in self: - super().append(item) + self.append(item) self._sync_if_needed() - + def insert(self, i: int, item: Any) -> None: if item != (item[0], item[1]): raise NotImplementedError @@ -147,18 +160,6 @@ class Lict(MutableSequence): def reverse(self): raise NotImplementedError - def keys(self): - self._sync_if_needed() - return self._dict.keys() - - def values(self): - self._sync_if_needed() - return self._dict.values() - - def items(self): - self._sync_if_needed() - return self._list - def get_itemic_unit(self, ident): return (ident, self._dict[ident]) diff --git a/src/heurams/kernel/auxiliary/refvar.py b/src/heurams/kernel/auxiliary/refvar.deprecated.py similarity index 99% rename from src/heurams/kernel/auxiliary/refvar.py rename to src/heurams/kernel/auxiliary/refvar.deprecated.py index 12aab09..71c1c5f 100644 --- a/src/heurams/kernel/auxiliary/refvar.py +++ b/src/heurams/kernel/auxiliary/refvar.deprecated.py @@ -1,3 +1,4 @@ +# 已弃用 class RefVar: def __init__(self, initvalue) -> None: self.data = initvalue diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index cd2acb7..61c1708 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -64,11 +64,11 @@ class Repo: "source": self.source, } self.config = { - "algorithm": config_var.get()['interface']['global']['algorithm'], - "scheduled_num": config_var.get()['interface']['global']['scheduled_num'], + "algorithm": config_var.get()["interface"]["global"]["algorithm"], + "scheduled_num": config_var.get()["interface"]["global"]["scheduled_num"], } try: - self.config.update(dict(config_var.get()['repo'][self.manifest['package']])) + self.config.update(dict(config_var.get()["repo"][self.manifest["package"]])) except: pass self._generate_particles_data() @@ -82,7 +82,7 @@ class Repo: self.data_length = len(self.nucleonic_data_lict) self.ident_index = self.nucleonic_data_lict.keys() for i in self.ident_index: - self.algodata.append_if_it_donesnt_exist_before((i, {})) + self.algodata.append_if_it_doesnt_exist_before((i, {})) self.electronic_data_lict = self.algodata def _nucleonic_proc(self, unit): From c0483b87f8ca41d307944a9d848e562a4c05f481 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 21 Apr 2026 00:15:57 +0800 Subject: [PATCH 42/79] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=20CSS=20?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 103 +++++++++++++----- data/config/global.toml | 4 +- examples/jiebatest.py | 14 --- glossary.md | 15 --- src/heurams/interface/__init__.py | 1 + src/heurams/interface/css/main.tcss | 46 -------- .../interface/css/screens/dashboard.tcss | 2 +- .../interface/css/screens/setting.tcss | 27 +++++ src/heurams/interface/screens/about.py | 1 + src/heurams/interface/screens/dashboard.py | 19 ++-- src/heurams/interface/screens/preparation.py | 5 +- src/heurams/interface/screens/setting.py | 10 +- src/heurams/kernel/auxiliary/__init__.py | 3 +- 13 files changed, 128 insertions(+), 122 deletions(-) delete mode 100644 examples/jiebatest.py delete mode 100644 glossary.md create mode 100644 src/heurams/interface/css/screens/setting.tcss diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7853516..f5076fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,42 +1,93 @@ -# 贡献指南 +# 贡献指南与二次开发 -欢迎为此项目做出贡献!\ -本项目是一个开源项目, 我们鼓励社区成员参与改进. +欢迎为此项目做出贡献! ## 开发规范 -1. 分支划分: - - `main` 分支: 稳定版本 - - `dev` 分支: 开发版本 - - 功能分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/描述` -1. 代码风格: - - 请使用 Black 格式化代码 - - 遵循 PEP 8 规范 - - 添加适当的文档字符串 -1. 提交消息: - - 使用简体中文或英文撰写清晰的提交消息 - - 格式: 遵循 Conventional Commits 规范 -1. 合并方式: - - 不使用 Fast-forward 合并 - - 可以设置 `git config merge.ff false` +分支划分: + +- `main` 分支: 稳定版本, 仅当稳定版本释出或修补版本时将 `dev` 合并到 `main` 上 +- `dev` 分支: 主线开发版本, 自身仅用于非重构的问题修复和整合功能分支 +- 功能与重构分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/v版本号`() +- 不要将功能与重构分支先应被合并至 `dev` 后在 `dev` 完成文档开发后再释出至 `main` + 代码格式化: +- 对于 Python, 使用 `black` 格式化 +- 对于 Markdown, 使用 `mdformat` 格式化 +- 对于 Textual CSS, 使用 `prettier` 格式化 +- 格式化不是必需的, 可以整合入一次 `style` 提交, 但 `main` 和 `dev` 分支上的代码应尽量整洁, 以便合并时审查 + 提交消息: +- 使用简体中文或英文撰写清晰的提交消息 +- 提交消息格式: 遵循 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) 规范, 建议使用 `koji` 工具 + 合并方式: +- 为了一致性和可追溯性, 项目自 v0.4.0 重构后重新初始化仓库起就禁止使用 Fast-forward 合并 +- 可以设置 `git config merge.ff false` ## 设置开发环境 ```bash # 克隆仓库 -git clone https://gitea.imwangzhiyu.xyz/ajax/HeurAMS - +git clone https://git.pluv27.top/pluv/HeurAMS cd HeurAMS -# 你可能需要切换分支 +# 可能需要切换到 dev 分支 +git checkout dev -# 安装依赖 -pip install -r requirements.txt +# 如果决定使用 uv (推荐) -# 安装开发版本 -pip install -e . +## 首先要安装uv, 例如通过 pip 或者其他包管理器 +python3 -m pip install uv + +uv sync # 同步开发运行环境 + +uv run heurams # 验证包安装 + +uv run tui # 启动 TUI + +# 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不支持 uv 的环境运行 HeurAMS) + +## 安装依赖并将 HeurAMS 安装为本地包 +python3 -m pip install -r requirements.txt +python3 -m pip install -e . + +python3 -m heurams # 验证安装 +python3 -m heurams.__interface__ # 启动 TUI ``` -## 许可证 +## 许可证与外部引用 -贡献者同意其贡献将在 AGPL-3.0 许可证下发布. +贡献者拥有其贡献部分的版权同意其贡献将在 AGPL-3.0 许可证下发布. + +如果您认为有必要引入其他开源的 vendor, 请在 PR 中注明或手动联系以便我们审查 vendor 许可证并更改此处和网站上的关于与版权声明 + +如果您认为有必要引入其他专有的网络服务(就像现在项目中的 edgetts), 请也在 PR 中注明 + +如果您认为有必要升级某个依赖或运行环境的版本, 请也在 PR 中注明 + +## 新的用户界面前端与其他语言移植 + +HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: + +- 我们的内置 Textual TUI 前端不是唯一可用的前端 + +- 您可以在自己的项目中以独立进程/服务调用 HeurAMS (但不能在代码中链接), 而免于受 AGPL-3.0 "污染" + +- 如果您有一个自己开发的且可用的 HeurAMS 前端 (例如我们暂未实现的 flutter 前端), 并且以 AGPL-3.0/GPL-3.0 开放源代码, 可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) + +- 如果您通过独立进程/服务调用方式开发了另外的软件, 开源但不愿使用 AGPL-3.0/GPL-3.0 许可证, 也可以联系我们, 我们乐于将您的项目链接添加到友链中 + +- 如果您想创建程序库的其他语言 (例如 dart) 版本以协助此语言下的方便集成, 并且同样以 AGPL-3.0/GPL-3.0 开放源代码, 也可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) + +## 软件开发之外的贡献 + +即使您不是软件开发人员, 我们也欢迎您加入贡献! + +您可以: + +- 协助创建各种语言的翻译来翻译软件的界面 (但我们目前还没有 i18n 平台, 所以如果您想贡献翻译, 可能需要手动联系我们) +- 制作图像、主题、音效乃至制作开放的记忆单元集给其他用户使用 +- 改进软件配套的文档 +- 维护软件的开发/交流群组 +- 给其他用户答疑解惑或分享自己的经验 +- 在讨论区提出新想法或反馈问题 + +您的角色您来定! diff --git a/data/config/global.toml b/data/config/global.toml index 5089605..486e242 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,8 +1,8 @@ -zmq_debug = true +zmq_debug = false _zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 _zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" -enable_built_in_interface = false +enable_built_in_interface = true _enable_built_in_interface_desc = "启用内置基本用户界面\n(当且仅当 HeurAMS 作为程序库时禁用, 以跳过用户界面逻辑)" _paths_desc = "用户数据路径定义" diff --git a/examples/jiebatest.py b/examples/jiebatest.py deleted file mode 100644 index df2a89b..0000000 --- a/examples/jiebatest.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding=utf-8 -import jieba - -# jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持 -strs = ["我来到北京清华大学", "乒乓球拍卖完了", "中国科学技术大学"] -# for str in strs: -# seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式 -# print("Paddle Mode: " + '/'.join(list(seg_list))) - -seg_list = jieba.cut("秦孝公据崤函之固, 拥雍州之地", cut_all=False) -print("Default Mode: " + "/ ".join(seg_list)) # 精确模式 - -seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式 -print(", ".join(seg_list)) diff --git a/glossary.md b/glossary.md deleted file mode 100644 index fa3cd76..0000000 --- a/glossary.md +++ /dev/null @@ -1,15 +0,0 @@ -# 运行时对象 - -Atom: 原子, 由核子, 电子, 轨道对象一并构成, 用于处理记忆所需一系列对象 -Nucleon: 核子, 负责解析文件动态内容, 并储存记忆材料内容与谜题定义, 是静态只读但可临时覆盖内容的\ -Electron: 电子, 负责处理记忆算法数据\ -Orbital: 轨道, 储存记忆阶段信息与谜题阶段内出现配置 - -# 状态机对象 - -Transitions: 一种状态机框架库 -Reactor: 状态机库 -Phaser... - -rating: 用户评估生成的值 -quality: 用于单元反馈的值 diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index b01807a..a5ca899 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -80,3 +80,4 @@ class HeurAMSApp(App): def panic(self, *args): self._close_messages_no_wait() raise self._exception + \ No newline at end of file diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index 911f205..daa983d 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -2,22 +2,6 @@ NavigatorScreen { align: center middle; } -.infview { - width: 5fr -} -.dataview { - width: 3fr -} - -.repo_listitem { - layout: grid; - grid-size: 2; -} - -.repo_listitem_btn { - dock: right; - offset: -5% 0 -} #dialog { grid-size: 2; @@ -29,33 +13,3 @@ NavigatorScreen { border: thick $background 80%; background: $surface; } - -#dashboardtop { - height: 4 -} - -#input-container { - height: 3; - margin-top: 1; - align: center middle; -} -.container { - height: auto; - padding: 0 0 1 0; -} -#message-input { - width: 1fr; - margin-right: 1; -} - -#status-bar { - height: 1; - margin-top: 1; - text-style: italic; - color: $text-muted; -} - -.session-label { - color: $primary; - text-style: bold; -} diff --git a/src/heurams/interface/css/screens/dashboard.tcss b/src/heurams/interface/css/screens/dashboard.tcss index 05ae942..bbd8cf7 100644 --- a/src/heurams/interface/css/screens/dashboard.tcss +++ b/src/heurams/interface/css/screens/dashboard.tcss @@ -3,7 +3,7 @@ } #header { - height: 4; + height: 3; } .repo-list-item { diff --git a/src/heurams/interface/css/screens/setting.tcss b/src/heurams/interface/css/screens/setting.tcss new file mode 100644 index 0000000..7054e14 --- /dev/null +++ b/src/heurams/interface/css/screens/setting.tcss @@ -0,0 +1,27 @@ +.foot { + align-vertical: bottom; +} + +Switch { + dock: right; +} + +Label { + width: auto +} + +Select { + width: 55%; + dock: right; +} + +Input { + width: 55%; + dock: right; +} + +Horizontal { + width: 100%; + height: 4; + padding: 0 0 1 0; +} diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 0bb8da3..d00b1da 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -41,6 +41,7 @@ class AboutScreen(Screen): API 版本代号: `{version.codename.capitalize()}` 一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. +一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. 以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index afd4941..df1f935 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -35,7 +35,7 @@ class DashboardScreen(Screen): ("q", "go_back", "返回"), ] - CSS_PATH = Path(__file__).parent.parent / "css" / "screens" / "dashboard.tcss" + CSS_PATH = rootdir / 'interface' / "css" / "screens" / "dashboard.tcss" def __init__( self, @@ -53,10 +53,9 @@ class DashboardScreen(Screen): with ScrollableContainer(): yield Horizontal( # 顶部的状态 Vertical( - Label(f'欢迎使用 "潜进" 版本 {version.ver}'), - Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()}"), + Label(f"当前日时间戳: {timer.get_daystamp()}"), Label( - f"应用时区修正: UTC+{config_var.get()['services']['timer']['timezone_offset'] / 3600}" + f"应用时区修正: UTC+{str(config_var.get()['services']['timer']['timezone_offset'] / 3600).rstrip('.0')}" ), Label( f"默认算法设置: {config_var.get()['interface']['global']['algorithm']}" @@ -80,7 +79,7 @@ class DashboardScreen(Screen): yield ListView(id="repo_list", classes="repo-list") # 单元集选择 yield Label( - f'"潜进" 启发式辅助记忆调度器 版本 {version.ver} {version.stage.capitalize()}' + f'版本 {version.ver} {version.stage.capitalize()}' ) # 版本信息 yield Footer() @@ -107,6 +106,10 @@ class DashboardScreen(Screen): "touched": 0, "have_activated_ever": 0, } + repo.preview = { + "review": 0, + "new": repo.config['scheduled_num'], + } initial_time = float("inf") for i in range(repo.data_length): e = pt.Electron.from_data( @@ -118,11 +121,13 @@ class DashboardScreen(Screen): repo.progress["have_activated_ever"] = 1 repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) + if (timer.get_daystamp() >= e.nextdate()): + repo.preview['review'] += 1 # initial_time = min(initial_time, e.) repo.need_review = timer.get_daystamp() >= repo.nearest_review_time - repo.prompt = f"""{repo.manifest['title']} ({repo.config['algorithm']}) + repo.prompt = f"""{repo.manifest['title']} \\[{repo.config['algorithm']}] [d]进度: {repo.progress['touched']}/{repo.progress['total']} ({round(repo.progress['touched']/repo.progress['total']*100, 1)}%)[/d] - [d]{'需要复习' if repo.need_review else ("暂未开始" if not repo.progress['have_activated_ever'] else '无需操作')}[/d]""" + [d]{f'需要学习: {repo.preview['review']}R + {repo.preview['new']}U' if repo.need_review else (f"暂未开始: 0R + {repo.preview['new']}U" if not repo.progress['have_activated_ever'] else '无需操作')}[/d]""" def on_mount(self) -> None: """挂载组件时初始化""" diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 77d092a..dd2afe8 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -1,7 +1,7 @@ """记忆准备界面""" from textual.app import ComposeResult -from textual.containers import ScrollableContainer +from textual.containers import ScrollableContainer, Container from textual.reactive import reactive from textual.screen import Screen from textual.widget import Widget @@ -15,6 +15,7 @@ from textual.widgets import ( Rule, Sparkline, ) +from textual.lazy import Reveal, Lazy import heurams.kernel.particles as pt import heurams.services.hasher as hasher @@ -46,7 +47,7 @@ class PreparationScreen(Screen): def compose(self) -> ComposeResult: yield Header(show_clock=True) - with ScrollableContainer(id="vice_container"): + with Reveal(ScrollableContainer(id="vice_container")): yield Label(f"准备就绪: [b]{self.repo.manifest['title']}[/b]\n") yield Label(f"[b]仓库路径: {self.repo.source}[/b]") yield Label(f"\n单元数量: {len(self.repo)}\n") diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index 9976d74..e73bdb6 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -44,7 +44,8 @@ class SettingScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), ] - + CSS_PATH = rootdir / 'interface' / "css" / "screens" / "setting.tcss" + def __init__( self, name: str | None = None, @@ -66,6 +67,7 @@ class SettingScreen(Screen): yield Collapsible( *a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}' ) + yield Label("退出页面时, 所作的更改会立即保存, 但仍建议重启软件以确保新的配置得到应用", classes="foot") yield Footer() def _get_subcfg(self, parent_epath: str): @@ -112,7 +114,6 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), - classes="container", ) ) elif isinstance(parent[f"_{i}_candidate"], list): @@ -124,7 +125,6 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), - classes="container", ) ) else: @@ -138,7 +138,6 @@ class SettingScreen(Screen): type="number", id=domize(f"{parent_epath}.{i}"), ), - classes="container", ) ) elif isinstance(parent[i], str): @@ -151,7 +150,6 @@ class SettingScreen(Screen): type="text", id=domize(f"{parent_epath}.{i}"), ), - classes="container", ) ) elif isinstance(parent[i], bool): @@ -161,7 +159,6 @@ class SettingScreen(Screen): Switch( value=parent[i], id=domize(f"{parent_epath}.{i}") ), - classes="container", ) ) elif isinstance(parent[i], int): @@ -174,7 +171,6 @@ class SettingScreen(Screen): type="integer", id=domize(f"{parent_epath}.{i}"), ), - classes="container", ) ) elif isinstance(parent[i], list): diff --git a/src/heurams/kernel/auxiliary/__init__.py b/src/heurams/kernel/auxiliary/__init__.py index 2e09240..e1da94f 100644 --- a/src/heurams/kernel/auxiliary/__init__.py +++ b/src/heurams/kernel/auxiliary/__init__.py @@ -1,5 +1,4 @@ from .evalizor import Evalizer from .lict import Lict -from .refvar import RefVar -__all__ = ["Evalizer", "Lict", "RefVar"] +__all__ = ["Evalizer", "Lict"] From a610904290ee3600ddf2474d5f9a827e92166f8b Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 21 Apr 2026 00:17:03 +0800 Subject: [PATCH 43/79] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/__init__.py | 1 - src/heurams/interface/screens/dashboard.py | 12 +++++------- src/heurams/interface/screens/setting.py | 9 ++++++--- src/heurams/kernel/auxiliary/lict.py | 1 + 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index a5ca899..b01807a 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -80,4 +80,3 @@ class HeurAMSApp(App): def panic(self, *args): self._close_messages_no_wait() raise self._exception - \ No newline at end of file diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index df1f935..e8b7525 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -35,7 +35,7 @@ class DashboardScreen(Screen): ("q", "go_back", "返回"), ] - CSS_PATH = rootdir / 'interface' / "css" / "screens" / "dashboard.tcss" + CSS_PATH = rootdir / "interface" / "css" / "screens" / "dashboard.tcss" def __init__( self, @@ -78,9 +78,7 @@ class DashboardScreen(Screen): yield ListView(id="repo_list", classes="repo-list") # 单元集选择 - yield Label( - f'版本 {version.ver} {version.stage.capitalize()}' - ) # 版本信息 + yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 yield Footer() def _load_data(self): @@ -108,7 +106,7 @@ class DashboardScreen(Screen): } repo.preview = { "review": 0, - "new": repo.config['scheduled_num'], + "new": repo.config["scheduled_num"], } initial_time = float("inf") for i in range(repo.data_length): @@ -121,8 +119,8 @@ class DashboardScreen(Screen): repo.progress["have_activated_ever"] = 1 repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) - if (timer.get_daystamp() >= e.nextdate()): - repo.preview['review'] += 1 + if timer.get_daystamp() >= e.nextdate(): + repo.preview["review"] += 1 # initial_time = min(initial_time, e.) repo.need_review = timer.get_daystamp() >= repo.nearest_review_time repo.prompt = f"""{repo.manifest['title']} \\[{repo.config['algorithm']}] diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index e73bdb6..af6f0bb 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -44,8 +44,8 @@ class SettingScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), ] - CSS_PATH = rootdir / 'interface' / "css" / "screens" / "setting.tcss" - + CSS_PATH = rootdir / "interface" / "css" / "screens" / "setting.tcss" + def __init__( self, name: str | None = None, @@ -67,7 +67,10 @@ class SettingScreen(Screen): yield Collapsible( *a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}' ) - yield Label("退出页面时, 所作的更改会立即保存, 但仍建议重启软件以确保新的配置得到应用", classes="foot") + yield Label( + "退出页面时, 所作的更改会立即保存, 但仍建议重启软件以确保新的配置得到应用", + classes="foot", + ) yield Footer() def _get_subcfg(self, parent_epath: str): diff --git a/src/heurams/kernel/auxiliary/lict.py b/src/heurams/kernel/auxiliary/lict.py index b625ed6..db710e0 100644 --- a/src/heurams/kernel/auxiliary/lict.py +++ b/src/heurams/kernel/auxiliary/lict.py @@ -1,6 +1,7 @@ from collections.abc import MutableSequence from typing import Any, Iterator, Optional + class Lict(MutableSequence): """ "列典" 对象 From e53e905e1b275b3e9c3eb7ae61b02e944a4e9d1c Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 21 Apr 2026 02:06:28 +0800 Subject: [PATCH 44/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interface/css/screens/preparation.tcss | 24 ++ src/heurams/interface/screens/about.py | 15 +- src/heurams/interface/screens/dashboard.py | 1 - src/heurams/interface/screens/memoqueue.py | 42 +-- src/heurams/interface/screens/precache.py | 4 +- src/heurams/interface/screens/preparation.py | 61 +++-- .../kernel/auxiliary/lict.deprecated.py | 141 ---------- .../kernel/auxiliary/refvar.deprecated.py | 242 ------------------ src/heurams/services/timer.py | 4 +- 9 files changed, 77 insertions(+), 457 deletions(-) create mode 100644 src/heurams/interface/css/screens/preparation.tcss delete mode 100644 src/heurams/kernel/auxiliary/lict.deprecated.py delete mode 100644 src/heurams/kernel/auxiliary/refvar.deprecated.py diff --git a/src/heurams/interface/css/screens/preparation.tcss b/src/heurams/interface/css/screens/preparation.tcss new file mode 100644 index 0000000..d6b03df --- /dev/null +++ b/src/heurams/interface/css/screens/preparation.tcss @@ -0,0 +1,24 @@ +#operations { + height: auto; +} + +.btn { + margin: 0 1 0 0; + padding: 0 1 0 1; +} + +#main_container { + +} + +#previewer_container { + +} + +.unit-statline { + +} + +#title { + padding: 0; +} \ No newline at end of file diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index d00b1da..1af4e7d 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -45,27 +45,23 @@ API 版本代号: `{version.codename.capitalize()}` 以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. -您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 作为基本的全功能前端实现与程序库测试, 如果您想去除它, 请移除程序库根目录中的 interface 文件夹. +您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为基本的全功能前端实现与程序库测试, 位于程序库根目录中的 interface 文件夹. 您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新. -如果您觉得这个软件有用, 可以在它的源代码仓库给它添加一个星标 :) +如果您觉得这个软件有用, 可以考虑参与贡献, 或在它的源代码仓库给它添加一个星标 :) -> 潜进(HeurAMS), 以及它作为一个"程序库"是自由且免费的, 但是开发工作必须投入大量精力. -> 您可以加入各种语言的翻译团队来翻译软件的界面, 您还可以制作图像、主题、音效, 或者改进软件配套的文档…… -> 不管您来自何方, 我们都欢迎您加入社区并做出贡献. -> 我们的共同目标是为人人带来高品质的辅助记忆 & 学习软件. -> 您的慷慨支持, 我们必当涌泉相报. +您的慷慨支持, 我们必当涌泉相报. 开发人员列表: - Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 发起项目与主要维护者 -特别感谢以下人士, 他们的算法与理论构成了此软件算法的基石: +特别感谢以下人士, 他们的算法与理论构成了此软件现有算法的基石: - [Piotr A. Woźniak](https://supermemo.guru/wiki/Piotr_Wozniak): SM-2 算法与 SM-15 算法理论 - [Kazuaki Tanida](https://github.com/slaypni): SM-15 算法的 CoffeeScript 实现 -- [Thoughts Memo](https://www.zhihu.com/people/L.M.Sherlock): 文献参考 +- [Thoughts Memo](https://www.zhihu.com/people/L.M.Sherlock): 中文文献参考 # 运行环境信息 @@ -86,6 +82,7 @@ Textual 框架版本: {textual_version} "返回主界面", id="back_button", variant="primary", + flat=True, classes="back-button", ) yield Footer() diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index e8b7525..623ae6e 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -93,7 +93,6 @@ class DashboardScreen(Screen): # need_review: 需要/不需要学习 # nearest_review_time: 最近下次学习时间 # progress: 进度 - # algotype: 算法类型 ## initial_time: 起始时间 # package: 包名 # prompt: 最终呈现信息 diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 68782d7..0fbd003 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -19,15 +19,8 @@ from heurams.services.logger import get_logger from .. import shim - -class AtomState(Enum): - FAILED = auto() - NORMAL = auto() - - logger = get_logger(__name__) - class MemScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), @@ -35,18 +28,17 @@ class MemScreen(Screen): ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("*", "toggle_favorite", "收藏"), - ("0,1,2,3", "app.push_screen('about')", ""), ] if config_var.get()["interface"]["global"]["quick_pass"]: BINDINGS.append(("k", "quick_pass", "正确应答")) BINDINGS.append(("f", "quick_fail", "错误应答")) + rating = reactive(-1) def __init__( self, phaser: Phaser, - save_func: Callable, repo=None, name=None, id=None, @@ -54,7 +46,6 @@ class MemScreen(Screen): ) -> None: super().__init__(name, id, classes) self.phaser = phaser - self.save_func = save_func self.repo = repo self.update_state() self.fission: Fission @@ -62,8 +53,8 @@ class MemScreen(Screen): def compose(self) -> ComposeResult: yield Header(show_clock=True) with ScrollableContainer(): - yield Label(self._get_progress_text(), id="progress") - yield ScrollableContainer(id="puzzle-container") + yield Label(self._get_progress_text(), id="head_stat") + yield ScrollableContainer(id="puzzle_container") yield Footer() def update_state(self): @@ -92,33 +83,12 @@ class MemScreen(Screen): if self.repo is not None: fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" s += f"收藏: {fav_status}\n" - """if config_var.get().get("debug_topline", 0): - try: - alia = self.fission.get_current_puzzle_inf()["alia"] # type: ignore - s += f"谜题: {alia}\n" - except: - pass - try: - stat = self.phaser.__repr__("simple", "") - s += f"{stat}\n" - except: - pass - try: - stat = self.procession.__repr__("simple", "") - s += f"{stat}\n" - except: - pass - try: - stat = self.fission.__repr__("simple", "") - s += f"{stat}\n" - except Exception as e: - s = str(e)""" s += f"进度: {self.procession.process() + 1}/{self.procession.total_length()}" return s def update_display(self): """更新进度显示""" - progress_widget = self.query_one("#progress") + progress_widget = self.query_one("#head_stat") progress_widget.update(self._get_progress_text()) # type: ignore def mount_puzzle(self): @@ -126,14 +96,14 @@ class MemScreen(Screen): if self.procession.phase == PhaserState.FINISHED: self.mount_finished_widget() return - container = self.query_one("#puzzle-container") + container = self.query_one("#puzzle_container") for i in container.children: i.remove() container.mount(self.puzzle_widget()) def mount_finished_widget(self): """挂载已完成组件""" - container = self.query_one("#puzzle-container") + container = self.query_one("#puzzle_container") for i in container.children: i.remove() from heurams.interface.widgets.finished import Finished diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index e775c74..14aaadd 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -17,7 +17,7 @@ paths = config_var.get()["global"]["paths"] cache_dir = pathlib.Path(paths.get("cache", paths["data"] + "/cache")) / "voice" -def format_size(bytes_num: int) -> str: +def human_size(bytes_num: int) -> str: """将字节数格式化为人类可读的字符串""" for unit in ["B", "KB", "MB", "GB", "TB"]: if bytes_num < 1024.0: @@ -97,7 +97,7 @@ class PrecachingScreen(Screen): self.cache_stats["total_size"] = total_size self.cache_stats["file_count"] = file_count - self.cache_stats["human_size"] = format_size(total_size) + self.cache_stats["human_size"] = human_size(total_size) self.cache_stats["cached_units"] = cached_units self.cache_stats["total_units"] = total_units self.cache_stats["cache_rate"] = cache_rate diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index dd2afe8..1f2ef6c 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -1,7 +1,7 @@ """记忆准备界面""" from textual.app import ComposeResult -from textual.containers import ScrollableContainer, Container +from textual.containers import ScrollableContainer, Container, Horizontal from textual.reactive import reactive from textual.screen import Screen from textual.widget import Widget @@ -22,6 +22,7 @@ import heurams.services.hasher as hasher from heurams.context import * from heurams.context import config_var from heurams.kernel.repolib import * +from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger logger = get_logger(__name__) @@ -38,7 +39,7 @@ class PreparationScreen(Screen): ("0,1,2,3", "app.push_screen('about')", ""), ] - scheduled_num = reactive(config_var.get()["interface"]["global"]["scheduled_num"]) + CSS_PATH = rootdir / "interface" / "css" / "screens" / "preparation.tcss" def __init__(self, repo: Repo) -> None: super().__init__(name=None, id=None, classes=None) @@ -47,32 +48,44 @@ class PreparationScreen(Screen): def compose(self) -> ComposeResult: yield Header(show_clock=True) - with Reveal(ScrollableContainer(id="vice_container")): - yield Label(f"准备就绪: [b]{self.repo.manifest['title']}[/b]\n") - yield Label(f"[b]仓库路径: {self.repo.source}[/b]") - yield Label(f"\n单元数量: {len(self.repo)}\n") - yield Label(f"最小记忆分组: {self.scheduled_num}\n", id="schnum_label") - - yield Button( - "开始记忆", - id="start_memorizing_button", - variant="primary", - classes="start-button", + with ScrollableContainer(id="main_container"): + yield Markdown( + f"**准备就绪**: `{self.repo.manifest['title']}`\n", id="title" ) - yield Button( - "预缓存音频", - id="precache_button", - variant="success", - classes="precache-button", + yield Label(f"单元集路径: {self.repo.source}") + yield Label( + f"学习完成度: {self.repo.progress['touched']}/{len(self.repo)} [d]\\[{round(self.repo.progress['touched']/self.repo.progress['total']*100, 1)}%][/d]" + ) + yield Label( + f"调度算法: {self.repo.config["algorithm"]} {algorithms[self.repo.config["algorithm"]].desc}" + ) + yield Label( + f"学习数量: {self.repo.preview['review'] + self.scheduled_num} = {self.repo.preview['review']} [d][复习][/d] + {self.scheduled_num} [d][新识记][/d]\n", + id="schnum_label", + ) + + yield Horizontal( + Button( + "开始记忆", + id="start_memorizing_button", + variant="primary", + classes="btn", + ), + Button( + "预缓存音频", + id="precache_button", + variant="success", + classes="btn", + ), + id="operations", ) yield Static() yield Sparkline(self.spark_line_arr, summary_function=max) - yield Rule() # yield Static(str(self.spark_line_arr)) - yield Static(f"单元状态预览:\n") - for i in self.content.splitlines(): - yield Static(i, classes="full") + with Reveal(ScrollableContainer(id="previewer_container")): + for i in self.content.splitlines(): + yield Static(i, classes="unit-statline") yield Footer() # def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num): @@ -84,6 +97,7 @@ class PreparationScreen(Screen): # pass def load_data(self): + self.scheduled_num = self.repo.config["scheduled_num"] content = "" spark_line_arr = [] for i in self.repo.ident_index: @@ -168,6 +182,5 @@ def launch(repo, app, scheduled_num): from .memoqueue import MemScreen pheser = rt.Phaser(atoms_to_provide) - save_func = repo.persist_to_repodir - memscreen = MemScreen(pheser, save_func, repo=repo) + memscreen = MemScreen(pheser, repo=repo) app.push_screen(memscreen) diff --git a/src/heurams/kernel/auxiliary/lict.deprecated.py b/src/heurams/kernel/auxiliary/lict.deprecated.py deleted file mode 100644 index 9d86005..0000000 --- a/src/heurams/kernel/auxiliary/lict.deprecated.py +++ /dev/null @@ -1,141 +0,0 @@ -# 已弃用 -from collections import UserList -from typing import Any, Iterator - - -class Lict(UserList): # TODO: 优化同步(惰性同步), 当前性能为 O(n) - """ "列典" 对象 - - 同时兼容字典和列表大多数 API, 两边数据同步的容器 - 列表数据是 dictobj.items() 的格式 - 支持根据字典或列表初始化 - 限制要求: - - 键名一定唯一, 且仅能为字符串 - - 值一定是引用对象 - - 不使用并发 - - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 - - """ - - def __init__( - self, - initlist: list | None = None, - initdict: dict | None = None, - ): - self.dicted_data = {} - if initdict != None: - initlist = list(initdict.items()) - super().__init__(initlist=initlist) - self._sync_based_on_list() - self.data.sort() - - def _sync_based_on_dict(self): - self.data = list(self.dicted_data.items()) - self.data.sort() - - def _sync_based_on_list(self): - self.dicted_data = {} - for i in self.data: - self.dicted_data[i[0]] = i[1] - - def __iter__(self) -> Iterator: - return self.data.__iter__() - - def __getitem__(self, i): - if isinstance(i, str): - return self.dicted_data[i] - else: - return super().__getitem__(i) - - def get_itemic_unit(self, ident): - return (ident, self.dicted_data[ident]) - - def __setitem__(self, i, item): - if isinstance(i, str): - self.dicted_data[i] = item - self._sync_based_on_dict() - else: - if item != (item[0], item[1]): - raise NotImplementedError - super().__setitem__(i, item) - self._sync_based_on_list() - - def __delitem__(self, i): - if isinstance(i, str): - del self.dicted_data[i] - self._sync_based_on_dict() - else: - super().__delitem__(i) - self._sync_based_on_list() - - def __contains__(self, item): - return item in self.data or item in self.keys() or item in self.values() - - def append(self, item: Any) -> None: - if item != (item[0], item[1]): - raise NotImplementedError - super().append(item) - self._sync_based_on_list() - self.data.sort() - - def append_new(self, item: Any): - if item != (item[0], item[1]): - raise NotImplementedError - if item[0] not in self: - super().append(item) - self._sync_based_on_list() - self.data.sort() - - def insert(self, i: int, item: Any) -> None: - if item != (item[0], item[1]): # 确保 item 是遵从限制的元组 - raise NotImplementedError - super().insert(i, item) - self._sync_based_on_list() - self.data.sort() - - def pop(self, i: int = -1) -> Any: - res = super().pop(i) - self._sync_based_on_list() - return res - - def remove(self, item: Any) -> None: - if isinstance(item, str): - item = (item, self.dicted_data[item]) - if item != (item[0], item[1]): - raise NotImplementedError - super().remove(item) - self._sync_based_on_list() - self.data.sort() - - def clear(self) -> None: - super().clear() - self._sync_based_on_list() - - def index(self): - raise NotImplementedError - - def extend(self): - raise NotImplementedError - - def sort(self): - raise NotImplementedError - - def reverse(self): - raise NotImplementedError - - def keys(self): - return self.dicted_data.keys() - - def values(self): - return self.dicted_data.values() - - def items(self): - return self.data - - def keys_equal_with(self, other): - return self.key_equality(self, other) - - @classmethod - def key_equality(cls, a, b): - return a.keys() == b.keys() diff --git a/src/heurams/kernel/auxiliary/refvar.deprecated.py b/src/heurams/kernel/auxiliary/refvar.deprecated.py deleted file mode 100644 index 71c1c5f..0000000 --- a/src/heurams/kernel/auxiliary/refvar.deprecated.py +++ /dev/null @@ -1,242 +0,0 @@ -# 已弃用 -class RefVar: - def __init__(self, initvalue) -> None: - self.data = initvalue - - def __repr__(self) -> str: - return f"RefVar({repr(self.data)})" - - def __str__(self) -> str: - return str(self.data) - - def __add__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data + other.data) - return RefVar(self.data + other) - - def __radd__(self, other): - return RefVar(other + self.data) - - def __sub__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data - other.data) - return RefVar(self.data - other) - - def __rsub__(self, other): - return RefVar(other - self.data) - - def __mul__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data * other.data) - return RefVar(self.data * other) - - def __rmul__(self, other): - return RefVar(other * self.data) - - def __truediv__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data / other.data) - return RefVar(self.data / other) - - def __rtruediv__(self, other): - return RefVar(other / self.data) - - def __floordiv__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data // other.data) - return RefVar(self.data // other) - - def __rfloordiv__(self, other): - return RefVar(other // self.data) - - def __mod__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data % other.data) - return RefVar(self.data % other) - - def __rmod__(self, other): - return RefVar(other % self.data) - - def __pow__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data**other.data) - return RefVar(self.data**other) - - def __rpow__(self, other): - return RefVar(other**self.data) - - def __neg__(self): - return RefVar(-self.data) - - def __pos__(self): - return RefVar(+self.data) - - def __abs__(self): - return RefVar(abs(self.data)) - - def __eq__(self, other): - if isinstance(other, RefVar): - return self.data == other.data - return self.data == other - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - if isinstance(other, RefVar): - return self.data < other.data - return self.data < other - - def __le__(self, other): - if isinstance(other, RefVar): - return self.data <= other.data - return self.data <= other - - def __gt__(self, other): - if isinstance(other, RefVar): - return self.data > other.data - return self.data > other - - def __ge__(self, other): - if isinstance(other, RefVar): - return self.data >= other.data - return self.data >= other - - # 位运算 - def __and__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data & other.data) - return RefVar(self.data & other) - - def __rand__(self, other): - return RefVar(other & self.data) - - def __or__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data | other.data) - return RefVar(self.data | other) - - def __ror__(self, other): - return RefVar(other | self.data) - - def __xor__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data ^ other.data) - return RefVar(self.data ^ other) - - def __rxor__(self, other): - return RefVar(other ^ self.data) - - def __lshift__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data << other.data) - return RefVar(self.data << other) - - def __rlshift__(self, other): - return RefVar(other << self.data) - - def __rshift__(self, other): - if isinstance(other, RefVar): - return RefVar(self.data >> other.data) - return RefVar(self.data >> other) - - def __rrshift__(self, other): - return RefVar(other >> self.data) - - def __invert__(self): - return RefVar(~self.data) - - # 类型转换 - def __int__(self): - return int(self.data) - - def __float__(self): - return float(self.data) - - def __bool__(self): - return bool(self.data) - - def __complex__(self): - return complex(self.data) - - def __bytes__(self): - return bytes(self.data) - - def __hash__(self): - return hash(self.data) - - # 容器操作(如果底层数据支持) - def __len__(self): - return len(self.data) - - def __getitem__(self, key): - return self.data[key] - - def __setitem__(self, key, value): - self.data[key] = value - - def __delitem__(self, key): - del self.data[key] - - def __contains__(self, item): - return item in self.data - - def __iter__(self): - return iter(self.data) - - def __iadd__(self, other): - if isinstance(other, RefVar): - self.data += other.data - else: - self.data += other - return self - - def __isub__(self, other): - if isinstance(other, RefVar): - self.data -= other.data - else: - self.data -= other - return self - - def __imul__(self, other): - if isinstance(other, RefVar): - self.data *= other.data - else: - self.data *= other - return self - - def __itruediv__(self, other): - if isinstance(other, RefVar): - self.data /= other.data - else: - self.data /= other - return self - - def __ifloordiv__(self, other): - if isinstance(other, RefVar): - self.data //= other.data - else: - self.data //= other - return self - - def __imod__(self, other): - if isinstance(other, RefVar): - self.data %= other.data - else: - self.data %= other - return self - - def __ipow__(self, other): - if isinstance(other, RefVar): - self.data **= other.data - else: - self.data **= other - return self - - def __call__(self, *args, **kwargs): - if callable(self.data): - return self.data(*args, **kwargs) - raise TypeError(f"'{type(self.data).__name__}' object is not callable") - - def __getattr__(self, name): - return getattr(self.data, name) diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index 6081401..8eb29bf 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -24,7 +24,7 @@ def get_daystamp() -> int: def get_timestamp() -> float: """获取 UNIX 时间戳""" - # 搞这个类的原因是要支持可复现操作 + # 搞这个函数的原因是要支持可复现操作 time_override = config_var.get()["services"]["timer"]["timestamp_override"] if time_override != -1: logger.debug("使用覆盖的时间戳: %f", time_override) @@ -32,4 +32,4 @@ def get_timestamp() -> float: result = time.time() logger.debug("获取当前时间戳: %f", result) - return result + return result \ No newline at end of file From fc70aa07f68ddb4db0aed6152cf30b1685cd45ba Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 21 Apr 2026 12:52:30 +0800 Subject: [PATCH 45/79] =?UTF-8?q?refactor:=20=E5=BC=80=E5=A7=8B=E7=BF=BB?= =?UTF-8?q?=E6=96=B0=E7=8A=B6=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/data/config/config.toml | 0 examples/test_repo/algodata.json | 1 - examples/test_repo/manifest.toml | 3 - examples/test_repo/payload.toml | 11 ---- examples/test_repo/schedule.toml | 5 -- examples/test_repo/typedef.toml | 17 ------ .../interface/css/screens/memoqueue.tcss | 4 ++ src/heurams/interface/screens/memoqueue.py | 38 +++++++----- src/heurams/interface/screens/preparation.py | 4 +- src/heurams/interface/widgets/cloze_puzzle.py | 4 +- src/heurams/interface/widgets/finished.py | 2 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/kernel/reactor/README.md | 48 +++++++-------- src/heurams/kernel/reactor/__init__.py | 8 +-- .../reactor/{fission.py => expander.py} | 24 ++++---- src/heurams/kernel/reactor/procession.py | 10 ++-- .../kernel/reactor/{phaser.py => router.py} | 60 +++++++++---------- src/heurams/kernel/reactor/states.py | 4 +- src/heurams/services/session.py | 1 + 19 files changed, 111 insertions(+), 135 deletions(-) delete mode 100644 examples/data/config/config.toml delete mode 100644 examples/test_repo/algodata.json delete mode 100644 examples/test_repo/manifest.toml delete mode 100644 examples/test_repo/payload.toml delete mode 100644 examples/test_repo/schedule.toml delete mode 100644 examples/test_repo/typedef.toml create mode 100644 src/heurams/interface/css/screens/memoqueue.tcss rename src/heurams/kernel/reactor/{fission.py => expander.py} (86%) rename src/heurams/kernel/reactor/{phaser.py => router.py} (67%) create mode 100644 src/heurams/services/session.py diff --git a/examples/data/config/config.toml b/examples/data/config/config.toml deleted file mode 100644 index e69de29..0000000 diff --git a/examples/test_repo/algodata.json b/examples/test_repo/algodata.json deleted file mode 100644 index 9e26dfe..0000000 --- a/examples/test_repo/algodata.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/examples/test_repo/manifest.toml b/examples/test_repo/manifest.toml deleted file mode 100644 index 6e5f567..0000000 --- a/examples/test_repo/manifest.toml +++ /dev/null @@ -1,3 +0,0 @@ -title = "测试单元: 过秦论" -author = "__heurams__" -desc = "高考古诗文: 过秦论" \ No newline at end of file diff --git a/examples/test_repo/payload.toml b/examples/test_repo/payload.toml deleted file mode 100644 index 314995e..0000000 --- a/examples/test_repo/payload.toml +++ /dev/null @@ -1,11 +0,0 @@ -["秦孝公据崤函之固, 拥雍州之地,"] -note = [] -content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" -translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," -keyword_note = {"据"="占据", "崤函"="崤山和函谷关", "雍州"="古代九州之一"} - -["君臣固守以窥周室,"] -note = [] -content = "君臣/固守/以窥/周室,/" -translation = "君臣牢固地守卫着,借以窥视周王室的权力," -keyword_note = {"窥"="窥视"} diff --git a/examples/test_repo/schedule.toml b/examples/test_repo/schedule.toml deleted file mode 100644 index d62ef1f..0000000 --- a/examples/test_repo/schedule.toml +++ /dev/null @@ -1,5 +0,0 @@ -schedule = ["quick_review", "recognition", "final_review"] -[phases] -quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] -recognition = [["Recognition", "1.0"]] -final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file diff --git a/examples/test_repo/typedef.toml b/examples/test_repo/typedef.toml deleted file mode 100644 index 1d06672..0000000 --- a/examples/test_repo/typedef.toml +++ /dev/null @@ -1,17 +0,0 @@ -[annotation] -note = "笔记" -keyword_note = "关键词翻译" -translation = "语句翻译" -delimiter = "分隔符" -content = "内容" -tts_text = "文本转语音文本" - -[common] -delimiter = "/" -tts_text = "eval:payload['content'].replace('/', '')" - -[common.puzzles] # 谜题定义 -# 我们称 "Recognition" 为 recognition 谜题的 alia -"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } -"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/src/heurams/interface/css/screens/memoqueue.tcss b/src/heurams/interface/css/screens/memoqueue.tcss new file mode 100644 index 0000000..24d31ec --- /dev/null +++ b/src/heurams/interface/css/screens/memoqueue.tcss @@ -0,0 +1,4 @@ +#puzzle_container > * { + height: auto; + width: auto; +} \ No newline at end of file diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 0fbd003..c224840 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -5,14 +5,14 @@ from pathlib import Path from typing import Callable from textual.app import ComposeResult -from textual.containers import Center, ScrollableContainer +from textual.containers import Center, ScrollableContainer, Container from textual.reactive import reactive from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz -from heurams.context import config_var +from heurams.context import config_var, rootdir from heurams.kernel.reactor import * from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger @@ -28,8 +28,13 @@ class MemScreen(Screen): ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("*", "toggle_favorite", "收藏"), + ("n", "block_prompt"), + ("s", "block_prompt"), + ("z", "block_prompt"), ] + CSS_PATH = rootdir / 'interface' / 'css' / 'screens' / 'memoqueue.tcss' + if config_var.get()["interface"]["global"]["quick_pass"]: BINDINGS.append(("k", "quick_pass", "正确应答")) BINDINGS.append(("f", "quick_fail", "错误应答")) @@ -38,17 +43,17 @@ class MemScreen(Screen): def __init__( self, - phaser: Phaser, + router: Router, repo=None, name=None, id=None, classes=None, ) -> None: super().__init__(name, id, classes) - self.phaser = phaser + self.router = router self.repo = repo self.update_state() - self.fission: Fission + self.expander: Expander def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -59,17 +64,17 @@ class MemScreen(Screen): def update_state(self): """更新状态机""" - self.procession: Procession = self.phaser.current_procession() # type: ignore + self.procession: Procession = self.router.current_procession() # type: ignore self.atom: pt.Atom = self.procession.current_atom # type: ignore def on_mount(self): - self.fission = self.procession.get_fission() + self.expander = self.procession.get_expander() self.mount_puzzle() self.update_display() def puzzle_widget(self): try: - puzzle = self.fission.get_current_puzzle_inf() + puzzle = self.expander.get_current_puzzle_inf() return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore atom=self.atom, alia=puzzle["alia"] # type: ignore ) @@ -93,7 +98,7 @@ class MemScreen(Screen): def mount_puzzle(self): """挂载当前谜题组件""" - if self.procession.phase == PhaserState.FINISHED: + if self.procession.phase == RouterState.FINISHED: self.mount_finished_widget() return container = self.query_one("#puzzle_container") @@ -139,10 +144,10 @@ class MemScreen(Screen): if new_rating == -1: # 安全值 return self.update_state() - if self.procession.phase == PhaserState.FINISHED: + if self.procession.phase == RouterState.FINISHED: rating = -1 return - self.fission.report(new_rating) + self.expander.report(new_rating) self.forward(new_rating) self.rating = -1 @@ -150,9 +155,9 @@ class MemScreen(Screen): self.update_state() allow_forward = 1 if rating >= 4 else 0 if allow_forward: - self.fission.forward() - if self.fission.state == "retronly": - self.forward_atom(self.fission.get_quality()) + self.expander.forward() + if self.expander.state == "retronly": + self.forward_atom(self.expander.get_quality()) self.update_state() self.mount_puzzle() self.update_display() @@ -177,7 +182,7 @@ class MemScreen(Screen): self.update_state() # 刷新状态 self.procession.forward(1) self.update_state() # 刷新状态 - self.fission = self.procession.get_fission() + self.expander = self.procession.get_expander() def action_go_back(self): self.app.pop_screen() @@ -224,3 +229,6 @@ class MemScreen(Screen): self.app.notify(f"已收藏:{ident}", severity="information") # 更新显示(如果需要) self.update_display() + + def action_block_prompt(self): + self.app.notify("功能在记忆界面中不可用, 完成或返回后再试", severity="error") \ No newline at end of file diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 1f2ef6c..c72776f 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -181,6 +181,6 @@ def launch(repo, app, scheduled_num): from .memoqueue import MemScreen - pheser = rt.Phaser(atoms_to_provide) - memscreen = MemScreen(pheser, repo=repo) + router = rt.Router(atoms_to_provide) + memscreen = MemScreen(router=router, repo=repo) app.push_screen(memscreen) diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 12a9e13..19a0255 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -2,7 +2,7 @@ import copy import random from typing import TypedDict -from textual.containers import Container +from textual.containers import Container, ScrollableContainer from textual.message import Message from textual.widget import Widget from textual.widgets import Button, Label, Markdown @@ -68,7 +68,7 @@ class ClozePuzzle(BasePuzzleWidget): yield Label(self.puzzle.wording, id="sentence") yield Markdown(f"> {self.listprint(self.inputlist)}", id="inputpreview") # 渲染当前问题的选项 - with Container(id="btn-container"): + with ScrollableContainer(id="btn-container"): for i in self.ans: h = str(hash(i)) self.hashmap[h] = i diff --git a/src/heurams/interface/widgets/finished.py b/src/heurams/interface/widgets/finished.py index db1c31e..b9b5270 100644 --- a/src/heurams/interface/widgets/finished.py +++ b/src/heurams/interface/widgets/finished.py @@ -28,7 +28,7 @@ class Finished(Widget): def compose(self): yield Label("本次记忆进程结束", id="finished_msg") yield Label(f"算法数据{'已保存' if self.is_saved else "未能保存"}") - yield Button("返回上一级", id="back-to-menu") + yield Button("返回上一级", flat=True, id="back-to-menu") def on_button_pressed(self, event): button_id = event.button.id diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 400a601..0b68baf 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -75,7 +75,7 @@ class MCQPuzzle(BasePuzzleWidget): yield Label(f"当前输入: {self.inputlist}", id="inputpreview") # 渲染当前问题的选项 - with Container(id="btn-container"): + with ScrollableContainer(id="btn-container"): for i in current_options: self.hashmap[str(hash(i))] = i btnid = f"sel{str(self.cursor).zfill(3)}-{hash(i)}" diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index dd7db5f..aa7dd9f 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -3,9 +3,9 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实现是解耦的, 以便后期与其他框架的适配.\ 得益于 Pickle, 状态机模块支持快照! -## Phaser - 全局阶段控制器 +## Router - 全局阶段控制器 -在一次队列记忆流程中, Phaser 代表记忆流程本身. +在一次队列记忆流程中, Router 代表记忆流程本身. ### 属性 @@ -25,7 +25,7 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实 在初始化 Procession 时, 每个 Procession 被赋予一个不重复的状态属性 作为"阶段状态"属性, 以此标识 Procession 的阶段属性, 因为每个 Procession 管理一个阶段下的复习进程. -你可以用 state 属性获取 Phaser 的当前状态. +你可以用 state 属性获取 Router 的当前状态. #### Procession 属性 @@ -34,26 +34,26 @@ Reactor 是 HeurAMS 的记忆流程状态机模块, 和界面 (interface) 的实 ### 初始化 -Phaser 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料\ +Router 接受一个存储 Atom 对象的列表, 作为组织记忆流程的材料\ 在内部, 根据是否激活将其分为 new_atoms 与 old_atoms.\ 因此, 如果你传入的列表中有算法上"无所事事"的 Atom, 流程会对其进行"加强复习" 由此创建 Procession. ### 直接输出呈现形式 -Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ +Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ 其以 ascii 表格形式输出, 格式也符合 markdown 表格规范, 你可以直接复制到 markdown.\ 示例: ```text -| Type | State | Processions | Current Procession | -|:-------|:--------|:-----------------------|:---------------------| -| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | +| Type | State | Processions | Current Procession | +| :----- | :----- | :--------------------- | :----------------- | +| Router | unsure | ['新记忆', '总体复习'] | 新记忆 | ``` -| Type | State | Processions | Current Procession | -|:-------|:--------|:-----------------------|:---------------------| -| Phaser | unsure | ['新记忆', '总体复习'] | 新记忆 | +| Type | State | Processions | Current Procession | +| :----- | :----- | :--------------------- | :----------------- | +| Router | unsure | ['新记忆', '总体复习'] | 新记忆 | ### 方法 @@ -85,29 +85,29 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ - cursor: 指针, 是当前原子在 atoms 列表中的索引 - phase: "阶段属性" -> 注意区分 "Phaser" 和 "Phase", 其中 "Phase" 表示 "Phaser State". +> 注意区分 "Router" 和 "Phase", 其中 "Phase" 表示 "Router State". - name\_: 阶段的命名 - state: 当前状态属性 ### 初始化 -接受一个 atoms 列表与 phase_state (PhaserState Enum 类型)对象 +接受一个 atoms 列表与 phase_state (RouterState Enum 类型)对象 ### 直接输出呈现形式 -同 Phaser, 但显示数据有所不同\ -与 Phaser 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) +同 Router, 但显示数据有所不同\ +与 Router 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) ```text -| Type | Name | State | Progress | Queue | Current Atom | -|:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| -| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +| Type | Name | State | Progress | Queue | Current Atom | +| :--------- | :----- | :----- | :------- | :--------------------- | :---------------------------- | +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ``` -| Type | Name | State | Progress | Queue | Current Atom | -|:-----------|:-------|:--------|:-----------|:-----------------------|:------------------------------| -| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +| Type | Name | State | Progress | Queue | Current Atom | +| :--------- | :----- | :----- | :------- | :--------------------- | :---------------------------- | +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ### 方法 @@ -142,11 +142,11 @@ Phaser 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ 判断是否为空队列(传入原子列表对象是空列表的队列) -#### get_fission(self) +#### get_expander(self) -获取当前原子的 Fission 对象, 用于单原子调度展开 +获取当前原子的 Expander 对象, 用于单原子调度展开 -## Fission - 单原子调度控制器 +## Expander - 单原子调度控制器 ### 属性 diff --git a/src/heurams/kernel/reactor/__init__.py b/src/heurams/kernel/reactor/__init__.py index f9242fa..9bec671 100644 --- a/src/heurams/kernel/reactor/__init__.py +++ b/src/heurams/kernel/reactor/__init__.py @@ -1,8 +1,8 @@ from heurams.services.logger import get_logger -from .fission import Fission -from .phaser import Phaser +from .expander import Expander +from .router import Router from .procession import Procession -from .states import PhaserState, ProcessionState +from .states import RouterState, ProcessionState -__all__ = ["PhaserState", "ProcessionState", "Procession", "Fission", "Phaser"] +__all__ = ["RouterState", "ProcessionState", "Procession", "Expander", "Router"] diff --git a/src/heurams/kernel/reactor/fission.py b/src/heurams/kernel/reactor/expander.py similarity index 86% rename from src/heurams/kernel/reactor/fission.py rename to src/heurams/kernel/reactor/expander.py index 4d1d100..67bc52e 100644 --- a/src/heurams/kernel/reactor/fission.py +++ b/src/heurams/kernel/reactor/expander.py @@ -8,39 +8,39 @@ import heurams.kernel.particles as pt import heurams.kernel.puzzles as puz from heurams.services.logger import get_logger -from .states import FissionState, PhaserState +from .states import ExpanderState, RouterState logger = get_logger(__name__) -class Fission(Machine): +class Expander(Machine): """单原子调度展开器""" - def __init__(self, atom: pt.Atom, phase=PhaserState.RECOGNITION): + def __init__(self, atom: pt.Atom, phase=RouterState.RECOGNITION): self.phase = phase self.cursor = 0 self.atom = atom self.current_puzzle_inf: dict - # phase 为 PhaserState 枚举实例, 需要获取其value + # phase 为 RouterState 枚举实例, 需要获取其value phase_value = phase.value states = [ - {"name": FissionState.EXAMMODE.value}, - {"name": FissionState.RETRONLY.value}, + {"name": ExpanderState.EXAMMODE.value}, + {"name": ExpanderState.RETRONLY.value}, ] transitions = [ { "trigger": "finish", - "source": FissionState.EXAMMODE.value, - "dest": FissionState.RETRONLY.value, + "source": ExpanderState.EXAMMODE.value, + "dest": ExpanderState.RETRONLY.value, }, ] - if phase == PhaserState.FINISHED: + if phase == RouterState.FINISHED: Machine.__init__( self, states=states, transitions=transitions, - initial=FissionState.EXAMMODE.value, + initial=ExpanderState.EXAMMODE.value, ) return orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore @@ -81,7 +81,7 @@ class Fission(Machine): self, states=states, transitions=transitions, - initial=FissionState.EXAMMODE.value, + initial=ExpanderState.EXAMMODE.value, ) def get_puzzles_inf(self): @@ -118,7 +118,7 @@ class Fission(Machine): dic = [ { - "Type": "Fission", + "Type": "Expander", "Atom": truncate(self.atom.ident), "State": self.state, "Progress": f"{self.cursor + 1} / {len(self.puzzles_inf)}", diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 3f37ca5..70c0bff 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -4,8 +4,8 @@ from transitions import Machine import heurams.kernel.particles as pt from heurams.services.logger import get_logger -from .fission import Fission -from .states import PhaserState, ProcessionState +from .expander import Expander +from .states import RouterState, ProcessionState logger = get_logger(__name__) @@ -13,7 +13,7 @@ logger = get_logger(__name__) class Procession(Machine): """队列: 标识单次记忆流程""" - def __init__(self, atoms: list, phase_state: PhaserState, name_: str = ""): + def __init__(self, atoms: list, phase_state: RouterState, name_: str = ""): logger.debug( "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", len(atoms), @@ -113,8 +113,8 @@ class Procession(Machine): logger.debug("Procession.is_empty: %s", empty) return empty - def get_fission(self): - return Fission(atom=self.current_atom, phase=self.phase) # type: ignore + def get_expander(self): + return Expander(atom=self.current_atom, phase=self.phase) # type: ignore def __repr__(self, style="pipe", ends="\n"): from heurams.services.textproc import truncate diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/router.py similarity index 67% rename from src/heurams/kernel/reactor/phaser.py rename to src/heurams/kernel/reactor/router.py index a22d80f..46ac1dd 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/router.py @@ -5,16 +5,16 @@ from heurams.kernel.particles.placeholders import AtomPlaceholder from heurams.services.logger import get_logger from .procession import Procession -from .states import PhaserState, ProcessionState +from .states import RouterState, ProcessionState logger = get_logger(__name__) -class Phaser(Machine): +class Router(Machine): """全局调度阶段管理器""" def __init__(self, atoms: list[pt.Atom]) -> None: - logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) + logger.debug("Router.__init__: 原子数量=%d", len(atoms)) self.atoms = atoms new_atoms = list() @@ -32,50 +32,50 @@ class Phaser(Machine): # TODO: 改进为基于配置文件的可选复习阶段 if len(old_atoms): self.processions.append( - Procession(old_atoms, PhaserState.QUICK_REVIEW, "初始复习") + Procession(old_atoms, RouterState.QUICK_REVIEW, "初始复习") ) logger.debug("创建初始复习 Procession") if len(new_atoms): self.processions.append( - Procession(new_atoms, PhaserState.RECOGNITION, "新记忆") + Procession(new_atoms, RouterState.RECOGNITION, "新记忆") ) logger.debug("创建新记忆 Procession") - self.processions.append(Procession(atoms, PhaserState.FINAL_REVIEW, "总体复习")) + self.processions.append(Procession(atoms, RouterState.FINAL_REVIEW, "总体复习")) logger.debug("创建总体复习 Procession") - logger.debug("Phaser 初始化完成, processions 数量=%d", len(self.processions)) + logger.debug("Router 初始化完成, processions 数量=%d", len(self.processions)) # 设置transitions状态机 states = [ - {"name": PhaserState.UNSURE.value, "on_enter": "on_unsure"}, - {"name": PhaserState.QUICK_REVIEW.value, "on_enter": "on_quick_review"}, - {"name": PhaserState.RECOGNITION.value, "on_enter": "on_recognition"}, - {"name": PhaserState.FINAL_REVIEW.value, "on_enter": "on_final_review"}, - {"name": PhaserState.FINISHED.value, "on_enter": "on_finished"}, + {"name": RouterState.UNSURE.value, "on_enter": "on_unsure"}, + {"name": RouterState.QUICK_REVIEW.value, "on_enter": "on_quick_review"}, + {"name": RouterState.RECOGNITION.value, "on_enter": "on_recognition"}, + {"name": RouterState.FINAL_REVIEW.value, "on_enter": "on_final_review"}, + {"name": RouterState.FINISHED.value, "on_enter": "on_finished"}, ] transitions = [ - {"trigger": "to_unsure", "source": "*", "dest": PhaserState.UNSURE.value}, + {"trigger": "to_unsure", "source": "*", "dest": RouterState.UNSURE.value}, { "trigger": "to_quick_review", "source": "*", - "dest": PhaserState.QUICK_REVIEW.value, + "dest": RouterState.QUICK_REVIEW.value, }, { "trigger": "to_recognition", "source": "*", - "dest": PhaserState.RECOGNITION.value, + "dest": RouterState.RECOGNITION.value, }, { "trigger": "to_final_review", "source": "*", - "dest": PhaserState.FINAL_REVIEW.value, + "dest": RouterState.FINAL_REVIEW.value, }, { "trigger": "to_finished", "source": "*", - "dest": PhaserState.FINISHED.value, + "dest": RouterState.FINISHED.value, }, ] @@ -83,45 +83,45 @@ class Phaser(Machine): self, states=states, transitions=transitions, - initial=PhaserState.UNSURE.value, + initial=RouterState.UNSURE.value, ) self.to_unsure() def on_unsure(self): """进入UNSURE状态时的回调""" - logger.debug("Phaser 进入 UNSURE 状态") + logger.debug("Router 进入 UNSURE 状态") def on_quick_review(self): """进入QUICK_REVIEW状态时的回调""" - logger.debug("Phaser 进入 QUICK_REVIEW 状态") + logger.debug("Router 进入 QUICK_REVIEW 状态") def on_recognition(self): """进入RECOGNITION状态时的回调""" - logger.debug("Phaser 进入 RECOGNITION 状态") + logger.debug("Router 进入 RECOGNITION 状态") def on_final_review(self): """进入FINAL_REVIEW状态时的回调""" - logger.debug("Phaser 进入 FINAL_REVIEW 状态") + logger.debug("Router 进入 FINAL_REVIEW 状态") def on_finished(self): """进入FINISHED状态时的回调""" for i in self.atoms: i.lock(1) i.revise() - logger.debug("Phaser 进入 FINISHED 状态") + logger.debug("Router 进入 FINISHED 状态") def current_procession(self): - logger.debug("Phaser.current_procession 被调用") + logger.debug("Router.current_procession 被调用") for i in self.processions: i: Procession if i.state != ProcessionState.FINISHED.value: - # if i.phase == PhaserState.UNSURE: 此判断是不必要的 因为没有这种 Procession - if i.phase == PhaserState.QUICK_REVIEW: + # if i.phase == RouterState.UNSURE: 此判断是不必要的 因为没有这种 Procession + if i.phase == RouterState.QUICK_REVIEW: self.to_quick_review() - elif i.phase == PhaserState.RECOGNITION: + elif i.phase == RouterState.RECOGNITION: self.to_recognition() - elif i.phase == PhaserState.FINAL_REVIEW: + elif i.phase == RouterState.FINAL_REVIEW: self.to_final_review() logger.debug("找到未完成的 Procession: phase=%s", i.phase) @@ -130,7 +130,7 @@ class Phaser(Machine): # 所有Procession都已完成 self.to_finished() logger.debug("所有 Procession 已完成, 状态设置为 FINISHED") - return Procession([AtomPlaceholder()], PhaserState.FINISHED) + return Procession([AtomPlaceholder()], RouterState.FINISHED) def __repr__(self, style="pipe", ends="\n"): from tabulate import tabulate as tabu @@ -139,7 +139,7 @@ class Phaser(Machine): lst = [ { - "Type": "Phaser", + "Type": "Router", "State": self.state, "Processions": list(map(lambda f: (f.name_), self.processions)), "Current Procession": "None" if not self.current_procession() else self.current_procession().name_, # type: ignore diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py index ad895c9..5bb2198 100644 --- a/src/heurams/kernel/reactor/states.py +++ b/src/heurams/kernel/reactor/states.py @@ -5,7 +5,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) -class PhaserState(Enum): +class RouterState(Enum): UNSURE = "unsure" QUICK_REVIEW = "quick_review" RECOGNITION = "recognition" @@ -18,7 +18,7 @@ class ProcessionState(Enum): FINISHED = "finished" -class FissionState(Enum): +class ExpanderState(Enum): EXAMMODE = "exammode" RETRONLY = "retronly" diff --git a/src/heurams/services/session.py b/src/heurams/services/session.py new file mode 100644 index 0000000..35903e7 --- /dev/null +++ b/src/heurams/services/session.py @@ -0,0 +1 @@ +"""会话记录模块""" \ No newline at end of file From 093034828b07b8c738bd2a39bf0e7bf272abcd90 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 21 Apr 2026 16:52:04 +0800 Subject: [PATCH 46/79] =?UTF-8?q?feat:=20=E5=BC=80=E5=8F=91=20unifront=20?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=9A=E8=AF=9D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 2 +- data/config/interface/_.toml | 4 +-- data/config/interface/global.toml | 16 +++++++--- data/repo/cngk-t/schedule.toml | 2 +- src/heurams/interface/__init__.py | 4 +++ .../interface/css/screens/dashboard.tcss | 2 +- src/heurams/interface/screens/about.py | 15 ++++++++- src/heurams/interface/screens/dashboard.py | 21 ++++++++++--- src/heurams/interface/screens/favmgr.py | 13 +++++++- src/heurams/interface/screens/memoqueue.py | 25 +++++++++++---- src/heurams/interface/screens/navigator.py | 2 ++ src/heurams/interface/screens/precache.py | 12 ++++++- src/heurams/interface/screens/preparation.py | 16 ++++++++-- src/heurams/interface/screens/setting.py | 31 ++++++++++++------- src/heurams/interface/screens/synctool.py | 12 ++++++- src/heurams/interface/shim.py | 12 +++++++ src/heurams/kernel/algorithms/sm15m_calc.py | 6 ++-- src/heurams/kernel/particles/orbital.py | 4 +-- src/heurams/kernel/particles/placeholders.py | 2 +- src/heurams/kernel/reactor/README.md | 12 +++---- src/heurams/kernel/reactor/expander.py | 16 +++++----- src/heurams/kernel/reactor/procession.py | 12 +++---- src/heurams/kernel/reactor/router.py | 17 +++++----- src/heurams/services/session.py | 1 - src/heurams/services/timer.py | 2 +- src/heurams/unifront/session.py | 3 ++ 26 files changed, 191 insertions(+), 73 deletions(-) delete mode 100644 src/heurams/services/session.py create mode 100644 src/heurams/unifront/session.py diff --git a/data/config/global.toml b/data/config/global.toml index 486e242..81b0d99 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,4 +1,4 @@ -zmq_debug = false +zmq_debug = true _zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 _zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" diff --git a/data/config/interface/_.toml b/data/config/interface/_.toml index 84f18c8..fdafebb 100644 --- a/data/config/interface/_.toml +++ b/data/config/interface/_.toml @@ -1,4 +1,4 @@ _global_desc = "用户界面通用设置" -_widgets_desc = "各组件设置" -_screens_desc = "各界面设置" +_widgets_desc = "组件设置" +_screens_desc = "界面设置" _puzzles_desc = "谜题生成器设置" diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index f8eaaff..37f575c 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -1,3 +1,9 @@ +show_header = true +_show_header_desc = "展示界面顶部的标题栏\n如果您想节省这一行空间, 可以禁用它" +clock_on_header = true +_clock_on_header_desc = "在界面顶部的标题栏显示时间" +change_window_title = true +_change_window_title_desc = "更改终端模拟器窗口的标题\n如果禁用了 header, 则建议启用" persist_to_file = true _persist_to_file_desc = "[调试] 将记忆更改保存到文件" quick_pass = true @@ -5,13 +11,15 @@ _quick_pass_desc = "[调试] 启用快速应答功能(跳过测验)" auto_pass = false _auto_pass_desc = "[调试] 自动通过测试模式" scheduled_num = 420 -_scheduled_num_desc = "默认记忆单元数量(可被单元集设置覆盖)" +_scheduled_num_desc = "默认记忆单元数量\n可被单元集设置覆盖" +refresh_on_resume = true +_refresh_on_resume_desc = "[调试] 每当 Screen 激活后都刷新状态" algorithm = "SM-2" -_algorithm_desc = "默认记忆调度算法(可被单元集设置覆盖)" +_algorithm_desc = "默认记忆调度算法\n可被单元集设置覆盖" [_algorithm_candidate] NSP-0 = "筛选用非间隔重复调度器" none = "不设置默认调度器" -SM-2 = "第二代 SuperMemo 简单间隔重复调度器" -SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" +SM-2 = "第二代 SuperMemo 简单间隔重复调度器\nWozniak 于 1987 年提出, Anki 的默认算法" +SM-15M = "类第15代 SuperMemo 复杂间隔重复调度器\n不稳定且逆向工程" FSRS = "先进开放间隔重复调度器" diff --git a/data/repo/cngk-t/schedule.toml b/data/repo/cngk-t/schedule.toml index e3a808b..135f1fc 100644 --- a/data/repo/cngk-t/schedule.toml +++ b/data/repo/cngk-t/schedule.toml @@ -1,6 +1,6 @@ schedule = ["quick_review", "recognition", "final_review"] -[phases] +[routes] quick_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] recognition = [["FillBlank", "1.0"]] final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index b01807a..cbd4ad5 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -25,6 +25,7 @@ from .screens.navigator import NavigatorScreen from .screens.precache import PrecachingScreen from .screens.setting import SettingScreen from .screens.synctool import SyncScreen +from . import shim _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -56,6 +57,9 @@ class HeurAMSApp(App): "setting": SettingScreen, } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + def on_mount(self) -> None: self.push_screen("dashboard") diff --git a/src/heurams/interface/css/screens/dashboard.tcss b/src/heurams/interface/css/screens/dashboard.tcss index bbd8cf7..b59dfa9 100644 --- a/src/heurams/interface/css/screens/dashboard.tcss +++ b/src/heurams/interface/css/screens/dashboard.tcss @@ -8,7 +8,7 @@ .repo-list-item { layout: grid; - grid-size: 2; + grid-size: 1; height: 3; } diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 1af4e7d..de68981 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -5,6 +5,8 @@ from textual.containers import ScrollableContainer from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Markdown, Static +from textual import events, on + import heurams.services.version as version from heurams.context import * import platform @@ -19,8 +21,19 @@ class AboutScreen(Screen): ("q", "go_back", "返回"), ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def compose(self) -> ComposeResult: - yield Header(show_clock=True) + + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="about_container"): yield Label("[b]关于与版本信息[/b]") diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 623ae6e..df13491 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -10,6 +10,8 @@ from textual.containers import ScrollableContainer, Container, Horizontal, Verti from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static from textual.layouts import horizontal +from textual import events, on +from textual.reactive import reactive import heurams.kernel.particles as pt import heurams.services.timer as timer @@ -37,6 +39,8 @@ class DashboardScreen(Screen): CSS_PATH = rootdir / "interface" / "css" / "screens" / "dashboard.tcss" + repolink = reactive({}) + def __init__( self, name: str | None = None, @@ -44,12 +48,12 @@ class DashboardScreen(Screen): classes: str | None = None, ) -> None: super().__init__(name, id, classes) - self.repolink = {} + self._load_data() def compose(self) -> ComposeResult: """组合界面组件""" - self._load_data() - yield Header(show_clock=True) + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(): yield Horizontal( # 顶部的状态 Vertical( @@ -58,7 +62,7 @@ class DashboardScreen(Screen): f"应用时区修正: UTC+{str(config_var.get()['services']['timer']['timezone_offset'] / 3600).rstrip('.0')}" ), Label( - f"默认算法设置: {config_var.get()['interface']['global']['algorithm']}" + f"默认算法设置: {config_var.get()['interface']['global']['algorithm']}", ), classes="left", ), @@ -81,6 +85,13 @@ class DashboardScreen(Screen): yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 yield Footer() + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + # https://github.com/Textualize/textual/discussions/4268 + # self.refresh(recompose=True) 此函数有问题且官方不管 而且性能低 + def _load_data(self): repo_dirs = Repo.probe_valid_repos_in_dir( Path(config_var.get()["global"]["paths"]["repo"]) @@ -154,7 +165,7 @@ class DashboardScreen(Screen): for r in self.repos: self.repolink[str(id(r))] = r # 用于规避 ctype id 对象还原 list_item = ListItem( - Label(r.prompt), + *[Label(line) for line in r.prompt.splitlines()], Button( f"开始学习", flat=True, diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index 01bf024..e165ccd 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -4,6 +4,8 @@ import base64 from pathlib import Path from typing import List, Optional +from textual import events, on + from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen @@ -18,6 +20,7 @@ from textual.widgets import ( Static, ) +from textual import events, on from heurams.context import config_var from heurams.kernel.repolib import Repo from heurams.services.favorite_service import FavoriteItem, favorite_manager @@ -53,7 +56,9 @@ class FavoriteManagerScreen(Screen): def compose(self) -> ComposeResult: """组合界面组件""" - yield Header(show_clock=True) + + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="favorites-container"): if not self.favorites: yield Label("暂无收藏", classes="empty-label") @@ -63,6 +68,12 @@ class FavoriteManagerScreen(Screen): yield ListView(id="favorites-list") yield Footer() + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def on_mount(self) -> None: """挂载后填充列表""" if self.favorites: diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index c224840..266e054 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -10,6 +10,8 @@ from textual.reactive import reactive from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, Static +from textual import events, on + import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz from heurams.context import config_var, rootdir @@ -17,10 +19,13 @@ from heurams.kernel.reactor import * from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger +import pickle + from .. import shim logger = get_logger(__name__) + class MemScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), @@ -33,7 +38,8 @@ class MemScreen(Screen): ("z", "block_prompt"), ] - CSS_PATH = rootdir / 'interface' / 'css' / 'screens' / 'memoqueue.tcss' + SUB_TITLE = "学习中" + CSS_PATH = rootdir / "interface" / "css" / "screens" / "memoqueue.tcss" if config_var.get()["interface"]["global"]["quick_pass"]: BINDINGS.append(("k", "quick_pass", "正确应答")) @@ -55,8 +61,15 @@ class MemScreen(Screen): self.update_state() self.expander: Expander + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def compose(self) -> ComposeResult: - yield Header(show_clock=True) + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(): yield Label(self._get_progress_text(), id="head_stat") yield ScrollableContainer(id="puzzle_container") @@ -83,7 +96,7 @@ class MemScreen(Screen): return Static(f"无法生成谜题 {e}") def _get_progress_text(self): - s = f"阶段: {self.procession.phase.name}\n" + s = f"阶段: {self.procession.route.name}\n" # 收藏状态 if self.repo is not None: fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" @@ -98,7 +111,7 @@ class MemScreen(Screen): def mount_puzzle(self): """挂载当前谜题组件""" - if self.procession.phase == RouterState.FINISHED: + if self.procession.route == RouterState.FINISHED: self.mount_finished_widget() return container = self.query_one("#puzzle_container") @@ -144,7 +157,7 @@ class MemScreen(Screen): if new_rating == -1: # 安全值 return self.update_state() - if self.procession.phase == RouterState.FINISHED: + if self.procession.route == RouterState.FINISHED: rating = -1 return self.expander.report(new_rating) @@ -231,4 +244,4 @@ class MemScreen(Screen): self.update_display() def action_block_prompt(self): - self.app.notify("功能在记忆界面中不可用, 完成或返回后再试", severity="error") \ No newline at end of file + self.app.notify("功能在记忆界面中不可用, 完成或返回后再试", severity="error") diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index 724ce7e..cd3f73d 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -5,6 +5,8 @@ from textual.containers import Grid, ScrollableContainer from textual.screen import ModalScreen from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static +from textual import events, on + from heurams.context import * from heurams.services.logger import get_logger diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 14aaadd..90b2fd8 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -8,6 +8,8 @@ from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ProgressBar, Static from textual.worker import get_current_worker +from textual import events, on + import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * @@ -80,6 +82,12 @@ class PrecachingScreen(Screen): continue return total + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def _update_cache_stats(self) -> None: """更新缓存统计信息""" total_size = 0 @@ -103,7 +111,9 @@ class PrecachingScreen(Screen): self.cache_stats["cache_rate"] = cache_rate def compose(self) -> ComposeResult: - yield Header(show_clock=True) + + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="precache_container"): yield Label("[b]音频预缓存[/b]", classes="title-label") with Container(): diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index c72776f..dabe1a3 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -17,6 +17,8 @@ from textual.widgets import ( ) from textual.lazy import Reveal, Lazy +from textual import events, on + import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * @@ -34,7 +36,7 @@ class PreparationScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), - ("p", "precache", "预缓存音频"), + ("p", "precache", "缓存"), ("d", "toggle_dark", ""), ("0,1,2,3", "app.push_screen('about')", ""), ] @@ -46,8 +48,16 @@ class PreparationScreen(Screen): self.repo = repo self.load_data() + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def compose(self) -> ComposeResult: - yield Header(show_clock=True) + + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="main_container"): yield Markdown( f"**准备就绪**: `{self.repo.manifest['title']}`\n", id="title" @@ -72,7 +82,7 @@ class PreparationScreen(Screen): classes="btn", ), Button( - "预缓存音频", + "管理缓存", id="precache_button", variant="success", classes="btn", diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index af6f0bb..ac45403 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -23,6 +23,8 @@ from textual.widgets import ( ) from textual.layouts import horizontal +from textual import events, on + import heurams.kernel.particles as pt import heurams.services.timer as timer import heurams.services.version as version @@ -54,9 +56,16 @@ class SettingScreen(Screen): ) -> None: super().__init__(name, id, classes) + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def compose(self) -> ComposeResult: """组合界面组件""" - yield Header(show_clock=True) + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(): yield Label("[b]设置页面[/b]") for i in config_var.get(): @@ -65,7 +74,7 @@ class SettingScreen(Screen): a = self._get_subcfg(f"{i}") if a: yield Collapsible( - *a, title=i + f'\n{config_var.get().get(f"_{i}_desc", "")}' + *a, title=i + f'\n[d]{config_var.get().get(f"_{i}_desc", "")}[/d]' ) yield Label( "退出页面时, 所作的更改会立即保存, 但仍建议重启软件以确保新的配置得到应用", @@ -85,7 +94,7 @@ class SettingScreen(Screen): if a: lst.append( Collapsible( - *a, title=i + f'\n{parent.get(f"_{i}_desc", "")}' + *a, title=i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]' ) ) return lst @@ -101,17 +110,17 @@ class SettingScreen(Screen): if a: lst.append( Collapsible( - *a, title=i + f'\n{parent.get(f"_{i}_desc", "")}' + *a, title=i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]' ) ) elif f"_{i}_candidate" in parent: # 选择框模式 if isinstance(parent[f"_{i}_candidate"], dict): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Select( ( - (f"{j} ({k})", j) + (f"{j}\n[d]{k}[/d]", j) for j, k in parent[f"_{i}_candidate"].items() ), prompt=f'{parent.get(f"{i}", "")}', @@ -122,7 +131,7 @@ class SettingScreen(Screen): elif isinstance(parent[f"_{i}_candidate"], list): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Select( ((j, j) for j in parent[f"_{i}_candidate"]), prompt=f'{parent.get(f"{i}", "")}', @@ -134,7 +143,7 @@ class SettingScreen(Screen): if isinstance(parent[i], float): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Input( value=str(parent[i]), placeholder="要求一个浮点数", @@ -146,7 +155,7 @@ class SettingScreen(Screen): elif isinstance(parent[i], str): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Input( value=parent[i], placeholder="要求一个字符串", @@ -158,7 +167,7 @@ class SettingScreen(Screen): elif isinstance(parent[i], bool): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Switch( value=parent[i], id=domize(f"{parent_epath}.{i}") ), @@ -167,7 +176,7 @@ class SettingScreen(Screen): elif isinstance(parent[i], int): lst.append( Horizontal( - Label(i + f'\n{parent.get(f"_{i}_desc", "")}'), + Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Input( value=str(parent[i]), placeholder="要求一个整数", diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index e38b369..686c786 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -9,6 +9,8 @@ from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ProgressBar, Static from textual.worker import get_current_worker +from textual import events, on + import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * @@ -26,8 +28,16 @@ class SyncScreen(Screen): self.log_messages = [] self.max_log_lines = 50 + @on(events.ScreenResume) + def post_active(self, event): + from heurams.interface import shim + + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") + def compose(self) -> ComposeResult: - yield Header(show_clock=True) + + if config_var.get()['interface']['global']['show_header']: + yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="sync_container"): # 标题和连接状态 yield Static("同步工具", classes="title") diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 336412c..9b2887e 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -2,6 +2,8 @@ import heurams.interface.widgets as pzw import heurams.kernel.puzzles as pz +import platform, os, sys +from heurams.context import config_var puzzle2widget = { pz.RecognitionPuzzle: pzw.Recognition, @@ -9,3 +11,13 @@ puzzle2widget = { pz.MCQPuzzle: pzw.MCQPuzzle, pz.BasePuzzle: pzw.BasePuzzleWidget, } + + +def set_term_title(title): + if not config_var.get()['interface']['global']['change_window_title']: + return + system = platform.system() + if system == "Windows": + os.system(f"title {title}") + else: # Linux, Mac, etc. + os.write(2, f"\033]2;{title}\007".encode("utf-8")) diff --git a/src/heurams/kernel/algorithms/sm15m_calc.py b/src/heurams/kernel/algorithms/sm15m_calc.py index 64ec355..354b989 100644 --- a/src/heurams/kernel/algorithms/sm15m_calc.py +++ b/src/heurams/kernel/algorithms/sm15m_calc.py @@ -1271,7 +1271,7 @@ class SM: self.ofm = OFM(self) def _find_index_to_insert(self, item, r=None): - """Binary search to find insertion index for sorted queue.""" + """Binary search to find insertion index for sorted procession.""" if r is None: r = list(range(len(self.q))) @@ -1290,7 +1290,7 @@ class SM: return self._find_index_to_insert(item, r[i:]) def add_item(self, value): - """Add a new item to the queue.""" + """Add a new item to the procession.""" item = Item(self, value) index = self._find_index_to_insert(item) self.q.insert(index, item) @@ -1330,7 +1330,7 @@ class SM: item.answer(grade, now) def discard(self, item): - """Remove item from queue.""" + """Remove item from procession.""" if item in self.q: self.q.remove(item) diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py index f957761..d720e3f 100644 --- a/src/heurams/kernel/particles/orbital.py +++ b/src/heurams/kernel/particles/orbital.py @@ -7,8 +7,8 @@ orbital, 即轨道, 是定义队列式复习阶段流程的数据结构, 其实就是个字典, 至于为何不用typeddict, 因为懒. orbital_example = { - "schedule": [列表 存储阶段(phases)名称] - "phases":{ + "schedule": [列表 存储阶段(routes)名称] + "routes":{ 阶段名称 = [["谜题(puzzle 现称 Puzzles 评估器)名称", "概率系数 可大于1(整数部分为重复次数) 注意使用字符串包裹(toml 规范)"], ...], ... } diff --git a/src/heurams/kernel/particles/placeholders.py b/src/heurams/kernel/particles/placeholders.py index 2e0b8c4..1eadbe6 100644 --- a/src/heurams/kernel/particles/placeholders.py +++ b/src/heurams/kernel/particles/placeholders.py @@ -6,7 +6,7 @@ from .nucleon import Nucleon orbital_placeholder = { "schedule": ["quick_review", "recognition", "final_review"], - "phases": { + "routes": { "quick_review": [ ["FillBlank", 1.0], ["SelectMeaning", 0.5], diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index aa7dd9f..0d48a48 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -83,16 +83,16 @@ Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ - current_atom: 当前记忆原子的引用 - atoms: 队列中所有原子列表 - cursor: 指针, 是当前原子在 atoms 列表中的索引 -- phase: "阶段属性" +- route: "阶段属性" -> 注意区分 "Router" 和 "Phase", 其中 "Phase" 表示 "Router State". +> 注意区分 "Router" 和 "Route", 其中 "Route" 表示 "Router State". - name\_: 阶段的命名 - state: 当前状态属性 ### 初始化 -接受一个 atoms 列表与 phase_state (RouterState Enum 类型)对象 +接受一个 atoms 列表与 route_state (RouterState Enum 类型)对象 ### 直接输出呈现形式 @@ -100,12 +100,12 @@ Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ 与 Router 不同, Procession 显示队列会对过长的 atom.ident 进行缩略(末尾 `>` 符号) ```text -| Type | Name | State | Progress | Queue | Current Atom | +| Type | Name | State | Progress | Procession | Current Atom | | :--------- | :----- | :----- | :------- | :--------------------- | :---------------------------- | | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ``` -| Type | Name | State | Progress | Queue | Current Atom | +| Type | Name | State | Progress | Procession | Current Atom | | :--------- | :----- | :----- | :------- | :--------------------- | :---------------------------- | | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | @@ -166,7 +166,7 @@ Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ ### 初始化 -接受 atom 对象和 phase 参数 +接受 atom 对象和 route 参数 ### 方法 diff --git a/src/heurams/kernel/reactor/expander.py b/src/heurams/kernel/reactor/expander.py index 67bc52e..04a3992 100644 --- a/src/heurams/kernel/reactor/expander.py +++ b/src/heurams/kernel/reactor/expander.py @@ -16,13 +16,13 @@ logger = get_logger(__name__) class Expander(Machine): """单原子调度展开器""" - def __init__(self, atom: pt.Atom, phase=RouterState.RECOGNITION): - self.phase = phase + def __init__(self, atom: pt.Atom, route=RouterState.RECOGNITION): + self.route = route self.cursor = 0 self.atom = atom self.current_puzzle_inf: dict - # phase 为 RouterState 枚举实例, 需要获取其value - phase_value = phase.value + # route 为 RouterState 枚举实例, 需要获取其value + route_value = route.value states = [ {"name": ExpanderState.EXAMMODE.value}, {"name": ExpanderState.RETRONLY.value}, @@ -35,7 +35,7 @@ class Expander(Machine): "dest": ExpanderState.RETRONLY.value, }, ] - if phase == RouterState.FINISHED: + if route == RouterState.FINISHED: Machine.__init__( self, states=states, @@ -43,7 +43,7 @@ class Expander(Machine): initial=ExpanderState.EXAMMODE.value, ) return - orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore + orbital_schedule = atom.registry["orbital"]["routes"][route_value] # type: ignore orbital_puzzles = atom.registry["nucleon"]["puzzles"] self.puzzles_inf = list() self.min_ratings = [] @@ -122,7 +122,9 @@ class Expander(Machine): "Atom": truncate(self.atom.ident), "State": self.state, "Progress": f"{self.cursor + 1} / {len(self.puzzles_inf)}", - "Queue": list(map(lambda f: truncate(f["alia"]), self.puzzles_inf)), + "Procession": list( + map(lambda f: truncate(f["alia"]), self.puzzles_inf) + ), "Current Puzzle": f"{self.current_puzzle_inf['alia']}@{self.current_puzzle_inf['puzzle'].__name__}", # type: ignore } ] diff --git a/src/heurams/kernel/reactor/procession.py b/src/heurams/kernel/reactor/procession.py index 70c0bff..179a69a 100644 --- a/src/heurams/kernel/reactor/procession.py +++ b/src/heurams/kernel/reactor/procession.py @@ -13,11 +13,11 @@ logger = get_logger(__name__) class Procession(Machine): """队列: 标识单次记忆流程""" - def __init__(self, atoms: list, phase_state: RouterState, name_: str = ""): + def __init__(self, atoms: list, route_state: RouterState, name_: str = ""): logger.debug( - "Procession.__init__: 原子数量=%d, phase=%s, name='%s'", + "Procession.__init__: 原子数量=%d, route=%s, name='%s'", len(atoms), - phase_state.value, + route_state.value, name_, ) self.current_atom: pt.Atom | None @@ -25,7 +25,7 @@ class Procession(Machine): self.current_atom = atoms[0] if atoms else None self.cursor = 0 self.name_ = name_ - self.phase = phase_state + self.route = route_state states = [ {"name": ProcessionState.ACTIVE.value, "on_enter": "on_active"}, @@ -114,7 +114,7 @@ class Procession(Machine): return empty def get_expander(self): - return Expander(atom=self.current_atom, phase=self.phase) # type: ignore + return Expander(atom=self.current_atom, route=self.route) # type: ignore def __repr__(self, style="pipe", ends="\n"): from heurams.services.textproc import truncate @@ -125,7 +125,7 @@ class Procession(Machine): "Name": self.name_, "State": self.state, "Progress": f"{self.cursor + 1} / {len(self.atoms)}", - "Queue": list(map(lambda f: truncate(f.ident), self.atoms)), + "Procession": list(map(lambda f: truncate(f.ident), self.atoms)), "Current Atom": self.current_atom.ident, # type: ignore } ] diff --git a/src/heurams/kernel/reactor/router.py b/src/heurams/kernel/reactor/router.py index 46ac1dd..66730a4 100644 --- a/src/heurams/kernel/reactor/router.py +++ b/src/heurams/kernel/reactor/router.py @@ -11,10 +11,10 @@ logger = get_logger(__name__) class Router(Machine): - """全局调度阶段管理器""" + """全局调度阶段路由器""" def __init__(self, atoms: list[pt.Atom]) -> None: - logger.debug("Router.__init__: 原子数量=%d", len(atoms)) + logger.debug(f"Router.__init__: 原子数量={len(atoms)}") self.atoms = atoms new_atoms = list() @@ -26,9 +26,10 @@ class Router(Machine): else: old_atoms.append(i) - logger.debug("新原子数量=%d, 旧原子数量=%d", len(new_atoms), len(old_atoms)) + logger.debug(f"新原子数量={len(new_atoms)}, 旧原子数量={len(old_atoms)}") self.processions = list() + """路由中的所有队列""" # TODO: 改进为基于配置文件的可选复习阶段 if len(old_atoms): self.processions.append( @@ -116,15 +117,15 @@ class Router(Machine): for i in self.processions: i: Procession if i.state != ProcessionState.FINISHED.value: - # if i.phase == RouterState.UNSURE: 此判断是不必要的 因为没有这种 Procession - if i.phase == RouterState.QUICK_REVIEW: + # if i.route == RouterState.UNSURE: 此判断是不必要的 因为没有这种 Procession + if i.route == RouterState.QUICK_REVIEW: self.to_quick_review() - elif i.phase == RouterState.RECOGNITION: + elif i.route == RouterState.RECOGNITION: self.to_recognition() - elif i.phase == RouterState.FINAL_REVIEW: + elif i.route == RouterState.FINAL_REVIEW: self.to_final_review() - logger.debug("找到未完成的 Procession: phase=%s", i.phase) + logger.debug("找到未完成的 Procession: route=%s", i.route) return i # 所有Procession都已完成 diff --git a/src/heurams/services/session.py b/src/heurams/services/session.py deleted file mode 100644 index 35903e7..0000000 --- a/src/heurams/services/session.py +++ /dev/null @@ -1 +0,0 @@ -"""会话记录模块""" \ No newline at end of file diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index 8eb29bf..99c4d9b 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -32,4 +32,4 @@ def get_timestamp() -> float: result = time.time() logger.debug("获取当前时间戳: %f", result) - return result \ No newline at end of file + return result diff --git a/src/heurams/unifront/session.py b/src/heurams/unifront/session.py new file mode 100644 index 0000000..f5aab12 --- /dev/null +++ b/src/heurams/unifront/session.py @@ -0,0 +1,3 @@ +"""会话模块""" +class Session: + pass \ No newline at end of file From b9d88383f96ae078e9fdc86eab30a5ac57f2e718 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 22 Apr 2026 06:44:59 +0800 Subject: [PATCH 47/79] =?UTF-8?q?perf:=20=E7=94=A8=20autoflake=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 没想到居然能意外地大幅提升启动速度 --- README.md | 33 +- pyproject.toml | 27 +- src/heurams/interface/__init__.py | 37 +- src/heurams/interface/screens/about.py | 2 +- src/heurams/interface/screens/dashboard.py | 34 +- src/heurams/interface/screens/memoqueue.py | 8 +- src/heurams/interface/screens/navigator.py | 7 +- src/heurams/interface/screens/precache.py | 4 +- src/heurams/interface/screens/preparation.py | 8 +- src/heurams/interface/screens/setting.py | 16 +- src/heurams/interface/screens/synctool.py | 4 +- src/heurams/interface/shim.py | 3 +- .../interface/widgets/base_puzzle_widget.py | 1 - src/heurams/interface/widgets/cloze_puzzle.py | 3 +- src/heurams/interface/widgets/mcq_puzzle.py | 2 +- src/heurams/interface/widgets/recognition.py | 2 - src/heurams/kernel/algorithms/base.py | 1 - src/heurams/kernel/algorithms/sm15m.py | 4 - src/heurams/kernel/algorithms/sm15m_calc.py | 1 - src/heurams/kernel/auxiliary/lict.py | 2 +- src/heurams/kernel/particles/electron.py | 2 - src/heurams/kernel/particles/nucleon.py | 1 - src/heurams/kernel/particles/placeholders.py | 1 - src/heurams/kernel/puzzles/guess.py | 1 - src/heurams/kernel/puzzles/recognition.py | 2 - src/heurams/kernel/reactor/router.py | 1 - src/heurams/kernel/reactor/states.py | 2 +- src/heurams/kernel/repolib/repo.py | 2 - .../providers/audio/playsound_audio.py | 1 - src/heurams/providers/llm/base.py | 2 +- src/heurams/providers/llm/openai.py | 3 +- src/heurams/services/config.py | 2 - src/heurams/services/exceptions.py | 1 - src/heurams/services/favorite_service.py | 5 +- src/heurams/services/logger.py | 1 - src/heurams/tools/csv2payload.py | 1 - src/heurams/tools/zmqclient.py | 1 - uv.lock | 659 +++--------------- 38 files changed, 184 insertions(+), 703 deletions(-) diff --git a/README.md b/README.md index 58d09bd..af39a22 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,18 @@ -# 潜进 (HeurAMS) - 启发式辅助记忆程序 +# 潜进 (HeurAMS) - 启发式辅助记忆调度器 ## 概述 -"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是为习题册, 古诗词, 及其他问答/记忆/理解型知识设计的开放源代码多用途辅助记忆软件, 提供动态规划的优化记忆方案 +"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划, 也是一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. -## 关于此仓库 +## 项目结构 -本仓库为 "潜进" 软件组项目的核心部分, 包含核心功能模块以及基于 Textual 框架的基础用户界面(heurams.interface)实现\ -除了通过用户界面进行学习外, 你也可以在 Python 中导入 `heurams` 库, 使用其中实现的状态机, 算法迭代器和数据模型构建辅助记忆功能 +这个仓库是 "潜进" 的核心程序库在 python 语言下的实现 +包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) +除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库, 使用框架构建其他辅助记忆功能前端或其他应用程序 ## 特性 -### 间隔迭代算法 +### 间隔重复调度器 > 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的, 但不会导致遗忘的间隔**. @@ -33,7 +34,7 @@ - 支持触屏/鼠标/键盘多操作模式 - 简洁直观的复习流程设计 -## 安装 +## 快速开始 ### 从源码安装 @@ -56,20 +57,6 @@ pip install -e . ``` -### 从包管理器安装 - -暂时还没有:( - -## 启动应用 - -```bash -# 在任一目录(建议是空目录或者包根目录, 将被用作存放数据)下运行 -python -m heurams.interface -``` - -配置文件位于 `./data/config/config.toml`(相对于工作目录).\ -如果不存在, 会使用内置的默认配置. - ## 项目结构 ### 架构图(待更新 0.5.0) @@ -133,9 +120,9 @@ graph TB Algorithms --> Files ``` -## 贡献 +## 参与项目 -欢迎贡献! 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. +欢迎参与到项目协作中! 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. ## 许可证 diff --git a/pyproject.toml b/pyproject.toml index 18cc5b7..68abe9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,17 +1,24 @@ [project] name = "heurams" version = "0.5.0" +authors = [{ name = "pluvium27", email = "pluvium27@outlook.com" }] description = "Heuristic Auxiliary Memory Scheduler" readme = "README.md" -authors = [{ name = "pluvium27", email = "pluvium27@outlook.com" }] -requires-python = "==3.14.*" +requires-python = ">=3.10" +classifiers = [ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", +] +license = "AGPL-3.0-or-later" +license-files = ["LICENSE"] + dependencies = [ - "edge-tts>=7.2.8", - "jieba>=0.42.1", - "openai>=2.32.0", - "playsound==1.2.2", + #"edge-tts>=7.2.8", + #"jieba>=0.42.1", + #"openai>=2.32.0", + #"playsound==1.2.2", + #"pygobject>=3.56.2", # playsound 依赖它 "psutil>=7.2.2", - "pygobject>=3.56.2", "tabulate>=0.10.0", "textual>=8.2.3", "toml>=0.10.2", @@ -19,10 +26,14 @@ dependencies = [ "zmq>=0.0.0", ] +[project.urls] +Homepage = "https://ams.pluv.top" +Issues = "https://github.com/heurams/heurams/issues" + [project.scripts] heurams = "heurams.__main__:main" tui = "heurams.interface.__main__:main" [build-system] -requires = ["uv_build>=0.9.22,<0.10.0"] +requires = ["uv_build>=0.7.19"] build-backend = "uv_build" diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index cbd4ad5..b0b5a62 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -2,9 +2,9 @@ from time import sleep, perf_counter print("欢迎使用基本用户界面!") print("加载配置与上下文... ", end="", flush=True) -_start1 = perf_counter() -_start = perf_counter() -from heurams.context import * +_start_all = perf_counter() +_start = _start_all +from heurams.context import rootdir, workdir, config_var _end = perf_counter() print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") @@ -32,14 +32,13 @@ print(f"已完成! (耗时: {round(1000 * (_end - _start))}ms)") print(f"组件目录: {rootdir}") print(f"工作目录: {workdir}") -_end1 = perf_counter() -print(f"前置工作共计耗时: {round(1000 * (_end1 - _start1))}ms") +_end_all = perf_counter() +print(f"前置工作共计耗时: {round(1000 * (_end_all - _start_all))}ms") class HeurAMSApp(App): TITLE = "潜进" - CSS_PATH = "css/main.tcss" - css_dir = pathlib.Path("css").resolve() + CSS_PATH = rootdir / "interface" / "css" / "main.tcss" SUB_TITLE = "启发式辅助记忆调度器" BINDINGS = [ ("q", "go_back", "退出"), @@ -63,24 +62,26 @@ class HeurAMSApp(App): def on_mount(self) -> None: self.push_screen("dashboard") - def on_button_pressed(self, event: Button.Pressed) -> None: - pass - # self.exit(event.button.id) - def action_go_back(self) -> None: - quit() + self.exit() # go_back 在最顶层是退出, Screen 会再次定义为返回, 键位都是 q, 免得不一样 - def action_do_nothing(self): - self.refresh() + def action_do_nothing(self) -> None: # 用来给没使用/禁用的快捷键占位, 因为 Binding 删除不了 + pass # 移除烦人的 "rich traceback" # Textual 官方不会管这破事, 写 Rich 写入脑了导致的 # 不知道哪来的自信改标准库的 traceback # https://github.com/Textualize/textual/discussions/6255 + # NOTE: 进行 textual 版本升级时, 确保查看过上游代码, 尤其是 App 的 _exception + # 如果行为变了就把下面的删了 (虽然有 fallback) def _fatal_error(self): - self._close_messages_no_wait() - raise self._exception + if hasattr(self, "_exception"): + self._close_messages_no_wait() + raise self._exception + super()._fatal_error() # fallback def panic(self, *args): - self._close_messages_no_wait() - raise self._exception + if hasattr("_exception"): + self._close_messages_no_wait() + raise self._exception + super().panic(*args) # ditto diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index de68981..b27e359 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -3,7 +3,7 @@ from textual.app import ComposeResult from textual.containers import ScrollableContainer from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, Markdown, Static +from textual.widgets import Button, Footer, Header, Label, Markdown from textual import events, on diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index df13491..d6cb560 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -1,15 +1,12 @@ """仪表盘界面""" from functools import reduce -import pathlib from pathlib import Path -import os from textual.app import ComposeResult -from textual.containers import ScrollableContainer, Container, Horizontal, Vertical +from textual.containers import ScrollableContainer, Horizontal, Vertical from textual.screen import Screen from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static -from textual.layouts import horizontal from textual import events, on from textual.reactive import reactive @@ -19,10 +16,8 @@ import heurams.services.version as version from heurams.context import * from heurams.kernel.particles import * from heurams.kernel.repolib import * -from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger -from .about import AboutScreen from .navigator import NavigatorScreen from .preparation import PreparationScreen @@ -40,7 +35,7 @@ class DashboardScreen(Screen): CSS_PATH = rootdir / "interface" / "css" / "screens" / "dashboard.tcss" repolink = reactive({}) - + def __init__( self, name: str | None = None, @@ -59,7 +54,7 @@ class DashboardScreen(Screen): Vertical( Label(f"当前日时间戳: {timer.get_daystamp()}"), Label( - f"应用时区修正: UTC+{str(config_var.get()['services']['timer']['timezone_offset'] / 3600).rstrip('.0')}" + f"应用时区修正: UTC+{str(config_var.get()['services']['timer']['timezone_offset'] / 3600).removesuffix('.0')}" ), Label( f"默认算法设置: {config_var.get()['interface']['global']['algorithm']}", @@ -112,21 +107,21 @@ class DashboardScreen(Screen): repo.progress = { "total": repo.data_length, "touched": 0, - "have_activated_ever": 0, + "have_activated_ever": False, } repo.preview = { "review": 0, - "new": repo.config["scheduled_num"], + "new": repo.config["scheduled_num"], # TODO: 考虑之后在这里加点运算避免 SM-2 积压, 但现在需要的是直观! } initial_time = float("inf") - for i in range(repo.data_length): + for i in range(repo.data_length): # TODO: 增加异步性能优化, 但是学习数据属实规模小... e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict[i], algo_name=repo.config["algorithm"], ) - n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) + # n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) if e.is_activated(): - repo.progress["have_activated_ever"] = 1 + repo.progress["have_activated_ever"] = True # 被激活过~ repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) if timer.get_daystamp() >= e.nextdate(): @@ -145,9 +140,9 @@ class DashboardScreen(Screen): repodirs = sorted( self.repos, key=lambda r: r.nearest_review_time, - reverse=True, + reverse=True, # 紧张的先复习 ) - repotitles = map(lambda f: self.repostat[f.name]["title"], repodirs) + # 填充列表 if not repodirs: repo_list_widget.append( @@ -163,18 +158,19 @@ class DashboardScreen(Screen): return for r in self.repos: - self.repolink[str(id(r))] = r # 用于规避 ctype id 对象还原 + self.repolink[str(r.manifest['package'])] = r # 用于规避 ctype id 对象还原 + # NOTE: 上一行不要使用 id(), id 可能被重用! list_item = ListItem( *[Label(line) for line in r.prompt.splitlines()], Button( f"开始学习", flat=True, variant="primary", - id=f"slaunch_repo_{id(r)}", + id=f"slaunch_repo_{r.manifest['package']}", classes="repo-list-item-shortcut", ), classes="repo-list-item", - id=f"launch_repo_{id(r)}", + id=f"launch_repo_{r.manifest['package']}", ) repo_list_widget.append(list_item) @@ -187,7 +183,7 @@ class DashboardScreen(Screen): return # 还原对象 - selected_repo = self.repolink[event.item.id.lstrip("launch_repo_")] + selected_repo = self.repolink[event.item.id.removeprefix("launch_repo_")] # 跳转到准备屏幕 self.app.push_screen(PreparationScreen(selected_repo)) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 266e054..b99c43b 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,25 +1,21 @@ """队列式记忆工作界面""" -from enum import Enum, auto from pathlib import Path -from typing import Callable from textual.app import ComposeResult -from textual.containers import Center, ScrollableContainer, Container +from textual.containers import ScrollableContainer from textual.reactive import reactive from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, Static +from textual.widgets import Footer, Header, Label, Static from textual import events, on import heurams.kernel.particles as pt -import heurams.kernel.puzzles as pz from heurams.context import config_var, rootdir from heurams.kernel.reactor import * from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger -import pickle from .. import shim diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index cd3f73d..a86d31d 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -1,13 +1,10 @@ -import webbrowser from textual.app import ComposeResult -from textual.containers import Grid, ScrollableContainer +from textual.containers import Grid from textual.screen import ModalScreen -from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static +from textual.widgets import Button, Label, ListItem, ListView, Static -from textual import events, on -from heurams.context import * from heurams.services.logger import get_logger from .favmgr import FavoriteManagerScreen diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 90b2fd8..57f0a8e 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -200,7 +200,6 @@ class PrecachingScreen(Screen): def precache_by_text(self, text: str): """预缓存单段文本的音频""" - from heurams.context import config_var, rootdir, workdir cache_dir.mkdir(parents=True, exist_ok=True) cache_file = cache_dir / f"{hasher.get_md5(text)}.wav" @@ -259,7 +258,7 @@ class PrecachingScreen(Screen): def precache_all_files(self): """预缓存所有文件""" - from heurams.context import config_var, rootdir, workdir + from heurams.context import config_var from heurams.kernel.repolib import Repo repo_path = pathlib.Path(config_var.get()["global"]["paths"]["data"]) / "repo" @@ -315,7 +314,6 @@ class PrecachingScreen(Screen): try: import shutil - from heurams.context import config_var, rootdir, workdir shutil.rmtree(cache_dir, ignore_errors=True) self.update_status("已清空", "音频缓存已清空", 0) diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index dabe1a3..27d3ffc 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -1,10 +1,8 @@ """记忆准备界面""" from textual.app import ComposeResult -from textual.containers import ScrollableContainer, Container, Horizontal -from textual.reactive import reactive +from textual.containers import ScrollableContainer, Horizontal from textual.screen import Screen -from textual.widget import Widget from textual.widgets import ( Button, Footer, @@ -12,15 +10,13 @@ from textual.widgets import ( Label, Markdown, Static, - Rule, Sparkline, ) -from textual.lazy import Reveal, Lazy +from textual.lazy import Reveal from textual import events, on import heurams.kernel.particles as pt -import heurams.services.hasher as hasher from heurams.context import * from heurams.context import config_var from heurams.kernel.repolib import * diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index ac45403..a0358f6 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -1,37 +1,24 @@ """设置页面""" -from functools import reduce -import pathlib -from pathlib import Path -import os from textual.app import ComposeResult -from textual.containers import ScrollableContainer, Container, Horizontal, Vertical +from textual.containers import ScrollableContainer, Horizontal from textual.screen import Screen from textual.widgets import ( - Button, Footer, Header, Label, - ListItem, - ListView, - Static, Collapsible, Input, Switch, Select, ) -from textual.layouts import horizontal from textual import events, on -import heurams.kernel.particles as pt -import heurams.services.timer as timer -import heurams.services.version as version from heurams.context import * from heurams.kernel.particles import * from heurams.kernel.repolib import * -from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger from heurams.services.textproc import domize, undomize from heurams.services.epath import epath @@ -194,7 +181,6 @@ class SettingScreen(Screen): def on_mount(self) -> None: """挂载组件时初始化""" - pass def action_go_back(self) -> None: """返回上一屏幕""" diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index 686c786..1cb364d 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -6,13 +6,11 @@ import time from textual.app import ComposeResult from textual.containers import Horizontal, ScrollableContainer from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, ProgressBar, Static +from textual.widgets import Button, Footer, Header, ProgressBar, Static from textual.worker import get_current_worker from textual import events, on -import heurams.kernel.particles as pt -import heurams.services.hasher as hasher from heurams.context import * diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 9b2887e..2bb61f7 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -2,7 +2,8 @@ import heurams.interface.widgets as pzw import heurams.kernel.puzzles as pz -import platform, os, sys +import platform +import os from heurams.context import config_var puzzle2widget = { diff --git a/src/heurams/interface/widgets/base_puzzle_widget.py b/src/heurams/interface/widgets/base_puzzle_widget.py index 46fd537..7318165 100644 --- a/src/heurams/interface/widgets/base_puzzle_widget.py +++ b/src/heurams/interface/widgets/base_puzzle_widget.py @@ -1,6 +1,5 @@ from typing import Iterable -from textual.app import ComposeResult from textual.widget import Widget import heurams.kernel.particles as pt diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 19a0255..2251a82 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -2,8 +2,7 @@ import copy import random from typing import TypedDict -from textual.containers import Container, ScrollableContainer -from textual.message import Message +from textual.containers import ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label, Markdown diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 0b68baf..b5a557c 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -1,7 +1,7 @@ # 单项选择题 from typing import TypedDict -from textual.containers import Container, ScrollableContainer +from textual.containers import ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 9504e5d..c7ab7ad 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -2,8 +2,6 @@ import re from typing import Dict, List, TypedDict from textual.containers import Center -from textual.message import Message -from textual.reactive import reactive from textual.widget import Widget from textual.widgets import Button, Label, Markdown, Static diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index b71d6c9..85d184e 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -40,7 +40,6 @@ class BaseAlgorithm: feedback, is_new_activation, ) - pass @classmethod def is_due(cls, algodata) -> int: diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 6f84996..1765c13 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -17,11 +17,7 @@ from heurams.context import config_var from heurams.kernel.algorithms.sm15m_calc import ( MAX_AF, MIN_AF, - NOTCH_AF, - RANGE_AF, - RANGE_REPETITION, SM, - THRESHOLD_RECALL, Item, ) diff --git a/src/heurams/kernel/algorithms/sm15m_calc.py b/src/heurams/kernel/algorithms/sm15m_calc.py index 354b989..d70021b 100644 --- a/src/heurams/kernel/algorithms/sm15m_calc.py +++ b/src/heurams/kernel/algorithms/sm15m_calc.py @@ -39,7 +39,6 @@ import datetime import json import math import sys -from typing import Any, Callable, Dict, List, Optional, Tuple # ============================================================================ # Global Constants diff --git a/src/heurams/kernel/auxiliary/lict.py b/src/heurams/kernel/auxiliary/lict.py index db710e0..8cb58ba 100644 --- a/src/heurams/kernel/auxiliary/lict.py +++ b/src/heurams/kernel/auxiliary/lict.py @@ -1,5 +1,5 @@ from collections.abc import MutableSequence -from typing import Any, Iterator, Optional +from typing import Any, Optional class Lict(MutableSequence): diff --git a/src/heurams/kernel/particles/electron.py b/src/heurams/kernel/particles/electron.py index 576810f..82c19bc 100644 --- a/src/heurams/kernel/particles/electron.py +++ b/src/heurams/kernel/particles/electron.py @@ -1,11 +1,9 @@ from copy import deepcopy -from typing import TypedDict import heurams.kernel.algorithms as algolib import heurams.services.timer as timer from heurams.kernel.algorithms import algorithms from heurams.services.logger import get_logger -from heurams.context import config_var logger = get_logger(__name__) diff --git a/src/heurams/kernel/particles/nucleon.py b/src/heurams/kernel/particles/nucleon.py index 8435644..254e5a1 100644 --- a/src/heurams/kernel/particles/nucleon.py +++ b/src/heurams/kernel/particles/nucleon.py @@ -1,5 +1,4 @@ from copy import deepcopy -from logging import config from heurams.context import config_var from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/particles/placeholders.py b/src/heurams/kernel/particles/placeholders.py index 1eadbe6..3c21bc5 100644 --- a/src/heurams/kernel/particles/placeholders.py +++ b/src/heurams/kernel/particles/placeholders.py @@ -1,4 +1,3 @@ -from heurams.kernel.particles import orbital from .atom import Atom from .electron import Electron diff --git a/src/heurams/kernel/puzzles/guess.py b/src/heurams/kernel/puzzles/guess.py index 9398b4e..db88101 100644 --- a/src/heurams/kernel/puzzles/guess.py +++ b/src/heurams/kernel/puzzles/guess.py @@ -1,4 +1,3 @@ -import random from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/puzzles/recognition.py b/src/heurams/kernel/puzzles/recognition.py index 964db3f..60133dd 100644 --- a/src/heurams/kernel/puzzles/recognition.py +++ b/src/heurams/kernel/puzzles/recognition.py @@ -1,5 +1,4 @@ # mcq.py -import random from heurams.services.logger import get_logger @@ -17,4 +16,3 @@ class RecognitionPuzzle(BasePuzzle): def refresh(self): logger.debug("RecognitionPuzzle.refresh(空实现)") - pass diff --git a/src/heurams/kernel/reactor/router.py b/src/heurams/kernel/reactor/router.py index 66730a4..21776ef 100644 --- a/src/heurams/kernel/reactor/router.py +++ b/src/heurams/kernel/reactor/router.py @@ -136,7 +136,6 @@ class Router(Machine): def __repr__(self, style="pipe", ends="\n"): from tabulate import tabulate as tabu - from heurams.services.textproc import truncate lst = [ { diff --git a/src/heurams/kernel/reactor/states.py b/src/heurams/kernel/reactor/states.py index 5bb2198..ecf1522 100644 --- a/src/heurams/kernel/reactor/states.py +++ b/src/heurams/kernel/reactor/states.py @@ -1,4 +1,4 @@ -from enum import Enum, auto +from enum import Enum from heurams.services.logger import get_logger diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index 61c1708..ecc1ac0 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -1,11 +1,9 @@ import json -from functools import reduce from pathlib import Path from typing import TypedDict import toml -import heurams.kernel.particles as pt from heurams.context import config_var from heurams.kernel.auxiliary.lict import Lict diff --git a/src/heurams/providers/audio/playsound_audio.py b/src/heurams/providers/audio/playsound_audio.py index 0d7a484..db0a360 100644 --- a/src/heurams/providers/audio/playsound_audio.py +++ b/src/heurams/providers/audio/playsound_audio.py @@ -3,7 +3,6 @@ 注意: 在未配置 pulseaudio 的 termux 不可用 """ -import os import pathlib import playsound diff --git a/src/heurams/providers/llm/base.py b/src/heurams/providers/llm/base.py index 6426588..af39413 100644 --- a/src/heurams/providers/llm/base.py +++ b/src/heurams/providers/llm/base.py @@ -1,7 +1,7 @@ """LLM 提供者基类""" import asyncio -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List from heurams.services.logger import get_logger diff --git a/src/heurams/providers/llm/openai.py b/src/heurams/providers/llm/openai.py index 252f45d..12609af 100644 --- a/src/heurams/providers/llm/openai.py +++ b/src/heurams/providers/llm/openai.py @@ -1,7 +1,6 @@ """OpenAI 兼容 LLM 提供者""" -import asyncio -from typing import Any, AsyncGenerator, Dict, List, Optional +from typing import Any, AsyncGenerator, Dict, List from heurams.services.logger import get_logger diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index d52355a..b3718b5 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -1,9 +1,7 @@ import pathlib -import typing import toml from collections import UserDict -import atexit from heurams.services.logger import get_logger from heurams.services.exceptions import WTFException diff --git a/src/heurams/services/exceptions.py b/src/heurams/services/exceptions.py index 741b86a..f480c0f 100644 --- a/src/heurams/services/exceptions.py +++ b/src/heurams/services/exceptions.py @@ -1,4 +1,3 @@ -from heurams.services.logger import get_logger class WTFException(Exception): diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py index b21e804..f8c888e 100644 --- a/src/heurams/services/favorite_service.py +++ b/src/heurams/services/favorite_service.py @@ -1,10 +1,9 @@ # 收藏服务 import json -import shutil import time -from dataclasses import asdict, dataclass +from dataclasses import dataclass from pathlib import Path -from typing import Dict, List, Optional, Tuple +from typing import List from heurams.context import config_var from heurams.services.logger import get_logger diff --git a/src/heurams/services/logger.py b/src/heurams/services/logger.py index d1662d5..385882b 100644 --- a/src/heurams/services/logger.py +++ b/src/heurams/services/logger.py @@ -6,7 +6,6 @@ HeurAMS 日志服务模块 import logging import logging.handlers import pathlib -import sys from typing import Optional, Union # 默认配置 diff --git a/src/heurams/tools/csv2payload.py b/src/heurams/tools/csv2payload.py index 509b69c..359d60a 100755 --- a/src/heurams/tools/csv2payload.py +++ b/src/heurams/tools/csv2payload.py @@ -68,7 +68,6 @@ meaning = "狗发出的声音" import csv import sys -import os import random import argparse from pathlib import Path diff --git a/src/heurams/tools/zmqclient.py b/src/heurams/tools/zmqclient.py index 8adcb7d..5363475 100644 --- a/src/heurams/tools/zmqclient.py +++ b/src/heurams/tools/zmqclient.py @@ -1,6 +1,5 @@ import zmq import pickle -import readline import sys diff --git a/uv.lock b/uv.lock index 961fbd6..c219516 100644 --- a/uv.lock +++ b/uv.lock @@ -1,117 +1,6 @@ version = 1 revision = 3 -requires-python = "==3.14.*" - -[[package]] -name = "aiohappyeyeballs" -version = "2.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, -] - -[[package]] -name = "aiohttp" -version = "3.13.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" }, - { url = "https://files.pythonhosted.org/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" }, - { url = "https://files.pythonhosted.org/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" }, - { url = "https://files.pythonhosted.org/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" }, - { url = "https://files.pythonhosted.org/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" }, - { url = "https://files.pythonhosted.org/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" }, - { url = "https://files.pythonhosted.org/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" }, - { url = "https://files.pythonhosted.org/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" }, - { url = "https://files.pythonhosted.org/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" }, - { url = "https://files.pythonhosted.org/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" }, - { url = "https://files.pythonhosted.org/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" }, - { url = "https://files.pythonhosted.org/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" }, - { url = "https://files.pythonhosted.org/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" }, - { url = "https://files.pythonhosted.org/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" }, - { url = "https://files.pythonhosted.org/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" }, - { url = "https://files.pythonhosted.org/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" }, - { url = "https://files.pythonhosted.org/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" }, - { url = "https://files.pythonhosted.org/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" }, - { url = "https://files.pythonhosted.org/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" }, - { url = "https://files.pythonhosted.org/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" }, - { url = "https://files.pythonhosted.org/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" }, - { url = "https://files.pythonhosted.org/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" }, - { url = "https://files.pythonhosted.org/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" }, - { url = "https://files.pythonhosted.org/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" }, - { url = "https://files.pythonhosted.org/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" }, - { url = "https://files.pythonhosted.org/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" }, - { url = "https://files.pythonhosted.org/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" }, - { url = "https://files.pythonhosted.org/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" }, -] - -[[package]] -name = "aiosignal" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, -] - -[[package]] -name = "anyio" -version = "4.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, -] - -[[package]] -name = "attrs" -version = "26.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, -] - -[[package]] -name = "certifi" -version = "2026.2.25" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, -] +requires-python = ">=3.10" [[package]] name = "cffi" @@ -122,6 +11,55 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, @@ -146,100 +84,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, -] - -[[package]] -name = "edge-tts" -version = "7.2.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "certifi" }, - { name = "tabulate" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3f/60/afbf548b43c78355e03926c6b1fff7500303a2da4d84db9e1324119e21ae/edge_tts-7.2.8.tar.gz", hash = "sha256:fcf185a0d527a0d2d003f9d5841facc1d5e0e7b3b88d5df9c32990402c6b8cd0", size = 27875, upload-time = "2026-03-22T19:57:50.962Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/2b/a8cb687b92a2690d2ad171f0c2fd1c8f18690363cca7618bab2bbe4cdf2b/edge_tts-7.2.8-py3-none-any.whl", hash = "sha256:361fe48ce7ef613adbe30f664e3765dd71029c6cb57427279eff8ad6df2eb211", size = 31026, upload-time = "2026-03-22T19:57:49.672Z" }, -] - -[[package]] -name = "frozenlist" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, - { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, - { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, - { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, - { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, - { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, - { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, - { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, - { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, - { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, - { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, - { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, - { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, - { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, - { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, - { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, - { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, - { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, - { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, - { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, -] - [[package]] name = "heurams" version = "0.5.0" source = { editable = "." } dependencies = [ - { name = "edge-tts" }, - { name = "jieba" }, - { name = "openai" }, - { name = "playsound" }, { name = "psutil" }, - { name = "pygobject" }, { name = "tabulate" }, { name = "textual" }, { name = "toml" }, @@ -249,12 +99,7 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "edge-tts", specifier = ">=7.2.8" }, - { name = "jieba", specifier = ">=0.42.1" }, - { name = "openai", specifier = ">=2.32.0" }, - { name = "playsound", specifier = "==1.2.2" }, { name = "psutil", specifier = ">=7.2.2" }, - { name = "pygobject", specifier = ">=3.56.2" }, { name = "tabulate", specifier = ">=0.10.0" }, { name = "textual", specifier = ">=8.2.3" }, { name = "toml", specifier = ">=0.10.2" }, @@ -262,84 +107,6 @@ requires-dist = [ { name = "zmq", specifier = ">=0.0.0" }, ] -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, -] - -[[package]] -name = "jieba" -version = "0.42.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c6/cb/18eeb235f833b726522d7ebed54f2278ce28ba9438e3135ab0278d9792a2/jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2", size = 19214172, upload-time = "2020-01-20T14:27:23.5Z" } - -[[package]] -name = "jiter" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, - { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, - { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, - { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, - { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, - { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, - { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, - { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, - { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, - { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, - { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, - { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, - { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, -] - [[package]] name = "linkify-it-py" version = "2.1.0" @@ -390,70 +157,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "multidict" -version = "6.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, - { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, - { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, - { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, - { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, - { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, - { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, - { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, - { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, - { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, - { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, - { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, - { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, - { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, - { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, - { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, - { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, - { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, - { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, - { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, - { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, -] - -[[package]] -name = "openai" -version = "2.32.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, -] - [[package]] name = "platformdirs" version = "4.9.6" @@ -463,59 +166,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] -[[package]] -name = "playsound" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/16/10d897b0a83fb4b05b03a63d7a2667ab75f857f67f7062fd447dd3f49bf7/playsound-1.2.2-py2.py3-none-any.whl", hash = "sha256:1e83750a5325cbccee03d6e751ba3e78c037ac95b95a3ba1f38d0c5aca9e1a34", size = 5960, upload-time = "2017-06-29T14:08:29.207Z" }, -] - -[[package]] -name = "propcache" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, - { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, - { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, - { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, - { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, - { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, - { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, - { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, - { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, - { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, - { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, - { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, - { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, - { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, -] - [[package]] name = "psutil" version = "7.2.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, @@ -532,19 +194,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] -[[package]] -name = "pycairo" -version = "1.29.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, - { url = "https://files.pythonhosted.org/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, - { url = "https://files.pythonhosted.org/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, - { url = "https://files.pythonhosted.org/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, -] - [[package]] name = "pycparser" version = "3.0" @@ -554,62 +203,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] -[[package]] -name = "pydantic" -version = "2.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/e5/06d23afac9973109d1e3c8ad38e1547a12e860610e327c05ee686827dc37/pydantic-2.13.2.tar.gz", hash = "sha256:b418196607e61081c3226dcd4f0672f2a194828abb9109e9cfb84026564df2d1", size = 843836, upload-time = "2026-04-17T09:31:59.636Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/ca/b45c378e6e8d0b90577288b533e04e95b7afd61bb1d51b6c263176435489/pydantic-2.13.2-py3-none-any.whl", hash = "sha256:a525087f4c03d7e7456a3de89b64cd693d2229933bb1068b9af6befd5563694e", size = 471947, upload-time = "2026-04-17T09:31:57.541Z" }, -] - -[[package]] -name = "pydantic-core" -version = "2.46.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/43/bb/4742f05b739b2478459bb16fa8470549518c802e06ddcf3f106c5081315e/pydantic_core-2.46.2.tar.gz", hash = "sha256:37bb079f9ee3f1a519392b73fda2a96379b31f2013c6b467fe693e7f2987f596", size = 471269, upload-time = "2026-04-17T09:10:07.017Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/96/a50ccb6b539ae780f73cea74905468777680e30c6c3bdf714b9d4c116ea0/pydantic_core-2.46.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:4f59b45f3ef8650c0c736a57f59031d47ed9df4c0a64e83796849d7d14863a2d", size = 2097111, upload-time = "2026-04-17T09:10:49.617Z" }, - { url = "https://files.pythonhosted.org/packages/34/5f/fdead7b3afa822ab6e5a18ee0ecffd54937de1877c01ed13a342e0fb3f07/pydantic_core-2.46.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3a075a29ebef752784a91532a1a85be6b234ccffec0a9d7978a92696387c3da6", size = 1951904, upload-time = "2026-04-17T09:12:32.062Z" }, - { url = "https://files.pythonhosted.org/packages/95/e0/1c5d547e550cdab1bec737492aa08865337af6fe7fc9b96f7f45f17d9519/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d12d786e30c04a9d307c5d7080bf720d9bac7f1668191d8e37633a9562749e2", size = 1978667, upload-time = "2026-04-17T09:11:35.589Z" }, - { url = "https://files.pythonhosted.org/packages/0e/cb/665ce629e218c8228302cb94beff4f6531082a2c87d3ecc3d5e63a26f392/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d5e6d6343b0b5dcacb3503b5de90022968da8ed0ab9ab39d3eda71c20cbf84e", size = 2046721, upload-time = "2026-04-17T09:11:47.725Z" }, - { url = "https://files.pythonhosted.org/packages/77/e9/6cb2cf60f54c1472bbdfce19d957553b43dbba79d1d7b2930a195c594785/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:233eebac0999b6b9ba76eb56f3ec8fce13164aa16b6d2225a36a79e0f95b5973", size = 2228483, upload-time = "2026-04-17T09:12:08.837Z" }, - { url = "https://files.pythonhosted.org/packages/0d/2a/93e018dd5571f781ebaeda8c0cf65398489d5bee9b1f484df0b6149b43b9/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cc0eee720dd2f14f3b7c349469402b99ad81a174ab49d3533974529e9d93992", size = 2294663, upload-time = "2026-04-17T09:12:52.053Z" }, - { url = "https://files.pythonhosted.org/packages/5e/4f/49e57ca55c770c93d9bb046666a54949b42e3c9099a0c5fe94557873fe30/pydantic_core-2.46.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ee76bf2c9910513dbc19e7d82367131fa7508dedd6186a462393071cc11059", size = 2098742, upload-time = "2026-04-17T09:13:45.472Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b0/6e46b5cd3332af665f794b8cdeea206618a8630bd9e7bcc36864518fce81/pydantic_core-2.46.2-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:d61db38eb4ee5192f0c261b7f2d38e420b554df8912245e3546aee5c45e2fd78", size = 2125922, upload-time = "2026-04-17T09:12:54.304Z" }, - { url = "https://files.pythonhosted.org/packages/06/d1/40850c81585be443a2abfdf7f795f8fae831baf8e2f9b2133c8246ac671c/pydantic_core-2.46.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f09a713d17bcd55da8ab02ebd9110c5246a49c44182af213b5212800af8bc83", size = 2183000, upload-time = "2026-04-17T09:10:59.027Z" }, - { url = "https://files.pythonhosted.org/packages/04/af/8493d7dfa03ebb7866909e577c6aa65ea0de7377b86023cc51d0c8e11db3/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:30cacc5fb696e64b8ef6fd31d9549d394dd7d52760db072eecb98e37e3af1677", size = 2180335, upload-time = "2026-04-17T09:12:57.01Z" }, - { url = "https://files.pythonhosted.org/packages/72/5b/1f6a344c4ffdf284da41c6067b82d5ebcbd11ce1b515ae4b662d4adb6f61/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:7ccfb105fcfe91a22bbb5563ad3dc124bc1aa75bfd2e53a780ab05f78cdf6108", size = 2330002, upload-time = "2026-04-17T09:12:02.958Z" }, - { url = "https://files.pythonhosted.org/packages/25/ff/9a694126c12d6d2f48a0cafa6f8eef88ef0d8825600e18d03ff2e896c3b2/pydantic_core-2.46.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:13ffef637dc8370c249e5b26bd18e9a80a4fca3d809618c44e18ec834a7ca7a8", size = 2359920, upload-time = "2026-04-17T09:10:27.764Z" }, - { url = "https://files.pythonhosted.org/packages/51/c8/3a35c763d68a9cb2675eb10ef242cf66c5d4701b28ae12e688d67d2c180e/pydantic_core-2.46.2-cp314-cp314-win32.whl", hash = "sha256:1b0ab6d756ca2704a938e6c31b53f290c2f9c10d3914235410302a149de1a83e", size = 1953701, upload-time = "2026-04-17T09:13:30.021Z" }, - { url = "https://files.pythonhosted.org/packages/1a/6a/f2726a780365f7dfd89d62036f984f7acb99978c60c5e1fa7c0cb898ed11/pydantic_core-2.46.2-cp314-cp314-win_amd64.whl", hash = "sha256:99ebade8c9ada4df975372d8dd25883daa0e379a05f1cd0c99aa0c04368d01a6", size = 2071867, upload-time = "2026-04-17T09:10:39.205Z" }, - { url = "https://files.pythonhosted.org/packages/e1/79/76baacb9feba3d7c399b245ca1a29c74ea0db04ea693811374827eec2290/pydantic_core-2.46.2-cp314-cp314-win_arm64.whl", hash = "sha256:de87422197cf7f83db91d89c86a21660d749b3cd76cd8a45d115b8e675670f02", size = 2017252, upload-time = "2026-04-17T09:10:26.175Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3b/77c26938f817668d9ad9bab1a905cb23f11d9a3d4bf724d429b3e55a8eaf/pydantic_core-2.46.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:236f22b4a206b5b61db955396b7cf9e2e1ff77f372efe9570128ccfcd6a525eb", size = 2094545, upload-time = "2026-04-17T09:12:19.339Z" }, - { url = "https://files.pythonhosted.org/packages/fe/de/42c13f590e3c260966aa49bcdb1674774f975467c49abd51191e502bea28/pydantic_core-2.46.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c2012f64d2cd7cca50f49f22445aa5a88691ac2b4498ee0a9a977f8ca4f7289f", size = 1933953, upload-time = "2026-04-17T09:09:55.889Z" }, - { url = "https://files.pythonhosted.org/packages/4e/84/ebe3ebb3e2d8db656937cfa6f97f544cb7132f2307a4a7dfdcd0ea102a12/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d07d6c63106d3a9c9a333e2636f9c82c703b1a9e3b079299e58747964e4fdb72", size = 1974435, upload-time = "2026-04-17T09:10:12.371Z" }, - { url = "https://files.pythonhosted.org/packages/b9/15/0bf51ca6709477cd4ef86148b6d7844f3308f029eac361dd0383f1e17b1a/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c326a2b4b85e959d9a1fc3a11f32f84611b6ec07c053e1828a860edf8d068208", size = 2031113, upload-time = "2026-04-17T09:10:00.752Z" }, - { url = "https://files.pythonhosted.org/packages/02/ae/b7b5af9b79db036d9e61a44c481c17a213dc8fc4b8b71fe6875a72fc778b/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac8a65e798f2462552c00d2e013d532c94d646729dda98458beaf51f9ec7b120", size = 2236325, upload-time = "2026-04-17T09:10:33.227Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ae/ecef7477b5a03d4a499708f7e75d2836452ebb70b776c2d64612b334f57a/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a3c2bc1cc8164bedbc160b7bb1e8cc1e8b9c27f69ae4f9ae2b976cdae02b2dd", size = 2278135, upload-time = "2026-04-17T09:10:23.287Z" }, - { url = "https://files.pythonhosted.org/packages/db/e4/2f9d82faa47af6c39fc3f120145fd915971e1e0cb6b55b494fad9fdf8275/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69aa5e10b7e8b1bb4a6888650fd12fcbf11d396ca11d4a44de1450875702830", size = 2109071, upload-time = "2026-04-17T09:11:06.149Z" }, - { url = "https://files.pythonhosted.org/packages/f1/9c/677cf10873fbd0b116575ab7b97c90482b21564f8a8040beb18edef7a577/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4e6df5c3301e65fb42bc5338bf9a1027a02b0a31dc7f54c33775229af474daf0", size = 2106028, upload-time = "2026-04-17T09:10:51.525Z" }, - { url = "https://files.pythonhosted.org/packages/d6/53/6a06183544daba51c059123a2064a99039df25f115a06bdb26f2ea177038/pydantic_core-2.46.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c2f6e32548ac8d559b47944effcf8ae4d81c161f6b6c885edc53bc08b8f192d", size = 2164816, upload-time = "2026-04-17T09:11:56.187Z" }, - { url = "https://files.pythonhosted.org/packages/57/6f/10fcdd9e3eca66fc828eef0f6f5850f2dd3bca2c59e6e041fb8bc3da39be/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:b089a81c58e6ea0485562bbbbbca4f65c0549521606d5ef27fba217aac9b665a", size = 2166130, upload-time = "2026-04-17T09:10:03.804Z" }, - { url = "https://files.pythonhosted.org/packages/29/83/92d3fd0e0156cad2e3cb5c26de73794af78ac9fa0c22ab666e566dd67061/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:7f700a6d6f64112ae9193709b84303bbab84424ad4b47d0253301aabce9dfc70", size = 2316605, upload-time = "2026-04-17T09:12:45.249Z" }, - { url = "https://files.pythonhosted.org/packages/97/f1/facffdb970981068219582e499b8d0871ed163ffcc6b347de5c412669e4c/pydantic_core-2.46.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:67db6814beaa5fefe91101ec7eb9efda613795767be96f7cf58b1ca8c9ca9972", size = 2358385, upload-time = "2026-04-17T09:09:54.657Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a1/b8160b2f22b2199467bc68581a4ed380643c16b348a27d6165c6c242d694/pydantic_core-2.46.2-cp314-cp314t-win32.whl", hash = "sha256:32fbc7447be8e3be99bf7869f7066308f16be55b61f9882c2cefc7931f5c7664", size = 1942373, upload-time = "2026-04-17T09:12:59.594Z" }, - { url = "https://files.pythonhosted.org/packages/0d/90/db89acabe5b150e11d1b59fe3d947dda2ef6abbfef5c82f056ff63802f5d/pydantic_core-2.46.2-cp314-cp314t-win_amd64.whl", hash = "sha256:b317a2b97019c0b95ce99f4f901ae383f40132da6706cdf1731066a73394c25c", size = 2052078, upload-time = "2026-04-17T09:10:19.96Z" }, - { url = "https://files.pythonhosted.org/packages/97/32/e19b83ceb07a3f1bb21798407790bbc9a31740158fd132b94139cb84e16c/pydantic_core-2.46.2-cp314-cp314t-win_arm64.whl", hash = "sha256:7dcb9d40930dfad7ab6b20bcc6ca9d2b030b0f347a0cd9909b54bd53ead521b1", size = 2016941, upload-time = "2026-04-17T09:12:34.447Z" }, -] - [[package]] name = "pygments" version = "2.20.0" @@ -619,15 +212,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] -[[package]] -name = "pygobject" -version = "3.56.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycairo" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/80/09247a2be28af2c2240132a0af6c1005a2b1d089242b13a2cd782d2de8d7/pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313", size = 1409059, upload-time = "2026-03-25T16:14:04.008Z" } - [[package]] name = "pyzmq" version = "27.1.0" @@ -637,6 +221,26 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, + { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, @@ -647,6 +251,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, @@ -657,6 +273,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, ] [[package]] @@ -681,15 +307,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, -] - [[package]] name = "tabulate" version = "0.10.0" @@ -701,7 +318,7 @@ wheels = [ [[package]] name = "textual" -version = "8.2.3" +version = "8.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", extra = ["linkify"] }, @@ -711,9 +328,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/2f/d44f0f12b3ddb1f0b88f7775652e99c6b5a43fd733badf4ce064bdbfef4a/textual-8.2.3.tar.gz", hash = "sha256:beea7b86b03b03558a2224f0cc35252e60ef8b0c4353b117b2f40972902d976a", size = 1848738, upload-time = "2026-04-05T09:12:45.338Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/89/bec5709fb759f9c784bbcb30b2e3497df3f901691d13c2b864dbf6694a17/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4", size = 1848933, upload-time = "2026-04-19T04:20:45.845Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/28/a81d6ce9f4804818bd1231a9a6e4d56ea84ebbe8385c49591444f0234fa2/textual-8.2.3-py3-none-any.whl", hash = "sha256:5008ac581bebf1f6fa0520404261844a231e5715fdbddd10ca73916a3af48ca2", size = 724231, upload-time = "2026-04-05T09:12:48.747Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/02932f0d597cdbb34e34bf24266ff0f2cf292ccb3aafc37dd9efcb0cc416/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba", size = 724390, upload-time = "2026-04-19T04:20:49.968Z" }, ] [[package]] @@ -725,18 +342,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, ] -[[package]] -name = "tqdm" -version = "4.67.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, -] - [[package]] name = "transitions" version = "0.9.3" @@ -758,18 +363,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] -[[package]] -name = "typing-inspection" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, -] - [[package]] name = "uc-micro-py" version = "2.0.0" @@ -779,56 +372,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/73/d21edf5b204d1467e06500080a50f79d49ef2b997c79123a536d4a17d97c/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c", size = 6383, upload-time = "2026-03-01T06:31:26.257Z" }, ] -[[package]] -name = "yarl" -version = "1.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, - { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, - { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, - { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, - { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, - { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, - { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, - { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, - { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, - { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, - { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, - { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, - { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, - { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, - { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, - { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, - { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, - { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, - { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, - { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, - { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, - { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, - { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, - { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, - { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, - { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, - { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, - { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, -] - [[package]] name = "zmq" version = "0.0.0" From c2a1867c4991e5826fd4110fd239da3191878402 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 22 Apr 2026 06:55:58 +0800 Subject: [PATCH 48/79] =?UTF-8?q?fix(interface):=20=E4=BF=AE=E5=A4=8D=20CS?= =?UTF-8?q?S=5FPATH=20=E5=AF=BC=E8=87=B4=E7=9A=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E8=A6=86=E5=86=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/css/screens/setting.tcss | 8 ++------ src/heurams/interface/screens/setting.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/heurams/interface/css/screens/setting.tcss b/src/heurams/interface/css/screens/setting.tcss index 7054e14..7e43ac4 100644 --- a/src/heurams/interface/css/screens/setting.tcss +++ b/src/heurams/interface/css/screens/setting.tcss @@ -2,14 +2,10 @@ align-vertical: bottom; } -Switch { +.setting-switch { dock: right; } -Label { - width: auto -} - Select { width: 55%; dock: right; @@ -20,7 +16,7 @@ Input { dock: right; } -Horizontal { +.setting-item { width: 100%; height: 4; padding: 0 0 1 0; diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index a0358f6..facd17c 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -46,7 +46,6 @@ class SettingScreen(Screen): @on(events.ScreenResume) def post_active(self, event): from heurams.interface import shim - shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: @@ -113,6 +112,7 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), + classes="setting-item" ) ) elif isinstance(parent[f"_{i}_candidate"], list): @@ -124,6 +124,7 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), + classes="setting-item" ) ) else: @@ -137,6 +138,7 @@ class SettingScreen(Screen): type="number", id=domize(f"{parent_epath}.{i}"), ), + classes="setting-item" ) ) elif isinstance(parent[i], str): @@ -149,6 +151,7 @@ class SettingScreen(Screen): type="text", id=domize(f"{parent_epath}.{i}"), ), + classes="setting-item" ) ) elif isinstance(parent[i], bool): @@ -156,8 +159,10 @@ class SettingScreen(Screen): Horizontal( Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Switch( - value=parent[i], id=domize(f"{parent_epath}.{i}") + value=parent[i], id=domize(f"{parent_epath}.{i}"), + classes="setting-switch", ), + classes="setting-item" ) ) elif isinstance(parent[i], int): @@ -170,6 +175,7 @@ class SettingScreen(Screen): type="integer", id=domize(f"{parent_epath}.{i}"), ), + classes="setting-item" ) ) elif isinstance(parent[i], list): From f50c19ba828a6ab7162b3d4270f84dba3110b14d Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 22 Apr 2026 22:54:25 +0800 Subject: [PATCH 49/79] =?UTF-8?q?feat(interface):=20=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=81=9A=E7=84=A6=E4=B8=8E=E9=94=AE=E7=9B=98?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 6 +- data/config/interface/puzzles/cloze.toml | 2 +- data/config/repo/_.toml | 2 +- data/config/repo/{cngk-0.toml => cngk-t.toml} | 0 data/misc/attics/ana.pkl | Bin 0 -> 111 bytes data/misc/favorites.json5 | 1 + data/repo/cngk-t/algodata.json | 11403 +--------------- data/repo/cngk-t/manifest.toml | 4 +- examples/repo.ipynb | 764 -- examples/simplemem.py | 56 - src/heurams/context.py | 2 +- .../interface/css/screens/dashboard.tcss | 5 + src/heurams/interface/screens/about.py | 3 +- src/heurams/interface/screens/dashboard.py | 10 +- src/heurams/interface/screens/memoqueue.py | 32 +- src/heurams/interface/screens/preparation.py | 4 +- src/heurams/interface/screens/setting.py | 1 + src/heurams/interface/widgets/cloze_puzzle.py | 22 +- src/heurams/interface/widgets/mcq_puzzle.py | 39 +- src/heurams/interface/widgets/recognition.py | 7 +- src/heurams/kernel/puzzles/mcq.py | 2 +- src/heurams/services/attic.py | 54 + src/heurams/services/favorite_service.py | 3 +- src/heurams/services/hasher.py | 9 +- 24 files changed, 173 insertions(+), 12258 deletions(-) rename data/config/repo/{cngk-0.toml => cngk-t.toml} (100%) create mode 100644 data/misc/attics/ana.pkl create mode 100644 data/misc/favorites.json5 delete mode 100644 examples/repo.ipynb delete mode 100644 examples/simplemem.py create mode 100644 src/heurams/services/attic.py diff --git a/data/config/global.toml b/data/config/global.toml index 81b0d99..707741e 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,4 +1,4 @@ -zmq_debug = true +zmq_debug = false _zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 _zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" @@ -15,3 +15,7 @@ config = "./data/config" _config_desc = "配置文件根目录" repo = "./data/repo" _repo_desc = "记忆单元集根目录" +misc = "./data/misc" +_misc_desc = "扩展程序和 whisper 等模块的数据存储根目录" +_addons = "./data/addons" +__addons_desc = "扩展程序根目录" diff --git a/data/config/interface/puzzles/cloze.toml b/data/config/interface/puzzles/cloze.toml index a2e0ed8..f1437a6 100644 --- a/data/config/interface/puzzles/cloze.toml +++ b/data/config/interface/puzzles/cloze.toml @@ -1,2 +1,2 @@ -min_denominator = "3" +min_denominator = "2" _min_denominator_desc = "设空比例系数的倒数" diff --git a/data/config/repo/_.toml b/data/config/repo/_.toml index d471edb..823bf9b 100644 --- a/data/config/repo/_.toml +++ b/data/config/repo/_.toml @@ -1,2 +1,2 @@ -_cngk-t_desc = "高考必备古诗文" +_cngk-t_desc = "高考必备古诗文-测试" _cngk_desc = "高考必备古诗文" diff --git a/data/config/repo/cngk-0.toml b/data/config/repo/cngk-t.toml similarity index 100% rename from data/config/repo/cngk-0.toml rename to data/config/repo/cngk-t.toml diff --git a/data/misc/attics/ana.pkl b/data/misc/attics/ana.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7099c7c9e1eaef9b13c543682d109ca8b7038abb GIT binary patch literal 111 zcmZo*otnY`0ku;!dN@n+OA>QRGILX>xH|+2?cN8J>fz2WNX;uKt*XjNEuP{n)58sA y$EOw*P4Q;v;RMMSmZp}bPVrXkVaZ7>E}7!)c&p07@`^)h4?9?Q5m1h$R1W|xXeZAA literal 0 HcmV?d00001 diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/data/misc/favorites.json5 @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json index 300550e..0967ef4 100644 --- a/data/repo/cngk-t/algodata.json +++ b/data/repo/cngk-t/algodata.json @@ -1,11402 +1 @@ -{ - "临安春雨初霁": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6136827 - } - }, - "世味年来薄似纱, 谁令骑马客京华.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6139746 - } - }, - "小楼一夜听春雨, 深巷明朝卖杏花.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6142678 - } - }, - "矮纸斜行闲作草, 晴窗细乳戏分茶.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6145742 - } - }, - "素衣莫起风尘叹, 犹及清明可到家.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6149702 - } - }, - "书愤": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6153867 - } - }, - "早岁那知世事艰, 中原北望气如山": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6157937 - } - }, - "楼船夜雪瓜洲渡, 铁马秋风大散关": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.616204 - } - }, - "塞上长城空自许, 镜中衰鬓已先斑": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6166213 - } - }, - "出师一表真名世, 千载谁堪伯仲间": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6170292 - } - }, - "五代史伶官传序": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6174061 - } - }, - "呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6177616 - } - }, - "原庄宗之所以得天下, 与其所以失之者, 可以知之矣": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6181145 - } - }, - "世言晋王之将终也, 以三矢赐庄宗而告之曰:": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.618471 - } - }, - "梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6188185 - } - }, - "此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.619165 - } - }, - "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之": { - "SM-2": { - "efactor": 2.2199999999999998, - "real_rept": 4, - "rept": 2, - "interval": 13, - "last_date": 20562, - "next_date": 20575, - "is_activated": 1, - "last_modify": 1776577784.6195261 - } - }, - "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!": { - "SM-2": { - "efactor": 1.8599999999999997, - "real_rept": 4, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6198707 - } - }, - "及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归": { - "SM-2": { - "efactor": 1.3, - "real_rept": 6, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6579466 - } - }, - "至于誓天断发, 泣下沾襟, 何其衰也!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20562, - "next_date": 20577, - "is_activated": 1, - "last_modify": 1776577784.6205814 - } - }, - "岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6209705 - } - }, - "《书》曰: 满招损, 谦得益.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6213555 - } - }, - "忧劳可以兴国, 逸豫可以亡身, 自然之理也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.621733 - } - }, - "故方其盛也, 举天下之豪杰, 莫能与之争;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6221194 - } - }, - "及其衰也, 数十伶人困之, 而身死国灭, 为天下笑": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6225028 - } - }, - "夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6228793 - } - }, - "六国论": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.623255 - } - }, - "六国破灭, 非兵不利, 战不善, 弊在赂秦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6236465 - } - }, - "赂秦而力亏, 破灭之道也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6240213 - } - }, - "或曰: 六国互丧, 率赂秦耶?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6244063 - } - }, - "曰: 不赂者以赂者丧.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.624782 - } - }, - "盖失强援, 不能独完.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6251616 - } - }, - "故曰: 弊在赂秦也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6255794 - } - }, - "秦以攻取之外, 小则获邑, 大则得城.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6259894 - } - }, - "较秦之所得, 与战胜而得者, 其实百倍;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6264102 - } - }, - "诸侯之所亡, 与战败而亡者, 其实亦百倍.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.626829 - } - }, - "则秦之所大欲, 诸侯之所大患, 固不在战矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6272392 - } - }, - "思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6276643 - } - }, - "子孙视之不甚惜, 举以予人, 如弃草芥.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.628089 - } - }, - "今日割五城, 明日割十城, 然后得一夕安寝.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6285114 - } - }, - "起视四境, 而秦兵又至矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6289263 - } - }, - "然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6293442 - } - }, - "故不战而强弱胜负已判矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.629762 - } - }, - "至于颠覆, 理固宜然.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.630174 - } - }, - "古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.630577 - } - }, - "此言得之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6308808 - } - }, - "齐人未尝赂秦, 终继五国迁灭, 何哉?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6311781 - } - }, - "与嬴而不助五国也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.63148 - } - }, - "五国既丧, 齐亦不免矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.631776 - } - }, - "燕赵之君, 始有远略, 能守其土, 义不赂秦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6320646 - } - }, - "是故燕虽小国而后亡, 斯用兵之效也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6323593 - } - }, - "至丹以荆卿为计, 始速祸焉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6326425 - } - }, - "赵尝五战于秦, 二败而三胜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6329288 - } - }, - "后秦击赵者再, 李牧连却之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6332211 - } - }, - "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6336164 - } - }, - "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.633949 - } - }, - "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6342893 - } - }, - "则胜负之数, 存亡之理, 当与秦相较, 或未易量.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6346242 - } - }, - "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.634954 - } - }, - "则吾恐秦人食之不得下咽也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6352873 - } - }, - "悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6356177 - } - }, - "为国者无使为积威之所劫哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6359751 - } - }, - "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6582904 - } - }, - "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6367347 - } - }, - "劝学": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.637102 - } - }, - "君子曰: 学不可以已.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6374843 - } - }, - "青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6378508 - } - }, - "木直中绳, 𫐓以为轮, 其曲中规.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6382143 - } - }, - "虽有槁暴, 不复挺者, 𫐓使之然也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6385686 - } - }, - "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.638898 - } - }, - "吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6393514 - } - }, - "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6398017 - } - }, - "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6402524 - } - }, - "君子生非异也, 善假于物也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6406782 - } - }, - "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6410484 - } - }, - "故不积跬步, 无以至千里; 不积小流, 无以成江海.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6414237 - } - }, - "骐骥一跃, 不能十步; 驽马十驾, 功在不舍.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.641818 - } - }, - "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6586235 - } - }, - "蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.642687 - } - }, - "蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6429799 - } - }, - "声声慢·寻寻觅觅": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6432714 - } - }, - "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6436827 - } - }, - "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6589534 - } - }, - "大道之行也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6444263 - } - }, - "大道之行也, 天下为公.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6447709 - } - }, - "选贤与能, 讲信修睦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6451163 - } - }, - "故人不独亲其亲, 不独子其子.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6454694 - } - }, - "使老有所终, 壮有所用, 幼有所长.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6458526 - } - }, - "矜寡孤独废疾者皆有所养.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6462154 - } - }, - "男有分, 女有归.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6465893 - } - }, - "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6469772 - } - }, - "是故谋闭不兴, 盗窃乱贼而不作.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.647417 - } - }, - "故外户而不闭, 是谓大同.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6477902 - } - }, - "客至": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.64818 - } - }, - "舍南舍北皆春水, 但见群鸥日日来.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.648559 - } - }, - "花径不曾缘客扫, 蓬门今始为君开.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6489382 - } - }, - "盘飧市远无兼味, 樽酒家贫只旧醅.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6493144 - } - }, - "肯与邻翁相对饮, 隔篱呼取尽余杯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6496823 - } - }, - "将进酒": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6500533 - } - }, - "君不见, 黄河之水天上来, 奔流到海不复回.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6504254 - } - }, - "君不见, 高堂明镜悲白发, 朝如青丝暮成雪!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6507947 - } - }, - "人生得意须尽欢, 莫使金樽空对月.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6511571 - } - }, - "天生我材必有用, 千金散尽还复来.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.651622 - } - }, - "烹羊宰牛且为乐, 会须一饮三百杯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6520529 - } - }, - "岑夫子, 丹丘生, 将进酒, 杯莫停.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6524749 - } - }, - "与君歌一曲, 请君为我倾耳听.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6528883 - } - }, - "钟鼓馔玉不足贵, 但愿长醉不复醒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6533206 - } - }, - "古来圣贤皆寂寞, 惟有饮者留其名.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6536992 - } - }, - "陈王昔时宴平乐, 斗酒十千恣欢谑.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6540747 - } - }, - "主人何为言少钱, 径须沽取对君酌.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6545231 - } - }, - "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6548157 - } - }, - "屈原列传": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6551015 - } - }, - "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6554022 - } - }, - "离骚者, 犹离忧也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6556945 - } - }, - "夫天者, 人之始也; 父母者, 人之本也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6559892 - } - }, - "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.656302 - } - }, - "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6566348 - } - }, - "信而见疑, 忠而被谤, 能无怨乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.656969 - } - }, - "屈平之作《离骚》, 盖自怨生也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.6573117 - } - }, - "《国风》好色而不淫, 《小雅》怨诽而不乱.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20562, - "next_date": 20563, - "is_activated": 1, - "last_modify": 1776577784.657641 - } - }, - "若《离骚》者, 可谓兼之矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "明道德之广崇, 治乱之条贯, 靡不毕见.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其文约, 其辞微, 其志洁, 其行廉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其称文小而其指极大, 举类迩而见义远.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其志洁, 故其称物芳; 其行廉, 故死而不容.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "推此志也, 虽与日月争光可也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "山居秋暝": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "空山新雨后, 天气晚来秋.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "明月松间照, 清泉石上流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "竹喧归浣女, 莲动下渔舟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "随意春芳歇, 王孙自可留.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "师说": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "古之学者必有师.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "师者, 所以传道受业解惑也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人非生而知之者, 孰能无惑?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "惑而不从师, 其为惑也, 终不解矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "生乎吾前, 其闻道也固先乎吾, 吾从而师之;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "生乎吾后, 其闻道也亦先乎吾, 吾从而师之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾师道也, 夫庸知其年之先后生于吾乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是故无贵无贱, 无长无少, 道之所存, 师之所存也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "古之圣人, 其出人也远矣, 犹且从师而问焉;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今之众人, 其下圣人也亦远矣, 而耻学于师.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是故圣益圣, 愚益愚.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "巫医乐师百工之人, 不耻相师.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问之, 则曰: “彼与彼年相若也, 道相似也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "位卑则足羞, 官盛则近谀.”": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "呜呼! 师道之不复, 可知矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "郯子之徒, 其贤不及孔子.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "孔子曰: 三人行, 则必有我师.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余嘉其能行古道, 作《师说》以贻之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "归去来兮辞": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "归去来兮, 田园将芜胡不归?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "既自以心为形役, 奚惆怅而独悲?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "悟已往之不谏, 知来者之可追.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "实迷途其未远, 觉今是而昨非.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舟遥遥以轻飏, 风飘飘而吹衣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问征夫以前路, 恨晨光之熹微.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乃瞻衡宇, 载欣载奔.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "僮仆欢迎, 稚子候门.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "三径就荒, 松菊犹存.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "携幼入室, 有酒盈樽.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "引壶觞以自酌, 眄庭柯以怡颜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "倚南窗以寄傲, 审容膝之易安.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "园日涉以成趣, 门虽设而常关.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "策扶老以流憩, 时矫首而遐观.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "云无心以出岫, 鸟倦飞而知还.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "景翳翳以将入, 抚孤松而盘桓.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "归去来兮, 请息交以绝游.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "世与我而相违, 复驾言兮焉求?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "悦亲戚之情话, 乐琴书以消忧.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "农人告余以春及, 将有事于西畴.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "或命巾车, 或棹孤舟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "既窈窕以寻壑, 亦崎岖而经丘.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "木欣欣以向荣, 泉涓涓而始流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "善万物之得时, 感吾生之行休.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "已矣乎! 寓形宇内复几时?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曷不委心任去留?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "胡为乎遑遑欲何之?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "富贵非吾愿, 帝乡不可期.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "怀良辰以孤往, 或植杖而耘耔.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登东皋以舒啸, 临清流而赋诗.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "聊乘化以归尽, 乐夫天命复奚疑!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "归园田居·其一": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "少无适俗韵, 性本爱丘山": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "误落尘网中, 一去三十年": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "羁鸟恋旧林, 池鱼思故渊": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "开荒南野际, 守拙归园田": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "方宅十余亩, 草屋八九间": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "榆柳荫后檐, 桃李罗堂前": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "暧暧远人村, 依依墟里烟": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "狗吠深巷中, 鸡鸣桑树颠": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "户庭无尘杂, 虚室有余闲": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "久在樊笼里, 复得返自然": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "念奴娇·赤壁怀古": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "大江东去, 浪淘尽, 千古风流人物.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故垒西边, 人道是, 三国周郎赤壁.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乱石穿空, 惊涛拍岸, 卷起千堆雪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江山如画, 一时多少豪杰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "遥想公瑾当年, 小乔初嫁了, 雄姿英发.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "羽扇纶巾, 谈笑间, 樯橹灰飞烟灭.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故国神游, 多情应笑我, 早生华发.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人生如梦, 一尊还酹江月.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "念奴娇·过洞庭": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "洞庭青草, 近中秋, 更无一点风色.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "玉鉴琼田三万顷, 着我扁舟一叶.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "素月分辉, 明河共影, 表里俱澄澈.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "悠然心会, 妙处难与君说.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "应念岭海经年, 孤光自照, 肝肺皆冰雪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "短发萧骚襟袖冷, 稳泛沧浪空阔.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "尽挹西江, 细斟北斗, 万象为宾客.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "扣舷独啸, 不知今夕何夕!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "扬州慢": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "淮左名都, 竹西佳处, 解鞍少驻初程.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "过春风十里, 尽荠麦青青.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自胡马窥江去后, 废池乔木, 犹厌言兵.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "渐黄昏, 清角吹寒, 都在空城.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "杜郎俊赏, 算而今, 重到须惊.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "纵豆蔻词工, 青楼梦好, 难赋深情.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "二十四桥仍在, 波心荡, 冷月无声.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "念桥边红药, 年年知为谁生?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "报任安书": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "《诗》三百篇, 大底圣贤发愤之所为作也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此人皆意有所郁结, 不得通其道, 故述往事, 思来者.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "亦欲以究天人之际, 通古今之变, 成一家之言.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然此可为智者道, 难为俗人言也!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "拟行路难·其四": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "泻水置平地, 各自东西南北流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人生亦有命, 安能行叹复坐愁?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "酌酒以自宽, 举杯断绝歌路难.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "心非木石岂无感, 吞声踯躅不敢言.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "无衣": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "春江花月夜": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "春江潮水连海平, 海上明月共潮生.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "滟滟随波千万里, 何处春江无月明!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江流宛转绕芳甸, 月照花林皆似霰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "空里流霜不觉飞, 汀上白沙看不见.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江天一色无纤尘, 皎皎空中孤月轮.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江畔何人初见月? 江月何年初照人?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人生代代无穷已, 江月年年望相似.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不知江月待何人, 但见长江送流水.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "白云一片去悠悠, 青枫浦上不胜愁.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谁家今夜扁舟子? 何处相思明月楼?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "可怜楼上月徘徊, 应照离人妆镜台.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "玉户帘中卷不去, 捣衣砧上拂还来.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此时相望不相闻, 愿逐月华流照君.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鸿雁长飞光不度, 鱼龙潜跃水成文.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "昨夜闲潭梦落花, 可怜春半不还家.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江水流春去欲尽, 江潭落月复西斜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "斜月沉沉藏海雾, 碣石潇湘无限路.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不知乘月几人归, 落月摇情满江树.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "望海潮·东南形胜": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "东南形胜, 三吴都会, 钱塘自古繁华.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "烟柳画桥, 风帘翠幕, 参差十万人家.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "云树绕堤沙, 怒涛卷霜雪, 天堑无涯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "市列珠玑, 户盈罗绮, 竞豪奢.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "重湖叠𪩘清嘉, 有三秋桂子, 十里荷花.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "异日图将好景, 归去凤池夸.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "朝天子·咏喇叭": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "喇叭, 唢呐, 曲儿小腔儿大": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "官船来往乱如麻, 全仗你抬声价": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "军听了军愁, 民听了民怕": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "哪里去辨甚么真共假?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "眼见的吹翻了这家, 吹伤了那家,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "只吹的水尽鹅飞罢!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "李凭箜篌引": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吴丝蜀桐张高秋, 空山凝云颓不流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江娥啼竹素女愁, 李凭中国弹箜篌.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "昆山玉碎凤凰叫, 芙蓉泣露香兰笑.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "十二门前融冷光, 二十三丝动紫皇.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "女娲炼石补天处, 石破天惊逗秋雨.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "梦入神山教神妪, 老鱼跳波瘦蛟舞.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吴质不眠倚桂树, 露脚斜飞湿寒兔.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "桂枝香·金陵怀古": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登临送目, 正故国晚秋, 天气初肃.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千里澄江似练, 翠峰如簇.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "归帆去棹残阳里, 背西风, 酒旗斜矗.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "彩舟云淡, 星河鹭起, 画图难足.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "念往昔, 繁华竞逐.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "叹门外楼头, 悲恨相续.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千古凭高对此, 谩嗟荣辱.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "六朝旧事随流水, 但寒烟衰草凝绿.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "至今商女, 时时犹唱, 后庭遗曲.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "梦游天姥吟留别": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "天姥连天向天横, 势拔五岳掩赤城.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "天台四万八千丈, 对此欲倒东南倾.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "我欲因之梦吴越, 一夜飞度镜湖月.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "湖月照我影, 送我至剡溪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谢公宿处今尚在, 渌水荡漾清猿啼.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "脚著谢公屐, 身登青云梯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "半壁见海日, 空中闻天鸡.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千岩万转路不定, 迷花倚石忽已暝.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "熊咆龙吟殷岩泉, 栗深林兮惊层巅.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "云青青兮欲雨, 水澹澹兮生烟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "列缺霹雳, 丘峦崩摧.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "洞天石扉, 訇然中开.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "青冥浩荡不见底, 日月照耀金银台.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "霓为衣兮风为马, 云之君兮纷纷而来下.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虎鼓瑟兮鸾回车, 仙之人兮列如麻.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "忽魂悸以魄动, 恍惊起而长嗟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "惟觉时之枕席, 失向来之烟霞.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "世间行乐亦如此, 古来万事东流水.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "安能摧眉折腰事权贵, 使我不得开心颜?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "永遇乐·京口北固亭怀古": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千古江山, 英雄无觅, 孙仲谋处.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舞榭歌台, 风流总被, 雨打风吹去.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "斜阳草树, 寻常巷陌, 人道寄奴曾住.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "想当年, 金戈铁马, 气吞万里如虎.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "元嘉草草, 封狼居胥, 赢得仓皇北顾.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "四十三年, 望中犹记, 烽火扬州路.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "可堪回首, 佛狸祠下, 一片神鸦社鼓.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "凭谁问: 廉颇老矣, 尚能饭否?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江城子·乙卯正月二十日夜记梦": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "十年生死两茫茫, 不思量, 自难忘": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千里孤坟, 无处话凄凉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "纵使相逢应不识, 尘满面, 鬓如霜": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "夜来幽梦忽还乡, 小轩窗, 正梳妆": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "相顾无言, 惟有泪千行": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "料得年年肠断处, 明月夜, 短松冈": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "涉江采芙蓉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "涉江采芙蓉, 兰泽多芳草.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "采之欲遗谁? 所思在远道.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "还顾望旧乡, 长路漫浩浩.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "同心而离居, 忧伤以终老.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "燕歌行": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "汉家烟尘在东北, 汉将辞家破残贼.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "男儿本自重横行, 天子非常赐颜色.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "摐金伐鼓下榆关, 旌旆逶迤碣石间.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "校尉羽书飞瀚海, 单于猎火照狼山.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "山川萧条极边土, 胡骑凭陵杂风雨.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "战士军前半死生, 美人帐下犹歌舞!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "大漠穷秋塞草腓, 孤城落日斗兵稀.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "身当恩遇常轻敌, 力尽关山未解围.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "铁衣远戍辛勤久, 玉箸应啼别离后.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "少妇城南欲断肠, 征人蓟北空回首.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "边庭飘飖那可度, 绝域苍茫无所有.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "杀气三时作阵云, 寒声一夜传刁斗.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "相看白刃血纷纷, 死节从来岂顾勋!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君不见沙场征战苦, 至今犹忆李将军.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "琵琶行": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "浔阳江头夜送客, 枫叶荻花秋瑟瑟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "主人下马客在船, 举酒欲饮无管弦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "醉不成欢惨将别, 别时茫茫江浸月.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "忽闻水上琵琶声, 主人忘归客不发.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "寻声暗问弹者谁, 琵琶声停欲语迟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "移船相近邀相见, 添酒回灯重开宴.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "千呼万唤始出来, 犹抱琵琶半遮面.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "转轴拨弦三两声, 未成曲调先有情.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "弦弦掩抑声声思, 似诉平生不得志.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "低眉信手续续弹, 说尽心中无限事.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "轻拢慢捻抹复挑, 初为《霓裳》后《六幺》.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "大弦嘈嘈如急雨, 小弦切切如私语.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "嘈嘈切切错杂弹, 大珠小珠落玉盘.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "间关莺语花底滑, 幽咽泉流冰下难.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "冰泉冷涩弦凝绝, 凝绝不通声暂歇.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "别有幽愁暗恨生, 此时无声胜有声.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "银瓶乍破水浆迸, 铁骑突出刀枪鸣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曲终收拨当心画, 四弦一声如裂帛.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "东船西舫悄无言, 唯见江心秋月白.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "沉吟放拨插弦中, 整顿衣裳起敛容.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自言本是京城女, 家在虾蟆陵下住.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "十三学得琵琶成, 名属教坊第一部.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曲罢曾教善才服, 妆成每被秋娘妒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "五陵年少争缠头, 一曲红绡不知数.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "钿头银篦击节碎, 血色罗裙翻酒污.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今年欢笑复明年, 秋月春风等闲度.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "弟走从军阿姨死, 暮去朝来颜色故.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "门前冷落鞍马稀, 老大嫁作商人妇.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "商人重利轻别离, 前月浮梁买茶去.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "去来江口守空船, 绕船月明江水寒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "夜深忽梦少年事, 梦啼妆泪红阑干.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "我闻琵琶已叹息, 又闻此语重唧唧.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "同是天涯沦落人, 相逢何必曾相识!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "我从去年辞帝京, 谪居卧病浔阳城.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "浔阳地僻无音乐, 终岁不闻丝竹声.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "住近湓江地低湿, 黄芦苦竹绕宅生.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其间旦暮闻何物? 杜鹃啼血猿哀鸣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "春江花朝秋月夜, 往往取酒还独倾.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂无山歌与村笛, 呕哑嘲哳难为听.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今夜闻君琵琶语, 如听仙乐耳暂明.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "莫辞更坐弹一曲, 为君翻作《琵琶行》.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "感我此言良久立, 却坐促弦弦转急.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "凄凄不似向前声, 满座重闻皆掩泣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "座中泣下谁最多? 江州司马青衫湿.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登岳阳楼": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "昔闻洞庭水, 今上岳阳楼.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吴楚东南坼, 乾坤日夜浮.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "亲朋无一字, 老病有孤舟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "戎马关山北, 凭轩涕泗流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登快阁": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "痴儿了却公家事, 快阁东西倚晚晴.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "落木千山天远大, 澄江一道月分明.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "朱弦已为佳人绝, 青眼聊因美酒横.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "万里归船弄长笛, 此心吾与白鸥盟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登泰山记": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "泰山之阳, 汶水西流; 其阴, 济水东流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "阳谷皆入汶, 阴谷皆入济.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "当其南北分者, 古长城也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "最高日观峰, 在长城南十五里.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是月丁未, 与知府朱孝纯子颍由南麓登.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "四十五里, 道皆砌石为磴, 其级七千有余.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "泰山正南面有三谷.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "中谷绕泰安城下, 郦道元所谓环水也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "古时登山, 循东谷入, 道有天门.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "东谷者, 古谓之天门溪水, 余所不至也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今所经中岭及山巅, 崖限当道者, 世皆谓之天门云.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "道中迷雾冰滑, 磴几不可登.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "及既上, 苍山负雪, 明烛天南.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "戊申晦, 五鼓, 与子颍坐日观亭, 待日出.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "大风扬积雪击面.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "亭东自足下皆云漫.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "稍见云中白若樗蒱数十立者, 山也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "极天云一线异色, 须臾成五采.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "日上, 正赤如丹, 下有红光动摇承之.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "或曰, 此东海也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "亭西有岱祠, 又有碧霞元君祠.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "皇帝行宫在碧霞元君祠东.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "僻不当道者, 皆不及往.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "山多石, 少土.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "石苍黑色, 多平方, 少圜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "少杂树, 多松, 生石罅, 皆平顶.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "冰雪, 无瀑水, 无鸟兽音迹.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "至日观数里内无树, 而雪与人膝齐.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "桐城姚鼐记.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "登高": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "风急天高猿啸哀, 渚清沙白鸟飞回.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "无边落木萧萧下, 不尽长江滚滚来.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "万里悲秋常作客, 百年多病独登台.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "艰难苦恨繁霜鬓, 潦倒新停浊酒杯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "短歌行": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "对酒当歌, 人生几何!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "譬如朝露, 去日苦多.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "慨当以慷, 忧思难忘.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "何以解忧? 唯有杜康.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "青青子衿, 悠悠我心.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "但为君故, 沉吟至今.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "呦呦鹿鸣, 食野之苹.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "我有嘉宾, 鼓瑟吹笙.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "明明如月, 何时可掇?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "忧从中来, 不可断绝.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "越陌度阡, 枉用相存.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "契阔谈讌, 心念旧恩.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "月明星稀, 乌鹊南飞.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "绕树三匝, 何枝可依?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "山不厌高, 海不厌深.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "周公吐哺, 天下归心.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "石钟山记": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "《水经》云:\"彭蠡之口有石钟山焉\"": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是说也, 人常疑之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "至唐李渤始访其遗踪, 得双石于潭上": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自以为得之矣": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然是说也, 余尤疑之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "石之铿然有声者, 所在皆是也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而此独以钟名, 何哉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "元丰七年六月丁丑, 余自齐安舟行适临汝": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而长子迈将赴饶之德兴尉, 送之至湖口": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "因得观所谓石钟者": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余固笑而不信也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "至暮夜月明, 独与迈乘小舟, 至绝壁下": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "大石侧立千尺, 如猛兽奇鬼, 森然欲搏人": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而山上栖鹘, 闻人声亦惊起, 磔磔云霄间": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "又有若老人咳且笑于山谷中者, 或曰此鹳鹤也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余方心动欲还, 而大声发于水上": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "噌吰如钟鼓不绝": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舟人大恐": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "徐而察之, 则山下皆石穴罅": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不知其浅深, 微波入焉, 涵澹澎湃而为此也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舟回至两山间, 将入港口, 有大石当中流": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "可坐百人, 空中而多窍": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "与风水相吞吐, 有窾坎镗鞳之声": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "与向之噌吰者相应, 如乐作焉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "因笑谓迈曰:\"汝识之乎\"": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "噌吰者, 周景王之无射也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "窾坎镗鞳者, 魏庄子之歌钟也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "古之人不余欺也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "事不目见耳闻, 而臆断其有无, 可乎": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "郦元之所见闻殆与余同, 而言之不详": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "士大夫终不肯以小舟夜泊绝壁之下": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故莫能知": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而渔工水师虽知而不能言": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此世所以不传也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而陋者乃以斧斤考击而求之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自以为得其实": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余是以记之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盖叹郦元之简, 而笑李渤之陋也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "离骚": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "帝高阳之苗裔兮, 朕皇考曰伯庸.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "摄提贞于孟陬兮, 惟庚寅吾以降.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "皇览揆余初度兮, 肇锡余以嘉名.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "名余曰正则兮, 字余曰灵均.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "纷吾既有此内美兮, 又重之以修能.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "扈江离与辟芷兮, 纫秋兰以为佩.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "汩余若将不及兮, 恐年岁之不吾与.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "朝搴阰之木兰兮, 夕揽洲之宿莽.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "日月忽其不淹兮, 春与秋其代序.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "惟草木之零落兮, 恐美人之迟暮.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不抚壮而弃秽兮, 何不改此度?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乘骐骥以驰骋兮, 来吾道夫先路!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "长太息以掩涕兮, 哀民生之多艰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余虽好修姱以鞿羁兮, 謇朝谇而夕替.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "既替余以蕙纕兮, 又申之以揽茝.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "亦余心之所善兮, 虽九死其犹未悔.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "怨灵修之浩荡兮, 终不察夫民心.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "众女嫉余之蛾眉兮, 谣诼谓余以善淫.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "固时俗之工巧兮, 偭规矩而改错.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "背绳墨以追曲兮, 竞周容以为度.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "忳郁邑余侘傺兮, 吾独穷困乎此时也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "宁溘死以流亡兮, 余不忍为此态也!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鸷鸟之不群兮, 自前世而固然.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "何方圜之能周兮, 夫孰异道而相安?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "屈心而抑志兮, 忍尤而攘诟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "伏清白以死直兮, 固前圣之所厚.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "悔相道之不察兮, 延伫乎吾将反.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "回朕车以复路兮, 及行迷之未远.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "步余马于兰皋兮, 驰椒丘且焉止息.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "进不入以离尤兮, 退将复修吾初服.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "制芰荷以为衣兮, 集芙蓉以为裳.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不吾知其亦已兮, 苟余情其信芳.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "高余冠之岌岌兮, 长余佩之陆离.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "芳与泽其杂糅兮, 唯昭质其犹亏.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "忽反顾以游目兮, 将往观乎四荒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "佩缤纷其繁饰兮, 芳菲菲其弥章.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "民生各有所乐兮, 余独好修以为常.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虽体解吾犹未变兮, 岂余心之可惩?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "种树郭橐驼传": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "郭橐驼, 不知始何名.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "驼闻之, 曰:'甚善.名我固当.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "因舍其名, 亦自谓橐驼云.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其乡曰丰乐乡, 在长安西.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "他植者虽窥伺效慕, 莫能如也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "既然已, 勿动勿虑, 去不复顾.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其莳也若子, 其置也若弃, 则其天者全而其性得矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾又何能为哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问者曰:'以子之道, 移之官理, 可乎?'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "驼曰:'我知种树而已, 官理, 非吾业也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "'鸣鼓而聚之, 击木而召之.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故病且怠.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "若是, 则与吾业者其亦有类乎?'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "传其事以为官戒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "答司马谏议书": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "辟邪说, 难壬人, 不为拒谏.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "至于怨诽之多, 则固前知其如此也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "如曰今日当一切不事事, 守前所为而已, 则非某之所敢知.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "无由会晤, 不任区区向往之至!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "苏幕遮·燎沉香": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "燎沉香, 消溽暑": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鸟雀呼晴, 侵晓窥檐语": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "叶上初阳干宿雨, 水面清圆, 一一风荷举": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "故乡遥, 何日去?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "家住吴门, 久作长安旅": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "五月渔郎相忆否?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "小楫轻舟, 梦入芙蓉浦": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "菩萨蛮·书江西造口壁": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "郁孤台下清江水, 中间多少行人泪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "西北望长安, 可怜无数山.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "青山遮不住, 毕竟东流去.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "江晚正愁余, 山深闻鹧鸪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "菩萨蛮·小山重叠金明灭": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鬓云欲度香腮雪": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "懒起画蛾眉, 弄妆梳洗迟": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "照花前后镜, 花面交相映": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "新帖绣罗襦, 双双金鹧鸪": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虞美人": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "春花秋月何时了, 往事知多少.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "小楼昨夜又东风, 故国不堪回首月明中.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "雕阑玉砌应犹在, 只是朱颜改.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问君能有几多愁, 恰是一江春水向东流.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蜀相": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "丞相祠堂何处寻? 锦官城外柏森森.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "映阶碧草自春色, 隔叶黄鹂空好音.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "三顾频烦天下计, 两朝开济老臣心.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "出师未捷身先死, 长使英雄泪满襟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蜀道难": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "噫吁嚱, 危乎高哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蜀道之难, 难于上青天!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蚕丛及鱼凫, 开国何茫然!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "尔来四万八千岁, 不与秦塞通人烟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "西当太白有鸟道, 可以横绝峨眉巅.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "地崩山摧壮士死, 然后天梯石栈相钩连.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "上有六龙回日之高标, 下有冲波逆折之回川.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "黄鹤之飞尚不得过, 猿猱欲度愁攀援.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "青泥何盘盘, 百步九折萦岩峦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "扪参历井仰胁息, 以手抚膺坐长叹.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问君西游何时还? 畏途巉岩不可攀.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "但见悲鸟号古木, 雄飞雌从绕林间.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "又闻子规啼夜月, 愁空山.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蜀道之难, 难于上青天, 使人听此凋朱颜!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "连峰去天不盈尺, 枯松倒挂倚绝壁.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "飞湍瀑流争喧豗, 砯崖转石万壑雷.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其险也如此, 嗟尔远道之人胡为乎来哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "所守或匪亲, 化为狼与豺.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "锦城虽云乐, 不如早还家.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蜀道之难, 难于上青天, 侧身西望长咨嗟!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "论语·侍坐": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "子路、曾皙、冉有、公西华侍坐": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "夫子哂之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "求! 尔何如?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "赤! 尔何如?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "点! 尔何如?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "子曰: 何伤乎? 亦各言其志也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "夫子喟然叹曰: 吾与点也!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "子曰: 亦各言其志也已矣": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曰: 夫子何哂由也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "曰: 为国以礼, 其言不让, 是故哂之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "唯求则非邦也与?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "安见方六七十如五六十而非邦也者?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "唯赤则非邦也与?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "论语·学而八佾": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人而不仁, 如礼何? 人而不仁, 如乐何?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "朝闻道, 夕死可矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君子喻于义, 小人喻于利.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "见贤思齐焉, 见不贤而内自省也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "质胜文则野, 文胜质则史. 文质彬彬, 然后君子.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "知者不惑, 仁者不忧, 勇者不惧.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "有一言而可以终身行之者乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其'恕'乎! 己所不欲, 勿施于人.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谏太宗十思疏": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "有善始者实繁, 能克终者盖寡.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "竭诚则胡越为一体, 傲物则骨肉为行路.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "贺新郎·国脉微如缕": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "国脉微如缕": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "问长缨何时入手, 缚将戎主?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "未必人间无好汉, 谁与宽些尺度?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "试看取当年韩五": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "岂有谷城公付授, 也不干曾遇骊山母": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谈笑起, 两河路": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "少时棋柝曾联句": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "叹而今登楼揽镜, 事机频误": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "闻说北风吹面急, 边上冲梯屡舞": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君莫道投鞭虚语": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自古一贤能制难, 有金汤便可无张许?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "快投笔, 莫题柱": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "赤壁赋": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "清风徐来, 水波不兴": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "举酒属客, 诵明月之诗, 歌窈窕之章": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "少焉, 月出于东山之上, 徘徊于斗牛之间": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "白露横江, 水光接天": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "纵一苇之所如, 凌万顷之茫然": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "浩浩乎如冯虚御风, 而不知其所止": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "飘飘乎如遗世独立, 羽化而登仙": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "于是饮酒乐甚, 扣舷而歌之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "歌曰: '桂棹兮兰桨, 击空明兮溯流光'": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "渺渺兮予怀, 望美人兮天一方": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "客有吹洞箫者, 倚歌而和之": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其声呜呜然, 如怨如慕, 如泣如诉": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余音袅袅, 不绝如缕": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舞幽壑之潜蛟, 泣孤舟之嫠妇": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "苏子愀然, 正襟危坐而问客曰": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "何为其然也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "西望夏口, 东望武昌, 山川相缪, 郁乎苍苍": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此非孟德之困于周郎者乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "方其破荆州, 下江陵, 顺流而东也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "舳舻千里, 旌旗蔽空": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "酾酒临江, 横槊赋诗": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "固一世之雄也, 而今安在哉?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "驾一叶之扁舟, 举匏樽以相属": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "寄蜉蝣于天地, 渺沧海之一粟": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "哀吾生之须臾, 羡长江之无穷": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "挟飞仙以遨游, 抱明月而长终": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "知不可乎骤得, 托遗响于悲风": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "苏子曰: '客亦知夫水与月乎?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "逝者如斯, 而未尝往也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盈虚者如彼, 而卒莫消长也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盖将自其变者而观之, 则天地曾不能以一瞬": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自其不变者而观之, 则物与我皆无尽也": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而又何羡乎!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "且夫天地之间, 物各有主": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "苟非吾之所有, 虽一毫而莫取": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "惟江上之清风, 与山间之明月": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "耳得之而为声, 目遇之而成色": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "取之无禁, 用之不竭": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "是造物者之无尽藏也, 而吾与子之所共适": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "客喜而笑, 洗盏更酌": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "肴核既尽, 杯盘狼籍": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "相与枕藉乎舟中, 不知东方之既白": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "过秦论": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "秦孝公据崤函之固, 拥雍州之地,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "君臣固守以窥周室,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "当是时也, 商君佐之,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "内立法度, 务耕织, 修守战之具,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "外连衡而斗诸侯.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "于是秦人拱手而取西河之外.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "孝公既没, 惠文、武、昭襄蒙故业, 因遗策,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "诸侯恐惧, 会盟而谋弱秦,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "不爱珍器重宝肥饶之地, 以致天下之士,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "合从缔交, 相与为一.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "尝以十倍之地, 百万之众, 叩关而攻秦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "秦人开关延敌, 九国之师, 逡巡而不敢进.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "秦无亡矢遗镞之费, 而天下诸侯已困矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "于是从散约败, 争割地而赂秦.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "因利乘便, 宰割天下, 分裂山河.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "强国请服, 弱国入朝.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "延及孝文王、庄襄王, 享国之日浅, 国家无事.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "及至始皇, 奋六世之余烈, 振长策而御宇内,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吞二周而亡诸侯, 履至尊而制六合,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "执敲扑而鞭笞天下, 威振四海.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "南取百越之地, 以为桂林、象郡; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "百越之君, 俯首系颈, 委命下吏.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "胡人不敢南下而牧马, 士不敢弯弓而报怨.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "于是废先王之道, 焚百家之言, 以愚黔首; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "隳名城, 杀豪杰; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然后践华为城, 因河为池,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "据亿丈之城, 临不测之渊, 以为固.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "良将劲弩守要害之处, 信臣精卒陈利兵而谁何.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "始皇既没, 余威震于殊俗.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蹑足行伍之间, 而倔起阡陌之中,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "率疲弊之卒, 将数百之众, 转而攻秦; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "斩木为兵, 揭竿为旗,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "天下云集响应, 赢粮而景从.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "山东豪俊遂并起而亡秦族矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "且夫天下非小弱也, 雍州之地, 崤函之固, 自若也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "锄櫌棘矜, 非铦于钩戟长铩也; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谪戍之众, 非抗于九国之师也; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "深谋远虑, 行军用兵之道, 非及乡时之士也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然而成败异变, 功业相反, 何也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "试使山东之国与陈涉度长絜大, 比权量力,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "则不可同年而语矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然后以六合为家, 崤函为宫; ": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "仁义不施而攻守之势异也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "锦瑟": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "锦瑟无端五十弦, 一弦一柱思华年.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "庄生晓梦迷蝴蝶, 望帝春心托杜鹃.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "沧海月明珠有泪, 蓝田日暖玉生烟.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此情可待成追忆, 只是当时已惘然.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "长亭送别": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "碧云天, 黄花地, 西风紧, 北雁南飞.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "晓来谁染霜林醉? 总是离人泪.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "阿房宫赋": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "六王毕, 四海一, 蜀山兀, 阿房出.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "覆压三百余里, 隔离天日.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "骊山北构而西折, 直走咸阳.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "二川溶溶, 流入宫墙.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "长桥卧波, 未云何龙?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "复道行空, 不霁何虹?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "高低冥迷, 不知西东.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "一日之内, 一宫之间, 而气候不齐.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "明星荧荧, 开妆镜也;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "绿云扰扰, 梳晓鬟也;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "渭流涨腻, 弃脂水也;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "烟斜雾横, 焚椒兰也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "一肌一容, 尽态极妍, 缦立远视, 而望幸焉.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "有不得见者, 三十六年.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "使负栋之柱, 多于南亩之农夫;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "架梁之椽, 多于机上之工女;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "钉头磷磷, 多于在庾之粟粒;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "瓦缝参差, 多于周身之帛缕;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "直栏横槛, 多于九土之城郭;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "管弦呕哑, 多于市人之言语.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "使天下之人, 不敢言而敢怒.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "独夫之心, 日益骄固.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "戍卒叫, 函谷举, 楚人一炬, 可怜焦土!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "灭六国者六国也, 非秦也; 族秦者秦也, 非天下也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "嗟乎! 使六国各爱其人, 则足以拒秦;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "使秦复爱六国之人, 则递三世可至万世而为君,": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "谁得而族灭也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "秦人不暇自哀, 而后人哀之;": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "后人哀之而不鉴之, 亦使后人而复哀后人也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "陈情表": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣密言: 臣以险衅, 夙遭闵凶.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "生孩六月, 慈父见背; 行年四岁, 舅夺母志.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "祖母刘愍臣孤弱, 躬亲抚养.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣少多疾病, 九岁不行, 零丁孤苦, 至于成立.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "逮奉圣朝, 沐浴清化.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣以供养无主, 辞不赴命.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "猥以微贱, 当侍东宫, 非臣陨首所能上报.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣具以表闻, 辞不就职.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣之进退, 实为狼狈.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣无祖母, 无以至今日, 祖母无臣, 无以终余年.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "母孙二人, 更相为命, 是以区区不能废远.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "乌鸟私情, 愿乞终养.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣生当陨首, 死当结草.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "臣不胜犬马怖惧之情, 谨拜表以闻.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "青玉案·元夕": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "东风夜放花千树, 更吹落、星如雨": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "宝马雕车香满路": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "凤箫声动, 玉壶光转, 一夜鱼龙舞": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蛾儿雪柳黄金缕, 笑语盈盈暗香去": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "众里寻他千百度": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "蓦然回首, 那人却在, 灯火阑珊处": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "静女": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "静女其娈, 贻我彤管. 彤管有炜, 说怿女美.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "自牧归荑, 洵美且异. 匪女之为美, 美人之贻.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "项脊轩志": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "项脊轩, 旧南阁子也.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "室仅方丈, 可容一人居.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "又北向, 不能得日, 日过午已昏.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余稍为修葺, 使不上漏.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "然余居于此, 多可喜, 亦多可悲.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "先是庭中通南北为一.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "迨诸父异爨, 内外多置小门墙, 往往而是.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "东犬西吠, 客逾庖而宴, 鸡栖于厅.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "庭中始为篱, 已为墙, 凡再变矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "家有老妪, 尝居于此.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "妪, 先大母婢也, 乳二世, 先妣抚之甚厚.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "室西连于中闺, 先妣尝一至.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余自束发读书轩中, 一日, 大母过余曰:": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "比去, 以手阖门, 自语曰:": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾家读书久不效, 儿之成, 则可待乎!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "顷之, 持一象笏至, 曰:": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "此吾祖太常公宣德间执此以朝, 他日汝当用之!": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "瞻顾遗迹, 如在昨日, 令人长号不自禁.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余扃牖而居, 久之, 能以足音辨人.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "轩凡四遭火, 得不焚, 殆有神护者.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "吾妻归宁, 述诸小妹语曰:": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "闻姊家有阁子, 且何谓阁子也?": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "其后六年, 吾妻死, 室坏不修.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "鹊桥仙": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "纤云弄巧, 飞星传恨, 银汉迢迢暗度.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "金风玉露一相逢, 便胜却人间无数.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "柔情似水, 佳期如梦, 忍顾鹊桥归路.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - }, - "两情若是久长时, 又岂在朝朝暮暮.": { - "SM-2": { - "efactor": 2.5, - "real_rept": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1776527865.8334022 - } - } -} \ No newline at end of file +{} diff --git a/data/repo/cngk-t/manifest.toml b/data/repo/cngk-t/manifest.toml index 95a8a4a..d914da1 100644 --- a/data/repo/cngk-t/manifest.toml +++ b/data/repo/cngk-t/manifest.toml @@ -1,4 +1,4 @@ -title = "高考必背古诗文-0" -package = "cngk-0" +title = "高考必背古诗文-筛选" +package = "cngk-t" author = "__heurams__" desc = "高考古诗文 60 篇" diff --git a/examples/repo.ipynb b/examples/repo.ipynb deleted file mode 100644 index db08ff7..0000000 --- a/examples/repo.ipynb +++ /dev/null @@ -1,764 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "51b89355", - "metadata": {}, - "source": [ - "# 演练场\n", - "此笔记本将带你了解 repomgr 与 particles 对象相关操作 \n", - "此笔记本内含的系统命令默认仅存在于 Linux 操作系统, 如果你使用 Windows, 请在安装 busybox 或 cygwin 或 WSL 的环境下执行此笔记本" - ] - }, - { - "cell_type": "markdown", - "id": "f5c49014", - "metadata": {}, - "source": [ - "# 从一个例子开始\n", - "## 了解文件结构\n", - "了解一下文件结构" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "a5ed9864", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[01;34m.\u001b[0m\n", - "├── \u001b[01;34mdata\u001b[0m\n", - "│   └── \u001b[01;34mconfig\u001b[0m\n", - "│   └── \u001b[00mconfig.toml\u001b[0m\n", - "├── \u001b[00mjiebatest.py\u001b[0m\n", - "├── \u001b[00mrepo.ipynb\u001b[0m\n", - "├── \u001b[00msimplemem.py\u001b[0m\n", - "└── \u001b[01;34mtest_repo\u001b[0m\n", - " ├── \u001b[00malgodata.json\u001b[0m\n", - " ├── \u001b[00mmanifest.toml\u001b[0m\n", - " ├── \u001b[00mpayload.toml\u001b[0m\n", - " ├── \u001b[00mschedule.toml\u001b[0m\n", - " └── \u001b[00mtypedef.toml\u001b[0m\n", - "\n", - "4 directories, 9 files\n" - ] - } - ], - "source": [ - "!tree # 了解文件结构" - ] - }, - { - "cell_type": "markdown", - "id": "4e10922b", - "metadata": {}, - "source": [ - "如果你先前运行了单元格, 请运行下面一格清理." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "9777730e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "zsh:1: no matches found: heurams.log*\n" - ] - } - ], - "source": [ - "!rm -rf test_new_repo\n", - "!rm -rf heurams.log*" - ] - }, - { - "cell_type": "markdown", - "id": "058c098f", - "metadata": {}, - "source": [ - "## 导入模块\n", - "导入所需模块, 你会看到欢迎信息, 标示了库所使用的配置. \n", - "HeurAMS 在基础设施也使用配置文件实现隐式的依赖注入. " - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "bf1b00c8", - "metadata": {}, - "outputs": [], - "source": [ - "import heurams.kernel.repolib as repolib # 这是 RepoLib 子模块, 用于管理和结构化 repo(中文含义: 仓库) 数据结构与本地文件间的联系\n", - "import heurams.kernel.particles as pt # 这是 Particles(中文含义: 粒子) 子模块, 用于运行时的记忆管理操作\n", - "from pathlib import (\n", - " Path,\n", - ") # 这是 Python 的 Pathlib 模块, 用于表示文件路径, 在整个项目中, 都使用此模块表示路径" - ] - }, - { - "cell_type": "markdown", - "id": "ea1f68bb", - "metadata": {}, - "source": [ - "## 运行时检查\n", - "如你所见, repo 在文件系统内存储为一个文件夹. \n", - "因此在载入之前, 首先要检查这是否是一个合乎标准的 repo 文件夹. " - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "897b62d7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "这是一个 合规 的 repo!\n" - ] - } - ], - "source": [ - "is_vaild = repolib.Repo.check_repodir(Path(\"./test_repo\"))\n", - "print(f\"这是一个 {'合规' if is_vaild else '不合规'} 的 repo!\")" - ] - }, - { - "cell_type": "markdown", - "id": "24a19991", - "metadata": {}, - "source": [ - "## 加载仓库\n", - "接下来, 正式加载 repo." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "708ae7e4", - "metadata": {}, - "outputs": [], - "source": [ - "test_repo = repolib.Repo.create_from_repodir(Path(\"./test_repo\"))" - ] - }, - { - "cell_type": "markdown", - "id": "474f8eb7", - "metadata": {}, - "source": [ - "## 导出为字典\n", - "作为一个数据容器, repo 相应地建立了导入和导出的功能. \n", - "我们刚刚从本地文件夹导入了一个 repo. \n", - "现在试试导出为一个字典." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "a11115fb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'algodata': [('秦孝公据崤函之固, 拥雍州之地,', {}), ('君臣固守以窥周室,', {})],\n", - " 'manifest': {'author': '__heurams__',\n", - " 'desc': '高考古诗文: 过秦论',\n", - " 'title': '测试单元: 过秦论'},\n", - " 'payload': [('秦孝公据崤函之固, 拥雍州之地,',\n", - " {'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", - " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", - " 'note': [],\n", - " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'}),\n", - " ('君臣固守以窥周室,',\n", - " {'content': '君臣/固守/以窥/周室,/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'})],\n", - " 'schedule': {'phases': {'final_review': [['FillBlank', '0.7'],\n", - " ['SelectMeaning', '0.7'],\n", - " ['Recognition', '1.0']],\n", - " 'quick_review': [['FillBlank', '1.0'],\n", - " ['SelectMeaning', '0.5'],\n", - " ['Recognition', '1.0']],\n", - " 'recognition': [['Recognition', '1.0']]},\n", - " 'schedule': ['quick_review', 'recognition', 'final_review']},\n", - " 'source': PosixPath('test_repo'),\n", - " 'typedef': {'annotation': {'content': '内容',\n", - " 'delimiter': '分隔符',\n", - " 'keyword_note': '关键词翻译',\n", - " 'note': '笔记',\n", - " 'translation': '语句翻译',\n", - " 'tts_text': '文本转语音文本'},\n", - " 'common': {'delimiter': '/',\n", - " 'puzzles': {'FillBlank': {'__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': \"eval:nucleon['delimiter']\",\n", - " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", - " 'text': \"eval:payload['content']\"},\n", - " 'Recognition': {'__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': \"eval:payload['content']\",\n", - " 'secondary': [\"eval:payload['keyword_note']\",\n", - " \"eval:payload['note']\"],\n", - " 'top_dim': [\"eval:payload['translation']\"]},\n", - " 'SelectMeaning': {'__hint__': \"eval:payload['content']\",\n", - " '__origin__': 'mcq',\n", - " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", - " 'mapping': \"eval:payload['keyword_note']\",\n", - " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': \"eval:payload['content']\"}},\n", - " 'tts_text': \"eval:payload['content'].replace('/', \"\n", - " \"'')\"}}}\n" - ] - } - ], - "source": [ - "test_repo_dic = test_repo.export_to_single_dict()\n", - "from pprint import pprint\n", - "\n", - "pprint(test_repo_dic)" - ] - }, - { - "cell_type": "markdown", - "id": "35a2e06f", - "metadata": {}, - "source": [ - "## 持久化与部分保存\n", - "如你所见, 所有内容被结构化地输出了! \n", - "\n", - "现在写回到文件夹! \n", - "\n", - "我们注意到, 并非所有的内容都要被修改. \n", - "我们可以只保存接受修改的一部分, 默认情况下, 是迭代的记忆数据(algodata). \n", - "这就是为什么我们一般不使用单个 json 或 toml 来存储 repo.\n", - "\n", - "persist_to_repodir 接受两个可选参数: \n", - "- save_list: 默认为 [\"algodata\"], 是要持久化的数据.\n", - "- source: 默认为原目录, 你也可以手动指定为其他文件夹(通过 Path)\n", - "\n", - "现在做一些演练, 我们将创建一个位于 test_new_repo 的\"克隆\". \n", - "除非文件夹已经存在, Repo 对象将会为你自动创建新文件夹." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "05eeaacc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[01;34m.\u001b[0m\n", - "├── \u001b[01;34mdata\u001b[0m\n", - "│   └── \u001b[01;34mconfig\u001b[0m\n", - "│   └── \u001b[00mconfig.toml\u001b[0m\n", - "├── \u001b[00mjiebatest.py\u001b[0m\n", - "├── \u001b[00mrepo.ipynb\u001b[0m\n", - "├── \u001b[00msimplemem.py\u001b[0m\n", - "├── \u001b[01;34mtest_new_repo\u001b[0m\n", - "│   ├── \u001b[00malgodata.json\u001b[0m\n", - "│   ├── \u001b[00mmanifest.toml\u001b[0m\n", - "│   ├── \u001b[00mpayload.toml\u001b[0m\n", - "│   ├── \u001b[00mschedule.toml\u001b[0m\n", - "│   └── \u001b[00mtypedef.toml\u001b[0m\n", - "└── \u001b[01;34mtest_repo\u001b[0m\n", - " ├── \u001b[00malgodata.json\u001b[0m\n", - " ├── \u001b[00mmanifest.toml\u001b[0m\n", - " ├── \u001b[00mpayload.toml\u001b[0m\n", - " ├── \u001b[00mschedule.toml\u001b[0m\n", - " └── \u001b[00mtypedef.toml\u001b[0m\n", - "\n", - "5 directories, 14 files\n" - ] - } - ], - "source": [ - "test_repo.persist_to_repodir(\n", - " save_list=[\"schedule\", \"payload\", \"manifest\", \"typedef\", \"algodata\"],\n", - " source=Path(\"test_new_repo\"),\n", - ")\n", - "!tree" - ] - }, - { - "cell_type": "markdown", - "id": "059d7bdf", - "metadata": {}, - "source": [ - "如你所见, test_new_repo 已被生成!" - ] - }, - { - "cell_type": "markdown", - "id": "4ef8925c", - "metadata": {}, - "source": [ - "# 数据结构\n", - "现在讲解 repo 的数据结构" - ] - }, - { - "cell_type": "markdown", - "id": "c19fed95", - "metadata": {}, - "source": [ - "## Lict 对象\n", - "Lict 对象集成了部分列表和字典的功能, 数据在这两种风格的 API 间都可用, 且修改是同步的. \n", - "Lict 默认情况下不会保存序列顺序, 而是在列表形式下, 自动按索引字符序排布, 详情请参阅源代码. \n", - "现在导入并初始化一个 Lict 对象:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "7e88bd7c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n", - "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n" - ] - } - ], - "source": [ - "from heurams.kernel.auxiliary.lict import Lict\n", - "\n", - "lct = Lict() # 空的\n", - "lct = Lict(initlist=[(\"name\", \"tom\"), (\"age\", 12), (\"enemy\", \"jerry\")]) # 基于列表\n", - "print(lct)\n", - "lct = Lict(initdict={\"name\": \"tom\", \"age\": 12, \"enemy\": \"jerry\"}) # 基于字典\n", - "print(lct)" - ] - }, - { - "cell_type": "markdown", - "id": "4d760bf9", - "metadata": {}, - "source": [ - "### 输出形式\n", - "Lict 的\"官方\"输出形式是列表形式\n", - "你也可以选择输出字典形式" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "248f6cba", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'name': 'tom', 'age': 12, 'enemy': 'jerry'}\n" - ] - } - ], - "source": [ - "print(lct.dicted_data)" - ] - }, - { - "cell_type": "markdown", - "id": "29dce184", - "metadata": {}, - "source": [ - "### dicted_data 属性与修改方式\n", - "dicted_data 属性是一个字典, 它自动同步来自 Lict 对象操作的修改.\n", - "一个注意事项: 不要直接修改 dicted_data, 这将不会触发同步 hook.\n", - "如果你一定要这样做, 请在完事后手动运行同步 hook.\n", - "推荐的修改方式是直接把 lct 当作一个字典" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "a0eb07a7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('name', 'tom'), ('age', 12), ('enemy', 'jerry')]\n", - "[('name', 'tom'), ('age', 12), ('enemy', 'jerry'), ('type', 'cat')]\n", - "[('name', 'tom'), ('age', 12), ('enemy', 'jerry'), ('type', 'cat'), ('is_human', False)]\n" - ] - } - ], - "source": [ - "# 由于 jupyter 的环境处理, 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", - "\n", - "# 错误的方式\n", - "lct.dicted_data[\"type\"] = \"cat\"\n", - "print(lct) # 将不会同步修改\n", - "\n", - "# 不推荐, 但可用的方式\n", - "lct.dicted_data[\"type\"] = \"cat\"\n", - "lct._sync_based_on_dict()\n", - "print(lct)\n", - "\n", - "# 推荐方式\n", - "lct[\"is_human\"] = False\n", - "print(lct)" - ] - }, - { - "cell_type": "markdown", - "id": "2337d113", - "metadata": {}, - "source": [ - "### data 属性与修改方式\n", - "data 属性是一个列表, 它自动同步来自 Lict 对象操作的修改.\n", - "一个注意事项: 不要直接修改 data, 这将不会触发同步 hook, 并且可能破坏排序.\n", - "如果你一定要这样做, 请在完事后手动运行同步 hook 和 sort, 此处不演示.\n", - "推荐的修改方式是直接把 lct 当作一个列表, 且避免使用索引修改" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0ab442d4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'name': 'tom', 'age': 12, 'enemy': 'jerry', 'type': 'cat', 'is_human': False, 'enemy_2': 'spike'}\n" - ] - } - ], - "source": [ - "# 由于 Jupyter 的环境处理(环境状态会累积), 请不要重复运行此单元格, 如果想再看一遍, 请重启 jupyter 后再全部运行\n", - "\n", - "# 唯一推荐方式\n", - "lct.append((\"enemy_2\", \"spike\"))\n", - "print(lct.dicted_data)" - ] - }, - { - "cell_type": "markdown", - "id": "a3383f59", - "metadata": {}, - "source": [ - "### 多面手\n", - "Lict 有一些很酷的功能\n", - "详情请看源文件\n", - "此处是一些例子" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "f3ca752f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat'), ('enemy_2', 'spike')]\n", - "{'age': 12, 'enemy': 'jerry', 'is_human': False, 'name': 'tom', 'type': 'cat', 'enemy_2': 'spike'}\n", - "------\n", - "('age', 12)\n", - "('enemy', 'jerry')\n", - "('is_human', False)\n", - "('name', 'tom')\n", - "('type', 'cat')\n", - "('enemy_2', 'spike')\n", - "6\n", - "('enemy_2', 'spike')\n", - "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom'), ('type', 'cat')]\n", - "('type', 'cat')\n", - "[('age', 12), ('enemy', 'jerry'), ('is_human', False), ('name', 'tom')]\n", - "('name', 'tom')\n", - "[('age', 12), ('enemy', 'jerry'), ('is_human', False)]\n", - "('is_human', False)\n", - "[('age', 12), ('enemy', 'jerry')]\n", - "('enemy', 'jerry')\n", - "[('age', 12)]\n", - "('age', 12)\n", - "[]\n" - ] - }, - { - "data": { - "text/plain": [ - "Ellipsis" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lct = Lict(\n", - " initdict={\n", - " \"age\": 12,\n", - " \"enemy\": \"jerry\",\n", - " \"is_human\": False,\n", - " \"name\": \"tom\",\n", - " \"type\": \"cat\",\n", - " \"enemy_2\": \"spike\",\n", - " }\n", - ")\n", - "print(lct)\n", - "print(lct.dicted_data)\n", - "print(\"------\")\n", - "for i in lct:\n", - " print(i)\n", - "print(len(lct))\n", - "while len(lct) > 0:\n", - " print(lct.pop())\n", - " print(lct)\n", - "lct = Lict(\n", - " initdict={\n", - " \"age\": 12,\n", - " \"enemy\": \"jerry\",\n", - " \"is_human\": False,\n", - " \"name\": \"tom\",\n", - " \"type\": \"cat\",\n", - " \"enemy_2\": \"spike\",\n", - " }\n", - ")\n", - "..." - ] - }, - { - "cell_type": "markdown", - "id": "2d6d3483", - "metadata": {}, - "source": [ - "关爱环境 从你我做起" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "773bf99c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "zsh:1: no matches found: heurams.log*\n" - ] - } - ], - "source": [ - "!rm -rf test_new_repo\n", - "!rm -rf heurams.log*" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "8645c5a2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", - " 'delimiter': '/',\n", - " 'keyword_note': {'崤函': '崤山和函谷关', '据': '占据', '雍州': '古代九州之一'},\n", - " 'note': [],\n", - " 'puzzles': { 'FillBlank': { '__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': '/',\n", - " 'min_denominator': 3,\n", - " 'text': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/'},\n", - " 'Recognition': { '__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", - " 'secondary': [ { '崤函': '崤山和函谷关',\n", - " '据': '占据',\n", - " '雍州': '古代九州之一'},\n", - " []],\n", - " 'top_dim': [ '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,']},\n", - " 'SelectMeaning': { '__hint__': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", - " '__origin__': 'mcq',\n", - " 'jammer': ['占据', '崤山和函谷关', '古代九州之一'],\n", - " 'mapping': { '崤函': '崤山和函谷关',\n", - " '据': '占据',\n", - " '雍州': '古代九州之一'},\n", - " 'max_riddles_num': 2,\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/'}},\n", - " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,',\n", - " 'tts_text': '秦孝公据崤函之固, 拥雍州之地,'}\n", - "{ 'SM-2': { 'efactor': 2.5,\n", - " 'interval': 1,\n", - " 'is_activated': 1,\n", - " 'last_date': 20459,\n", - " 'last_modify': 1767700296.4950516,\n", - " 'next_date': 20460,\n", - " 'real_rept': 1,\n", - " 'rept': 0}}\n", - "{ 'content': '君臣/固守/以窥/周室,/',\n", - " 'delimiter': '/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'puzzles': { 'FillBlank': { '__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': '/',\n", - " 'min_denominator': 3,\n", - " 'text': '君臣/固守/以窥/周室,/'},\n", - " 'Recognition': { '__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': '君臣/固守/以窥/周室,/',\n", - " 'secondary': [{'窥': '窥视'}, []],\n", - " 'top_dim': ['君臣牢固地守卫着,借以窥视周王室的权力,']},\n", - " 'SelectMeaning': { '__hint__': '君臣/固守/以窥/周室,/',\n", - " '__origin__': 'mcq',\n", - " 'jammer': ['窥视'],\n", - " 'mapping': {'窥': '窥视'},\n", - " 'max_riddles_num': 2,\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': '君臣/固守/以窥/周室,/'}},\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,',\n", - " 'tts_text': '君臣固守以窥周室,'}\n", - "{ 'SM-2': { 'efactor': 2.5,\n", - " 'interval': 1,\n", - " 'is_activated': 1,\n", - " 'last_date': 20459,\n", - " 'last_modify': 1767700296.4968777,\n", - " 'next_date': 20460,\n", - " 'real_rept': 1,\n", - " 'rept': 0}}\n", - "{ 'algodata': [ ( '秦孝公据崤函之固, 拥雍州之地,',\n", - " { 'SM-2': { 'efactor': 2.5,\n", - " 'interval': 1,\n", - " 'is_activated': 1,\n", - " 'last_date': 20459,\n", - " 'last_modify': 1767700296.4950516,\n", - " 'next_date': 20460,\n", - " 'real_rept': 1,\n", - " 'rept': 0}}),\n", - " ( '君臣固守以窥周室,',\n", - " { 'SM-2': { 'efactor': 2.5,\n", - " 'interval': 1,\n", - " 'is_activated': 1,\n", - " 'last_date': 20459,\n", - " 'last_modify': 1767700296.4968777,\n", - " 'next_date': 20460,\n", - " 'real_rept': 1,\n", - " 'rept': 0}})],\n", - " 'manifest': { 'author': '__heurams__',\n", - " 'desc': '高考古诗文: 过秦论',\n", - " 'title': '测试单元: 过秦论'},\n", - " 'payload': [ ( '秦孝公据崤函之固, 拥雍州之地,',\n", - " { 'content': '秦孝公/据/崤函/之固/, 拥/雍州/之地,/',\n", - " 'keyword_note': { '崤函': '崤山和函谷关',\n", - " '据': '占据',\n", - " '雍州': '古代九州之一'},\n", - " 'note': [],\n", - " 'translation': '秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地,'}),\n", - " ( '君臣固守以窥周室,',\n", - " { 'content': '君臣/固守/以窥/周室,/',\n", - " 'keyword_note': {'窥': '窥视'},\n", - " 'note': [],\n", - " 'translation': '君臣牢固地守卫着,借以窥视周王室的权力,'})],\n", - " 'schedule': { 'phases': { 'final_review': [ ['FillBlank', '0.7'],\n", - " ['SelectMeaning', '0.7'],\n", - " ['Recognition', '1.0']],\n", - " 'quick_review': [ ['FillBlank', '1.0'],\n", - " ['SelectMeaning', '0.5'],\n", - " ['Recognition', '1.0']],\n", - " 'recognition': [['Recognition', '1.0']]},\n", - " 'schedule': [ 'quick_review',\n", - " 'recognition',\n", - " 'final_review']},\n", - " 'source': PosixPath('test_repo'),\n", - " 'typedef': { 'annotation': { 'content': '内容',\n", - " 'delimiter': '分隔符',\n", - " 'keyword_note': '关键词翻译',\n", - " 'note': '笔记',\n", - " 'translation': '语句翻译',\n", - " 'tts_text': '文本转语音文本'},\n", - " 'common': { 'delimiter': '/',\n", - " 'puzzles': { 'FillBlank': { '__hint__': '',\n", - " '__origin__': 'cloze',\n", - " 'delimiter': \"eval:nucleon['delimiter']\",\n", - " 'min_denominator': \"eval:default['cloze']['min_denominator']\",\n", - " 'text': \"eval:payload['content']\"},\n", - " 'Recognition': { '__hint__': '',\n", - " '__origin__': 'recognition',\n", - " 'primary': \"eval:payload['content']\",\n", - " 'secondary': [ \"eval:payload['keyword_note']\",\n", - " \"eval:payload['note']\"],\n", - " 'top_dim': [ \"eval:payload['translation']\"]},\n", - " 'SelectMeaning': { '__hint__': \"eval:payload['content']\",\n", - " '__origin__': 'mcq',\n", - " 'jammer': \"eval:list(payload['keyword_note'].values())\",\n", - " 'mapping': \"eval:payload['keyword_note']\",\n", - " 'max_riddles_num': \"eval:default['mcq']['max_riddles_num']\",\n", - " 'prefix': '选择正确项: ',\n", - " 'primary': \"eval:payload['content']\"}},\n", - " 'tts_text': \"eval:payload['content'].replace('/', \"\n", - " \"'')\"}}}\n" - ] - } - ], - "source": [ - "repo = repolib.Repo.create_from_repodir(Path(\"./test_repo\"))\n", - "for i in repo.ident_index:\n", - " n = pt.Nucleon.create_on_nucleonic_data(\n", - " nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)\n", - " )\n", - " e = pt.Electron.create_on_electonic_data(\n", - " electronic_data=repo.electronic_data_lict.get_itemic_unit(i)\n", - " )\n", - " e.activate()\n", - " e.revisor(5, True)\n", - " print(repr(n))\n", - " print(repr(e))\n", - "print(repo)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/simplemem.py b/examples/simplemem.py deleted file mode 100644 index f1ee28a..0000000 --- a/examples/simplemem.py +++ /dev/null @@ -1,56 +0,0 @@ -import time -from pathlib import Path - -import heurams.kernel.particles as pt -import heurams.kernel.repolib as repolib -from heurams.services.textproc import truncate - -repo = repolib.Repo.from_repodir(Path("./test_repo")) -alist = list() -print(repo.ident_index) -for i in repo.ident_index: - n = pt.Nucleon.from_data(nucleonic_data=repo.nucleonic_data_lict.get_itemic_unit(i)) - e = pt.Electron.from_data( - electronic_data=repo.electronic_data_lict.get_itemic_unit(i), - algo_name=repo.config["algorithm"], - ) - print(n) - input() - a = pt.Atom(n, e, repo.orbitic_data) - alist.append(a) - # e.activate() - # e.revisor(5, True) - print(repr(a)) - # print(repr(e)) -print(repo) -input() -import heurams.kernel.reactor as rt - -ph: rt.Phaser = rt.Phaser(alist) -print(ph) -pr: rt.Procession = ph.current_procession() # type: ignore -print(pr) -pr.forward() -print(pr) -pr.forward() # 如果过界了? -print(pr) # 静默设置状态 无报错 -pr.forward() -print(pr) -pr = ph.current_procession() # type: ignore # 下一个队列 -print(pr) -pr.forward() -print(pr) -pr.append() # 如果记忆失败了? -print(pr) -pr.forward() -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -pr.append() # 如果记忆失败了? -# 重复项目只会占据一个车尾 -print(pr) -pr.forward() -print(pr) -pr = ph.current_procession() # type: ignore -print(pr) diff --git a/src/heurams/context.py b/src/heurams/context.py index b0e008d..f8d36f8 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -51,4 +51,4 @@ class ConfigContext: return self def __exit__(self, exc_type, exc_val, exc_tb): - config_var.reset(self._token) # type: ignore + config_var.reset(self._token) # type: ignore \ No newline at end of file diff --git a/src/heurams/interface/css/screens/dashboard.tcss b/src/heurams/interface/css/screens/dashboard.tcss index b59dfa9..67ec699 100644 --- a/src/heurams/interface/css/screens/dashboard.tcss +++ b/src/heurams/interface/css/screens/dashboard.tcss @@ -6,6 +6,11 @@ height: 3; } +#analysis { + margin: 0; + padding: 0; +} + .repo-list-item { layout: grid; grid-size: 1; diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index b27e359..d8170a2 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -19,8 +19,9 @@ import sys class AboutScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), + ("z", "go_back", "关于"), ] - + SUB_TITLE = "关于" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index d6cb560..8a3e550 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -6,7 +6,7 @@ from pathlib import Path from textual.app import ComposeResult from textual.containers import ScrollableContainer, Horizontal, Vertical from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Markdown from textual import events, on from textual.reactive import reactive @@ -74,10 +74,11 @@ class DashboardScreen(Screen): ), id="header", ) - yield ListView(id="repo_list", classes="repo-list") # 单元集选择 - + from heurams.services.attic import Attic + a = Attic('ana', {'totaltime': 0, 'openpuzzles': 0, 'puzzles_err': 0}) yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 + yield Label(f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + '个/s'}", id='analysis') # 版本信息 yield Footer() @on(events.ScreenResume) @@ -201,6 +202,5 @@ class DashboardScreen(Screen): logger.debug(f"event.button.id: {event.button.id}") if event.button.id.startswith("slaunch_repo_"): # type: ignore from .preparation import launch - - launch(repo=self.repolink[event.button.id.lstrip("slaunch_repo_")], app=self.app, scheduled_num=-1) # type: ignore + launch(repo=self.repolink[event.button.id.removeprefix("slaunch_repo_")], app=self.app, scheduled_num=-1) # type: ignore # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index b99c43b..3905ab4 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -16,12 +16,10 @@ from heurams.kernel.reactor import * from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger - from .. import shim logger = get_logger(__name__) - class MemScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), @@ -29,6 +27,7 @@ class MemScreen(Screen): ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("*", "toggle_favorite", "收藏"), + ("r", "resume_mark"), ("n", "block_prompt"), ("s", "block_prompt"), ("z", "block_prompt"), @@ -60,10 +59,13 @@ class MemScreen(Screen): @on(events.ScreenResume) def post_active(self, event): from heurams.interface import shim - shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: + import time + from heurams.services.attic import Attic + a = Attic('ana', {'openqueue': 0}) + a.data['openqueue'] += 1 if config_var.get()['interface']['global']['show_header']: yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(): @@ -78,6 +80,10 @@ class MemScreen(Screen): def on_mount(self): self.expander = self.procession.get_expander() + from heurams.services.attic import Attic + import time + a = Attic('ana', {'last': time.time()}) + a.data['last'] = time.time() self.mount_puzzle() self.update_display() @@ -107,6 +113,7 @@ class MemScreen(Screen): def mount_puzzle(self): """挂载当前谜题组件""" + from heurams.services.attic import Attic if self.procession.route == RouterState.FINISHED: self.mount_finished_widget() return @@ -117,6 +124,8 @@ class MemScreen(Screen): def mount_finished_widget(self): """挂载已完成组件""" + a = Attic('ana', {'finished': 0}) + a.data['finished'] += 1 container = self.query_one("#puzzle_container") for i in container.children: i.remove() @@ -168,6 +177,13 @@ class MemScreen(Screen): if self.expander.state == "retronly": self.forward_atom(self.expander.get_quality()) self.update_state() + from heurams.services.attic import Attic + a = Attic('ana', {'openpuzzles': 0}) + a = Attic('ana', {'totaltime': 0}) + a.data['openpuzzles'] += 1 + import time + a.data['totaltime'] += time.time() - a.data['last'] + a.data['last'] = time.time() self.mount_puzzle() self.update_display() @@ -187,6 +203,8 @@ class MemScreen(Screen): logger.debug(f"Quality: {quality}") self.atom_reporter(quality) if quality <= 3: + a = Attic('ana', {'puzzles_err': 0}) + a.data['puzzles_err'] += 1 self.procession.append() self.update_state() # 刷新状态 self.procession.forward(1) @@ -241,3 +259,11 @@ class MemScreen(Screen): def action_block_prompt(self): self.app.notify("功能在记忆界面中不可用, 完成或返回后再试", severity="error") + + def action_resume_mark(self): + from heurams.services.attic import Attic + import time + a = Attic('ana') + l = a.data['last'] + a.data['last'] = time.time() + self.app.notify(f"时间恢复已修正: {l} -> {a.data['last']}") \ No newline at end of file diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 27d3ffc..873cb56 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -51,7 +51,9 @@ class PreparationScreen(Screen): shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: - + from heurams.services.attic import Attic + a = Attic('ana', {'openpre': 0}) + a.data['openpre'] += 1 if config_var.get()['interface']['global']['show_header']: yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) with ScrollableContainer(id="main_container"): diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index facd17c..387a0c4 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -32,6 +32,7 @@ class SettingScreen(Screen): SUB_TITLE = "设置" BINDINGS = [ ("q", "go_back", "返回"), + ("s", "go_back", "设置"), ] CSS_PATH = rootdir / "interface" / "css" / "screens" / "setting.tcss" diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 2251a82..0c38deb 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -5,6 +5,7 @@ from typing import TypedDict from textual.containers import ScrollableContainer from textual.widget import Widget from textual.widgets import Button, Label, Markdown +from textual.events import Key import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz @@ -50,6 +51,7 @@ class ClozePuzzle(BasePuzzleWidget): self.hashtable = {} self.alia = alia self._load() + self.btn_shortcuts = {} self.hashmap = dict() def _load(self): @@ -67,15 +69,24 @@ class ClozePuzzle(BasePuzzleWidget): yield Label(self.puzzle.wording, id="sentence") yield Markdown(f"> {self.listprint(self.inputlist)}", id="inputpreview") # 渲染当前问题的选项 - with ScrollableContainer(id="btn-container"): + with ScrollableContainer(id="btn-container") as s: + c = 0 for i in self.ans: h = str(hash(i)) + if hash(i) in self.hashmap.keys(): + continue + c += 1 self.hashmap[h] = i btnid = f"sel000-{h}" logger.debug(f"建立按钮 {btnid}") - yield Button(i, id=f"{btnid}") + self.btn_shortcuts[f'{c}'] = btnid + yield Button(f'[{c}] {i}', id=f"{btnid}") + s.focus() yield Button("退格", id="delete") + self.btn_shortcuts[f'0'] = 'delete' + self.btn_shortcuts[f'backspace'] = 'delete' + self.btn_shortcuts[f'delete'] = 'delete' def listprint(self, lst): s = "" @@ -117,3 +128,10 @@ class ClozePuzzle(BasePuzzleWidget): pass else: self.atom.minimize(rating) + + def on_key(self, event: Key) -> None: + self.notify(event.key) + if event.key in self.btn_shortcuts: + btn_id = self.btn_shortcuts.get(event.key) + btn_id = '#' + btn_id + self.query_one(btn_id, Button).press() diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index b5a557c..0a08b5c 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -9,7 +9,7 @@ import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz from heurams.services.hasher import hash from heurams.services.logger import get_logger - +from textual.events import Key from .base_puzzle_widget import BasePuzzleWidget logger = get_logger(__name__) @@ -51,6 +51,7 @@ class MCQPuzzle(BasePuzzleWidget): self.hashmap = dict() self.cursor = 0 self.atom = atom + self.btn_shortcuts = {} self._load() def _load(self): @@ -75,14 +76,24 @@ class MCQPuzzle(BasePuzzleWidget): yield Label(f"当前输入: {self.inputlist}", id="inputpreview") # 渲染当前问题的选项 - with ScrollableContainer(id="btn-container"): + c = 0 + with ScrollableContainer(id="btn-container") as s: for i in current_options: - self.hashmap[str(hash(i))] = i - btnid = f"sel{str(self.cursor).zfill(3)}-{hash(i)}" + if i in [' ', '']: + continue + c += 1 + h = str(hash(i)) + self.hashmap[h] = i + btnid = f"sel{str(self.cursor).zfill(3)}-{h}" logger.debug(f"建立按钮 {btnid}") - yield Button(i, id=f"{btnid}") + self.btn_shortcuts[f'{c}'] = f'{btnid}' + yield Button(f'[{c}] ' + i, id=f"{btnid}") + s.focus() + yield Button("退格", id="delete") - yield Button("退格", id="delete") + self.btn_shortcuts['0'] = f'delete' + self.btn_shortcuts['delete'] = f'delete' + self.btn_shortcuts['backspace'] = f'delete' def update_display(self, error=0): # 更新预览标签 @@ -140,20 +151,25 @@ class MCQPuzzle(BasePuzzleWidget): for child in container.children if hasattr(child, "id") and child.id and child.id.startswith("sel") ] - + container.focus() for button in buttons_to_remove: logger.info(button) container.remove_children("#" + button.id) # type: ignore # 添加当前题目的选项按钮 + c = 0 current_question_index = len(self.inputlist) if current_question_index < len(self.puzzle.options): current_options = self.puzzle.options[current_question_index] for option in current_options: + if option in ['', ' ']: + continue + c += 1 button_id = f"sel{str(self.cursor).zfill(3)}-{hash(option)}" if button_id not in self.hashmap: self.hashmap[button_id[7:]] = option - new_button = Button(option, id=button_id) + new_button = Button(f"[{c}] " + option, id=button_id) + self.btn_shortcuts[f"{c}"] = button_id container.mount(new_button) def handler(self, rating): @@ -161,3 +177,10 @@ class MCQPuzzle(BasePuzzleWidget): pass else: self.atom.minimize(rating) + + def on_key(self, event: Key) -> None: + self.notify(event.key) + if event.key in self.btn_shortcuts: + btn_id = self.btn_shortcuts.get(event.key) + btn_id = '#' + btn_id + self.query_one(btn_id, Button).press() \ No newline at end of file diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index c7ab7ad..5453954 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -49,7 +49,7 @@ class Recognition(BasePuzzleWidget): def compose(self): from heurams.context import config_var - autovoice = config_var.get()["interface"]["widgets"]["autovoice"] + autovoice = config_var.get()["interface"]["widgets"]['recognition']["autovoice"] if autovoice: self.screen.action_play_voice() # type: ignore cfg: RecognitionConfig = self.atom.registry["nucleon"]["puzzles"][self.alia] @@ -96,8 +96,9 @@ class Recognition(BasePuzzleWidget): if isinstance(item, str): yield Markdown(item) - with Center(): - yield Button("我已知晓", id="ok") + with Center() as c: + with Button("我已知晓", id="ok") as b: + b.focus() def on_button_pressed(self, event: Button.Pressed) -> None: if event.button.id == "ok": diff --git a/src/heurams/kernel/puzzles/mcq.py b/src/heurams/kernel/puzzles/mcq.py index 1246a19..8198302 100644 --- a/src/heurams/kernel/puzzles/mcq.py +++ b/src/heurams/kernel/puzzles/mcq.py @@ -72,7 +72,7 @@ class MCQPuzzle(BasePuzzle): # 确保至少有4个干扰项 while len(self.jammer) < 4: - self.jammer.append(" " * (4 - len(self.jammer))) + self.jammer.append("") unique_jammers = set(jammer + list(self.mapping.values())) diff --git a/src/heurams/services/attic.py b/src/heurams/services/attic.py new file mode 100644 index 0000000..4530914 --- /dev/null +++ b/src/heurams/services/attic.py @@ -0,0 +1,54 @@ +# Attic 服务 +import pickle as pkl +from heurams.services.logger import get_logger +from heurams.context import config_var +from pathlib import Path +from heurams.services.hasher import get_md5 +import atexit +from heurams.services import timer +from heurams.services.exceptions import WTFException +logger = get_logger(__name__) + +def singleton(cls): + instances = {} + def get_instance(ident, default): + key = ident + if key not in instances: + instances[key] = cls(ident) + instances[key].patch_dict(default) + return instances[key] + return get_instance + +atticdir = Path(config_var.get()['global']['paths']['misc']) / 'attics' +atticdir.mkdir(parents=True, exist_ok=True) + +@singleton +class Attic: + def __init__(self, ident, default:dict={}): + self.ident = ident + self.ident = self.ident.replace('', str(timer.get_daystamp())) + self.ident = self.ident.replace('', str(timer.get_timestamp())) + if '<' in ident or '>' in ident: + raise WTFException + #self.ident = get_md5(self.ident) + self.pklpath = atticdir / f'{self.ident}.pkl' + atexit.register(self.save) + self.data = default + if self.pklpath.exists(): + try: + self.load() + return + except: + self.pklpath.unlink(missing_ok=True) + self.pklpath.touch(exist_ok=True) + + def patch_dict(self, dct): + self.data.update({k: v for k, v in dct.items() if k not in self.data}) + + def save(self): + with open(atticdir / f'{self.ident}.pkl', 'wb') as f: + pkl.dump(self.data, f) + + def load(self): + with open(atticdir / f'{self.ident}.pkl', 'rb') as f: + self.data.update(dict(pkl.load(f))) \ No newline at end of file diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py index f8c888e..8c4ddb4 100644 --- a/src/heurams/services/favorite_service.py +++ b/src/heurams/services/favorite_service.py @@ -62,8 +62,7 @@ class FavoriteManager: def _get_file_path(self) -> Path: """获取收藏文件路径""" - config_path = Path(config_var.get()["global"]["paths"]["data"]) - fav_path = config_path / "global" / "favorites.json" + fav_path = Path(config_var.get()["global"]["paths"]["misc"]) / "favorites.json5" fav_path.parent.mkdir(parents=True, exist_ok=True) return fav_path diff --git a/src/heurams/services/hasher.py b/src/heurams/services/hasher.py index 8a419f9..5497428 100644 --- a/src/heurams/services/hasher.py +++ b/src/heurams/services/hasher.py @@ -14,7 +14,8 @@ def get_md5(text): def hash(text): - logger.debug(f"计算MD5-时间复合哈希, 输入`{text}`") - result = hashlib.md5(f"{text}{random.randint(0,1000)}".encode("utf-8")).hexdigest() - logger.debug("哈希结果: %s...", result[:8]) - return result + #logger.debug(f"计算MD5-时间复合哈希, 输入`{text}`") + #result = hashlib.md5(f"{text}{random.randint(0,1000)}".encode("utf-8")).hexdigest() + #logger.debug("哈希结果: %s...", result[:8]) + #return result + return get_md5(text) \ No newline at end of file From 1c05f42b61a9b67ff6b9d804df93f3f78af91d28 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 22 Apr 2026 23:39:20 +0800 Subject: [PATCH 50/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +- ARCHITECTURE.md | 62 ++++++++++++ README.md | 104 +++++++-------------- src/heurams/interface/screens/dashboard.py | 2 +- src/heurams/interface/screens/memoqueue.py | 2 - src/heurams/services/attic.py | 1 - src/heurams/services/hasher.py | 1 - 7 files changed, 99 insertions(+), 80 deletions(-) create mode 100644 ARCHITECTURE.md diff --git a/.gitignore b/.gitignore index db6916d..b6e5eda 100644 --- a/.gitignore +++ b/.gitignore @@ -8,14 +8,13 @@ cache/ data/repo/cngk data/repo/eotgk data/repo/evtgk +data/misc +data/cache +data/session *.egg-info/ build/ dist/ old/ -data/cache/ -data/global/ -config/config_dev.toml -AGENTS.md *.log.* # Byte-compiled / optimized / DLL files diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..fe14469 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,62 @@ +# 项目架构 + +## 架构图(待更新 0.5.0) + +以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: + +```mermaid +graph TB + subgraph "用户界面层 (TUI)" + TUI[Textual TUI] + Widgets[界面组件] + Screens[应用屏幕] + end + + subgraph "服务层" + Config[配置管理] + Logger[日志系统] + Timer[时间服务] + AudioService[音频服务] + TTSService[TTS服务] + SyncService[同步服务] + OtherServices[其他服务] + end + + subgraph "内核层" + Algorithms[算法模块] + Particles[数据模型] + Puzzles[谜题模块] + Reactor[调度反应器] + end + + subgraph "提供者层" + AudioProvider[音频提供者] + TTSProvider[TTS提供者] + OtherProviders[其他提供者] + end + + subgraph "数据层" + Files[本地文件数据] + end + + subgraph "上下文管理" + Context[ConfigContext] + CtxVar[config_var] + end + + TUI --> Config + TUI --> Logger + TUI --> AudioService + TUI --> TTSService + TUI --> OtherServices + Config --> Files + Config --> Context + AudioService --> AudioProvider + TTSService --> TTSProvider + OtherServices --> OtherProviders + Reactor --> Algorithms + Reactor --> Particles + Reactor --> Puzzles + Particles --> Files + Algorithms --> Files +``` diff --git a/README.md b/README.md index af39a22..3a1421c 100644 --- a/README.md +++ b/README.md @@ -16,17 +16,27 @@ > 许多出版物都广泛讨论了不同重复间隔对学习效果的影响. 特别是, 间隔效应被认为是一种普遍现象. 间隔效应是指, 如果重复的间隔是分散/稀疏的, 而不是集中重复, 那么学习任务的表现会更好. 因此, 有观点提出, 学习中使用的最佳重复间隔是**最长的, 但不会导致遗忘的间隔**. -- 采用经实证的 SM-2 间隔迭代算法, 此算法亦用作 Anki 闪卡记忆软件的默认闪卡调度器 -- 动态规划每个记忆单元的记忆间隔时间表 -- 动态跟踪记忆反馈数据, 优化长期记忆保留率与稳定性 +- 软件开箱即用, 无需多加配置即可使用默认的 `SM-2` 算法进行学习 +- 此外, 算法模块是 "潜进" 内核 (heurams.kernel) 中的一等公民, 内核天然支持插拔各型算法 +- 无需安装繁杂的插件即可分单元集完成算法快速切换与调优, 研究者可以方便地修改算法模块以便捷地进行研究与测试 +- 内置 `SM-2` 简单间隔重复算法, 此算法亦用作 `Anki` 闪卡记忆软件的默认闪卡调度器 +- 还内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M` 复杂间隔重复算法(逆向工程) +- 算法模块可以标记记忆项目, 也可以动态规划每个记忆单元的记忆间隔时间表, 动态跟踪记忆反馈数据, 以优化长期记忆保留率与稳定性 +- 得益于项目的模块化架构与单元集结构设计, 一个项目甚至可以与任意种算法共存并互通, 这对研究者及想探索/实验高效率方法的用户极其友好 -### 学习进程优化 +### 多模态学习进程 -- 元数据配置: 支持配置详细附加数据 -- 自然语音: 集成文本转语音 (TTS) 功能, 支持"电台"回顾功能 -- 多种谜题类型: 选择题 (MCQ), 填空题 (Cloze), 识别题 (Recognition) -- 动态内容生成: 支持宏驱动的模板系统, 根据上下文动态生成题目 -- 云同步支持: 通过多种协议同步数据到远程服务器 +与 `Anki` 的 SQLite `apkg` 包不同, 潜进项目坚持使用人类可读的文件夹组织单元集, 这带来了若干好处, 包括: +- 人类可读: 您可以用任意工具, 乃至一个记事本修改记忆载荷数据而无需打开软件 +- 元数据配置: 配置自由度极高, 可以任意组合, 重造, 乃至创造新内容 +- 测验, 算法与知识互相隔离: 您的记忆项目不再是单一的闪卡, 而是 `载荷(payload)` 和 `谜题(puzzle)` 通过 `元数据(typedef)` 抽象成的 `核子(nucleon)` 对象, 在程序内部和 `算法数据(algodata)` 抽象成的 `电子`, `调度设置(schedule)` 定义的 `轨道(orbital)` 共同有机组合成的运行时对象 `原子(atom)`! 这意味着一条知识不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧这些概念复杂--仅需从云端下载单元集即可无痛体验所有功能! +- 多模态学习 + - 软件自身集成了文本转语音 (TTS) , 音频与语言模型 (LLM) 模块, 这些功能乃至功能本身都是可插拔, 可扩展, 可切换驱动的, 这为内容创建了极大的丰富度 + - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择启用 + - 软件天然支持动态内容生成, 支持宏驱动的模板系统, 根据上下文乃至语言模型动态生成知识点的解析 + - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 +- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制 +- 优越性能: 得益于现代的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 ### 实用用户界面 @@ -36,6 +46,17 @@ ## 快速开始 +### 从包管理器安装 + +潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本 + +``` +# 稳定版 +python -m pip install heurams -i https://pypi.pluv27.top/root/stable/+simple/ +# 开发版 +python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ +``` + ### 从源码安装 1. 克隆仓库: @@ -45,13 +66,13 @@ cd HeurAMS ``` -1. 安装依赖: +2. 安装依赖: ```bash pip install -r requirements.txt ``` -1. 以开发模式安装包: +3. 以开发模式安装包: ```bash pip install -e . @@ -59,66 +80,7 @@ ## 项目结构 -### 架构图(待更新 0.5.0) - -以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: - -```mermaid -graph TB - subgraph "用户界面层 (TUI)" - TUI[Textual TUI] - Widgets[界面组件] - Screens[应用屏幕] - end - - subgraph "服务层" - Config[配置管理] - Logger[日志系统] - Timer[时间服务] - AudioService[音频服务] - TTSService[TTS服务] - SyncService[同步服务] - OtherServices[其他服务] - end - - subgraph "内核层" - Algorithms[算法模块] - Particles[数据模型] - Puzzles[谜题模块] - Reactor[调度反应器] - end - - subgraph "提供者层" - AudioProvider[音频提供者] - TTSProvider[TTS提供者] - OtherProviders[其他提供者] - end - - subgraph "数据层" - Files[本地文件数据] - end - - subgraph "上下文管理" - Context[ConfigContext] - CtxVar[config_var] - end - - TUI --> Config - TUI --> Logger - TUI --> AudioService - TUI --> TTSService - TUI --> OtherServices - Config --> Files - Config --> Context - AudioService --> AudioProvider - TTSService --> TTSProvider - OtherServices --> OtherProviders - Reactor --> Algorithms - Reactor --> Particles - Reactor --> Puzzles - Particles --> Files - Algorithms --> Files -``` +详见[架构说明](ARCHITECTURE.md). ## 参与项目 diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 8a3e550..9075bc3 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -6,7 +6,7 @@ from pathlib import Path from textual.app import ComposeResult from textual.containers import ScrollableContainer, Horizontal, Vertical from textual.screen import Screen -from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static, Markdown +from textual.widgets import Button, Footer, Header, Label, ListItem, ListView, Static from textual import events, on from textual.reactive import reactive diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 3905ab4..452f847 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -62,7 +62,6 @@ class MemScreen(Screen): shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: - import time from heurams.services.attic import Attic a = Attic('ana', {'openqueue': 0}) a.data['openqueue'] += 1 @@ -113,7 +112,6 @@ class MemScreen(Screen): def mount_puzzle(self): """挂载当前谜题组件""" - from heurams.services.attic import Attic if self.procession.route == RouterState.FINISHED: self.mount_finished_widget() return diff --git a/src/heurams/services/attic.py b/src/heurams/services/attic.py index 4530914..a0d7558 100644 --- a/src/heurams/services/attic.py +++ b/src/heurams/services/attic.py @@ -3,7 +3,6 @@ import pickle as pkl from heurams.services.logger import get_logger from heurams.context import config_var from pathlib import Path -from heurams.services.hasher import get_md5 import atexit from heurams.services import timer from heurams.services.exceptions import WTFException diff --git a/src/heurams/services/hasher.py b/src/heurams/services/hasher.py index 5497428..6ab7746 100644 --- a/src/heurams/services/hasher.py +++ b/src/heurams/services/hasher.py @@ -1,6 +1,5 @@ # 哈希服务 import hashlib -import random from heurams.services.logger import get_logger logger = get_logger(__name__) From 5b7b4ba443f3f56d817a34cb266ba3636a2f3738 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 23 Apr 2026 00:13:57 +0800 Subject: [PATCH 51/79] =?UTF-8?q?style:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/heurams/context.py | 2 +- src/heurams/interface/__init__.py | 10 ++-- src/heurams/interface/screens/about.py | 11 +++-- src/heurams/interface/screens/dashboard.py | 30 ++++++++---- src/heurams/interface/screens/favmgr.py | 8 ++-- src/heurams/interface/screens/memoqueue.py | 47 +++++++++++-------- src/heurams/interface/screens/navigator.py | 1 - src/heurams/interface/screens/precache.py | 9 ++-- src/heurams/interface/screens/preparation.py | 11 +++-- src/heurams/interface/screens/setting.py | 26 +++++----- src/heurams/interface/screens/synctool.py | 8 ++-- src/heurams/interface/shim.py | 2 +- src/heurams/interface/widgets/cloze_puzzle.py | 14 +++--- src/heurams/interface/widgets/mcq_puzzle.py | 18 +++---- src/heurams/interface/widgets/recognition.py | 2 +- src/heurams/kernel/particles/placeholders.py | 1 - src/heurams/kernel/puzzles/guess.py | 1 - src/heurams/kernel/reactor/router.py | 1 - src/heurams/services/attic.py | 26 ++++++---- src/heurams/services/exceptions.py | 2 - src/heurams/services/hasher.py | 10 ++-- src/heurams/unifront/session.py | 4 +- 23 files changed, 144 insertions(+), 104 deletions(-) diff --git a/README.md b/README.md index 3a1421c..bfd291a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ - 此外, 算法模块是 "潜进" 内核 (heurams.kernel) 中的一等公民, 内核天然支持插拔各型算法 - 无需安装繁杂的插件即可分单元集完成算法快速切换与调优, 研究者可以方便地修改算法模块以便捷地进行研究与测试 - 内置 `SM-2` 简单间隔重复算法, 此算法亦用作 `Anki` 闪卡记忆软件的默认闪卡调度器 -- 还内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M` 复杂间隔重复算法(逆向工程) +- 还内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M (移植自 sm.js 项目)` 复杂间隔重复算法(逆向工程) - 算法模块可以标记记忆项目, 也可以动态规划每个记忆单元的记忆间隔时间表, 动态跟踪记忆反馈数据, 以优化长期记忆保留率与稳定性 - 得益于项目的模块化架构与单元集结构设计, 一个项目甚至可以与任意种算法共存并互通, 这对研究者及想探索/实验高效率方法的用户极其友好 @@ -35,7 +35,7 @@ - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择启用 - 软件天然支持动态内容生成, 支持宏驱动的模板系统, 根据上下文乃至语言模型动态生成知识点的解析 - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 -- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制 +- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持 .zip/.tar.gz/.tar.xz 导入与导出 - 优越性能: 得益于现代的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 ### 实用用户界面 diff --git a/src/heurams/context.py b/src/heurams/context.py index f8d36f8..b0e008d 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -51,4 +51,4 @@ class ConfigContext: return self def __exit__(self, exc_type, exc_val, exc_tb): - config_var.reset(self._token) # type: ignore \ No newline at end of file + config_var.reset(self._token) # type: ignore diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index b0b5a62..2011d63 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -63,9 +63,11 @@ class HeurAMSApp(App): self.push_screen("dashboard") def action_go_back(self) -> None: - self.exit() # go_back 在最顶层是退出, Screen 会再次定义为返回, 键位都是 q, 免得不一样 + self.exit() # go_back 在最顶层是退出, Screen 会再次定义为返回, 键位都是 q, 免得不一样 - def action_do_nothing(self) -> None: # 用来给没使用/禁用的快捷键占位, 因为 Binding 删除不了 + def action_do_nothing( + self, + ) -> None: # 用来给没使用/禁用的快捷键占位, 因为 Binding 删除不了 pass # 移除烦人的 "rich traceback" @@ -78,10 +80,10 @@ class HeurAMSApp(App): if hasattr(self, "_exception"): self._close_messages_no_wait() raise self._exception - super()._fatal_error() # fallback + super()._fatal_error() # fallback def panic(self, *args): if hasattr("_exception"): self._close_messages_no_wait() raise self._exception - super().panic(*args) # ditto + super().panic(*args) # ditto diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index d8170a2..15ff6b3 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -22,6 +22,7 @@ class AboutScreen(Screen): ("z", "go_back", "关于"), ] SUB_TITLE = "关于" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -32,9 +33,11 @@ class AboutScreen(Screen): shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: - - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(id="about_container"): yield Label("[b]关于与版本信息[/b]") @@ -115,7 +118,7 @@ Textual 框架版本: {textual_version} import textual return textual.__version__ - except ImportError, AttributeError: + except (ImportError, AttributeError): return "未知" def _get_terminal_info(self) -> str: diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 9075bc3..e7ecb56 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -47,8 +47,10 @@ class DashboardScreen(Screen): def compose(self) -> ComposeResult: """组合界面组件""" - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(): yield Horizontal( # 顶部的状态 Vertical( @@ -76,14 +78,19 @@ class DashboardScreen(Screen): ) yield ListView(id="repo_list", classes="repo-list") # 单元集选择 from heurams.services.attic import Attic - a = Attic('ana', {'totaltime': 0, 'openpuzzles': 0, 'puzzles_err': 0}) + + a = Attic("ana", {"totaltime": 0, "openpuzzles": 0, "puzzles_err": 0}) yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 - yield Label(f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + '个/s'}", id='analysis') # 版本信息 + yield Label( + f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + '个/s'}", + id="analysis", + ) # 版本信息 yield Footer() @on(events.ScreenResume) def post_active(self, event): from heurams.interface import shim + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") # https://github.com/Textualize/textual/discussions/4268 # self.refresh(recompose=True) 此函数有问题且官方不管 而且性能低 @@ -112,17 +119,21 @@ class DashboardScreen(Screen): } repo.preview = { "review": 0, - "new": repo.config["scheduled_num"], # TODO: 考虑之后在这里加点运算避免 SM-2 积压, 但现在需要的是直观! + "new": repo.config[ + "scheduled_num" + ], # TODO: 考虑之后在这里加点运算避免 SM-2 积压, 但现在需要的是直观! } initial_time = float("inf") - for i in range(repo.data_length): # TODO: 增加异步性能优化, 但是学习数据属实规模小... + for i in range( + repo.data_length + ): # TODO: 增加异步性能优化, 但是学习数据属实规模小... e = pt.Electron.from_data( electronic_data=repo.electronic_data_lict[i], algo_name=repo.config["algorithm"], ) # n = pt.Nucleon.from_data(repo.nucleonic_data_lict[i]) if e.is_activated(): - repo.progress["have_activated_ever"] = True # 被激活过~ + repo.progress["have_activated_ever"] = True # 被激活过~ repo.progress["touched"] += 1 repo.nearest_review_time = min(repo.nearest_review_time, e.nextdate()) if timer.get_daystamp() >= e.nextdate(): @@ -141,7 +152,7 @@ class DashboardScreen(Screen): repodirs = sorted( self.repos, key=lambda r: r.nearest_review_time, - reverse=True, # 紧张的先复习 + reverse=True, # 紧张的先复习 ) # 填充列表 @@ -159,7 +170,7 @@ class DashboardScreen(Screen): return for r in self.repos: - self.repolink[str(r.manifest['package'])] = r # 用于规避 ctype id 对象还原 + self.repolink[str(r.manifest["package"])] = r # 用于规避 ctype id 对象还原 # NOTE: 上一行不要使用 id(), id 可能被重用! list_item = ListItem( *[Label(line) for line in r.prompt.splitlines()], @@ -202,5 +213,6 @@ class DashboardScreen(Screen): logger.debug(f"event.button.id: {event.button.id}") if event.button.id.startswith("slaunch_repo_"): # type: ignore from .preparation import launch + launch(repo=self.repolink[event.button.id.removeprefix("slaunch_repo_")], app=self.app, scheduled_num=-1) # type: ignore # TODO: 这样启动的记忆实例的状态机无法绑定到 PreparationScreen 中 diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index e165ccd..55636a2 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -56,9 +56,11 @@ class FavoriteManagerScreen(Screen): def compose(self) -> ComposeResult: """组合界面组件""" - - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(id="favorites-container"): if not self.favorites: yield Label("暂无收藏", classes="empty-label") diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 452f847..55de24b 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -20,6 +20,7 @@ from .. import shim logger = get_logger(__name__) + class MemScreen(Screen): BINDINGS = [ ("q", "go_back", "返回"), @@ -59,14 +60,18 @@ class MemScreen(Screen): @on(events.ScreenResume) def post_active(self, event): from heurams.interface import shim + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: from heurams.services.attic import Attic - a = Attic('ana', {'openqueue': 0}) - a.data['openqueue'] += 1 - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + a = Attic("ana", {"openqueue": 0}) + a.data["openqueue"] += 1 + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(): yield Label(self._get_progress_text(), id="head_stat") yield ScrollableContainer(id="puzzle_container") @@ -81,8 +86,9 @@ class MemScreen(Screen): self.expander = self.procession.get_expander() from heurams.services.attic import Attic import time - a = Attic('ana', {'last': time.time()}) - a.data['last'] = time.time() + + a = Attic("ana", {"last": time.time()}) + a.data["last"] = time.time() self.mount_puzzle() self.update_display() @@ -122,8 +128,8 @@ class MemScreen(Screen): def mount_finished_widget(self): """挂载已完成组件""" - a = Attic('ana', {'finished': 0}) - a.data['finished'] += 1 + a = Attic("ana", {"finished": 0}) + a.data["finished"] += 1 container = self.query_one("#puzzle_container") for i in container.children: i.remove() @@ -176,12 +182,14 @@ class MemScreen(Screen): self.forward_atom(self.expander.get_quality()) self.update_state() from heurams.services.attic import Attic - a = Attic('ana', {'openpuzzles': 0}) - a = Attic('ana', {'totaltime': 0}) - a.data['openpuzzles'] += 1 + + a = Attic("ana", {"openpuzzles": 0}) + a = Attic("ana", {"totaltime": 0}) + a.data["openpuzzles"] += 1 import time - a.data['totaltime'] += time.time() - a.data['last'] - a.data['last'] = time.time() + + a.data["totaltime"] += time.time() - a.data["last"] + a.data["last"] = time.time() self.mount_puzzle() self.update_display() @@ -201,8 +209,8 @@ class MemScreen(Screen): logger.debug(f"Quality: {quality}") self.atom_reporter(quality) if quality <= 3: - a = Attic('ana', {'puzzles_err': 0}) - a.data['puzzles_err'] += 1 + a = Attic("ana", {"puzzles_err": 0}) + a.data["puzzles_err"] += 1 self.procession.append() self.update_state() # 刷新状态 self.procession.forward(1) @@ -261,7 +269,8 @@ class MemScreen(Screen): def action_resume_mark(self): from heurams.services.attic import Attic import time - a = Attic('ana') - l = a.data['last'] - a.data['last'] = time.time() - self.app.notify(f"时间恢复已修正: {l} -> {a.data['last']}") \ No newline at end of file + + a = Attic("ana") + l = a.data["last"] + a.data["last"] = time.time() + self.app.notify(f"时间恢复已修正: {l} -> {a.data['last']}") diff --git a/src/heurams/interface/screens/navigator.py b/src/heurams/interface/screens/navigator.py index a86d31d..1793534 100644 --- a/src/heurams/interface/screens/navigator.py +++ b/src/heurams/interface/screens/navigator.py @@ -1,4 +1,3 @@ - from textual.app import ComposeResult from textual.containers import Grid from textual.screen import ModalScreen diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index 57f0a8e..cb7ffae 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -111,9 +111,11 @@ class PrecachingScreen(Screen): self.cache_stats["cache_rate"] = cache_rate def compose(self) -> ComposeResult: - - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(id="precache_container"): yield Label("[b]音频预缓存[/b]", classes="title-label") with Container(): @@ -314,7 +316,6 @@ class PrecachingScreen(Screen): try: import shutil - shutil.rmtree(cache_dir, ignore_errors=True) self.update_status("已清空", "音频缓存已清空", 0) self._update_cache_display() # 更新缓存统计显示 diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 873cb56..940a001 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -52,10 +52,13 @@ class PreparationScreen(Screen): def compose(self) -> ComposeResult: from heurams.services.attic import Attic - a = Attic('ana', {'openpre': 0}) - a.data['openpre'] += 1 - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + a = Attic("ana", {"openpre": 0}) + a.data["openpre"] += 1 + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(id="main_container"): yield Markdown( f"**准备就绪**: `{self.repo.manifest['title']}`\n", id="title" diff --git a/src/heurams/interface/screens/setting.py b/src/heurams/interface/screens/setting.py index 387a0c4..cedef8f 100644 --- a/src/heurams/interface/screens/setting.py +++ b/src/heurams/interface/screens/setting.py @@ -1,6 +1,5 @@ """设置页面""" - from textual.app import ComposeResult from textual.containers import ScrollableContainer, Horizontal from textual.screen import Screen @@ -47,12 +46,15 @@ class SettingScreen(Screen): @on(events.ScreenResume) def post_active(self, event): from heurams.interface import shim + shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: """组合界面组件""" - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(): yield Label("[b]设置页面[/b]") for i in config_var.get(): @@ -61,7 +63,8 @@ class SettingScreen(Screen): a = self._get_subcfg(f"{i}") if a: yield Collapsible( - *a, title=i + f'\n[d]{config_var.get().get(f"_{i}_desc", "")}[/d]' + *a, + title=i + f'\n[d]{config_var.get().get(f"_{i}_desc", "")}[/d]', ) yield Label( "退出页面时, 所作的更改会立即保存, 但仍建议重启软件以确保新的配置得到应用", @@ -113,7 +116,7 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), - classes="setting-item" + classes="setting-item", ) ) elif isinstance(parent[f"_{i}_candidate"], list): @@ -125,7 +128,7 @@ class SettingScreen(Screen): prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}"), ), - classes="setting-item" + classes="setting-item", ) ) else: @@ -139,7 +142,7 @@ class SettingScreen(Screen): type="number", id=domize(f"{parent_epath}.{i}"), ), - classes="setting-item" + classes="setting-item", ) ) elif isinstance(parent[i], str): @@ -152,7 +155,7 @@ class SettingScreen(Screen): type="text", id=domize(f"{parent_epath}.{i}"), ), - classes="setting-item" + classes="setting-item", ) ) elif isinstance(parent[i], bool): @@ -160,10 +163,11 @@ class SettingScreen(Screen): Horizontal( Label(i + f'\n[d]{parent.get(f"_{i}_desc", "")}[/d]'), Switch( - value=parent[i], id=domize(f"{parent_epath}.{i}"), + value=parent[i], + id=domize(f"{parent_epath}.{i}"), classes="setting-switch", ), - classes="setting-item" + classes="setting-item", ) ) elif isinstance(parent[i], int): @@ -176,7 +180,7 @@ class SettingScreen(Screen): type="integer", id=domize(f"{parent_epath}.{i}"), ), - classes="setting-item" + classes="setting-item", ) ) elif isinstance(parent[i], list): diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index 1cb364d..19dc485 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -33,9 +33,11 @@ class SyncScreen(Screen): shim.set_term_title(f"{self.app.TITLE} - {self.SUB_TITLE}") def compose(self) -> ComposeResult: - - if config_var.get()['interface']['global']['show_header']: - yield Header(show_clock=config_var.get()['interface']['global']['clock_on_header']) + + if config_var.get()["interface"]["global"]["show_header"]: + yield Header( + show_clock=config_var.get()["interface"]["global"]["clock_on_header"] + ) with ScrollableContainer(id="sync_container"): # 标题和连接状态 yield Static("同步工具", classes="title") diff --git a/src/heurams/interface/shim.py b/src/heurams/interface/shim.py index 2bb61f7..e2eae3b 100644 --- a/src/heurams/interface/shim.py +++ b/src/heurams/interface/shim.py @@ -15,7 +15,7 @@ puzzle2widget = { def set_term_title(title): - if not config_var.get()['interface']['global']['change_window_title']: + if not config_var.get()["interface"]["global"]["change_window_title"]: return system = platform.system() if system == "Windows": diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 0c38deb..12a1f41 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -79,14 +79,14 @@ class ClozePuzzle(BasePuzzleWidget): self.hashmap[h] = i btnid = f"sel000-{h}" logger.debug(f"建立按钮 {btnid}") - self.btn_shortcuts[f'{c}'] = btnid - yield Button(f'[{c}] {i}', id=f"{btnid}") + self.btn_shortcuts[f"{c}"] = btnid + yield Button(f"[{c}] {i}", id=f"{btnid}") s.focus() yield Button("退格", id="delete") - self.btn_shortcuts[f'0'] = 'delete' - self.btn_shortcuts[f'backspace'] = 'delete' - self.btn_shortcuts[f'delete'] = 'delete' + self.btn_shortcuts[f"0"] = "delete" + self.btn_shortcuts[f"backspace"] = "delete" + self.btn_shortcuts[f"delete"] = "delete" def listprint(self, lst): s = "" @@ -128,10 +128,10 @@ class ClozePuzzle(BasePuzzleWidget): pass else: self.atom.minimize(rating) - + def on_key(self, event: Key) -> None: self.notify(event.key) if event.key in self.btn_shortcuts: btn_id = self.btn_shortcuts.get(event.key) - btn_id = '#' + btn_id + btn_id = "#" + btn_id self.query_one(btn_id, Button).press() diff --git a/src/heurams/interface/widgets/mcq_puzzle.py b/src/heurams/interface/widgets/mcq_puzzle.py index 0a08b5c..c04c74b 100644 --- a/src/heurams/interface/widgets/mcq_puzzle.py +++ b/src/heurams/interface/widgets/mcq_puzzle.py @@ -79,21 +79,21 @@ class MCQPuzzle(BasePuzzleWidget): c = 0 with ScrollableContainer(id="btn-container") as s: for i in current_options: - if i in [' ', '']: + if i in [" ", ""]: continue c += 1 h = str(hash(i)) self.hashmap[h] = i btnid = f"sel{str(self.cursor).zfill(3)}-{h}" logger.debug(f"建立按钮 {btnid}") - self.btn_shortcuts[f'{c}'] = f'{btnid}' - yield Button(f'[{c}] ' + i, id=f"{btnid}") + self.btn_shortcuts[f"{c}"] = f"{btnid}" + yield Button(f"[{c}] " + i, id=f"{btnid}") s.focus() yield Button("退格", id="delete") - self.btn_shortcuts['0'] = f'delete' - self.btn_shortcuts['delete'] = f'delete' - self.btn_shortcuts['backspace'] = f'delete' + self.btn_shortcuts["0"] = f"delete" + self.btn_shortcuts["delete"] = f"delete" + self.btn_shortcuts["backspace"] = f"delete" def update_display(self, error=0): # 更新预览标签 @@ -162,7 +162,7 @@ class MCQPuzzle(BasePuzzleWidget): if current_question_index < len(self.puzzle.options): current_options = self.puzzle.options[current_question_index] for option in current_options: - if option in ['', ' ']: + if option in ["", " "]: continue c += 1 button_id = f"sel{str(self.cursor).zfill(3)}-{hash(option)}" @@ -182,5 +182,5 @@ class MCQPuzzle(BasePuzzleWidget): self.notify(event.key) if event.key in self.btn_shortcuts: btn_id = self.btn_shortcuts.get(event.key) - btn_id = '#' + btn_id - self.query_one(btn_id, Button).press() \ No newline at end of file + btn_id = "#" + btn_id + self.query_one(btn_id, Button).press() diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 5453954..d0a0c99 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -49,7 +49,7 @@ class Recognition(BasePuzzleWidget): def compose(self): from heurams.context import config_var - autovoice = config_var.get()["interface"]["widgets"]['recognition']["autovoice"] + autovoice = config_var.get()["interface"]["widgets"]["recognition"]["autovoice"] if autovoice: self.screen.action_play_voice() # type: ignore cfg: RecognitionConfig = self.atom.registry["nucleon"]["puzzles"][self.alia] diff --git a/src/heurams/kernel/particles/placeholders.py b/src/heurams/kernel/particles/placeholders.py index 3c21bc5..04c70ea 100644 --- a/src/heurams/kernel/particles/placeholders.py +++ b/src/heurams/kernel/particles/placeholders.py @@ -1,4 +1,3 @@ - from .atom import Atom from .electron import Electron from .nucleon import Nucleon diff --git a/src/heurams/kernel/puzzles/guess.py b/src/heurams/kernel/puzzles/guess.py index db88101..4927431 100644 --- a/src/heurams/kernel/puzzles/guess.py +++ b/src/heurams/kernel/puzzles/guess.py @@ -1,4 +1,3 @@ - from heurams.services.logger import get_logger from .base import BasePuzzle diff --git a/src/heurams/kernel/reactor/router.py b/src/heurams/kernel/reactor/router.py index 21776ef..021c199 100644 --- a/src/heurams/kernel/reactor/router.py +++ b/src/heurams/kernel/reactor/router.py @@ -136,7 +136,6 @@ class Router(Machine): def __repr__(self, style="pipe", ends="\n"): from tabulate import tabulate as tabu - lst = [ { "Type": "Router", diff --git a/src/heurams/services/attic.py b/src/heurams/services/attic.py index a0d7558..c846d8f 100644 --- a/src/heurams/services/attic.py +++ b/src/heurams/services/attic.py @@ -6,31 +6,37 @@ from pathlib import Path import atexit from heurams.services import timer from heurams.services.exceptions import WTFException + logger = get_logger(__name__) + def singleton(cls): instances = {} + def get_instance(ident, default): key = ident if key not in instances: instances[key] = cls(ident) instances[key].patch_dict(default) return instances[key] + return get_instance -atticdir = Path(config_var.get()['global']['paths']['misc']) / 'attics' + +atticdir = Path(config_var.get()["global"]["paths"]["misc"]) / "attics" atticdir.mkdir(parents=True, exist_ok=True) + @singleton class Attic: - def __init__(self, ident, default:dict={}): + def __init__(self, ident, default: dict = {}): self.ident = ident - self.ident = self.ident.replace('', str(timer.get_daystamp())) - self.ident = self.ident.replace('', str(timer.get_timestamp())) - if '<' in ident or '>' in ident: + self.ident = self.ident.replace("", str(timer.get_daystamp())) + self.ident = self.ident.replace("", str(timer.get_timestamp())) + if "<" in ident or ">" in ident: raise WTFException - #self.ident = get_md5(self.ident) - self.pklpath = atticdir / f'{self.ident}.pkl' + # self.ident = get_md5(self.ident) + self.pklpath = atticdir / f"{self.ident}.pkl" atexit.register(self.save) self.data = default if self.pklpath.exists(): @@ -45,9 +51,9 @@ class Attic: self.data.update({k: v for k, v in dct.items() if k not in self.data}) def save(self): - with open(atticdir / f'{self.ident}.pkl', 'wb') as f: + with open(atticdir / f"{self.ident}.pkl", "wb") as f: pkl.dump(self.data, f) def load(self): - with open(atticdir / f'{self.ident}.pkl', 'rb') as f: - self.data.update(dict(pkl.load(f))) \ No newline at end of file + with open(atticdir / f"{self.ident}.pkl", "rb") as f: + self.data.update(dict(pkl.load(f))) diff --git a/src/heurams/services/exceptions.py b/src/heurams/services/exceptions.py index f480c0f..665c728 100644 --- a/src/heurams/services/exceptions.py +++ b/src/heurams/services/exceptions.py @@ -1,4 +1,2 @@ - - class WTFException(Exception): pass diff --git a/src/heurams/services/hasher.py b/src/heurams/services/hasher.py index 6ab7746..d35f116 100644 --- a/src/heurams/services/hasher.py +++ b/src/heurams/services/hasher.py @@ -13,8 +13,8 @@ def get_md5(text): def hash(text): - #logger.debug(f"计算MD5-时间复合哈希, 输入`{text}`") - #result = hashlib.md5(f"{text}{random.randint(0,1000)}".encode("utf-8")).hexdigest() - #logger.debug("哈希结果: %s...", result[:8]) - #return result - return get_md5(text) \ No newline at end of file + # logger.debug(f"计算MD5-时间复合哈希, 输入`{text}`") + # result = hashlib.md5(f"{text}{random.randint(0,1000)}".encode("utf-8")).hexdigest() + # logger.debug("哈希结果: %s...", result[:8]) + # return result + return get_md5(text) diff --git a/src/heurams/unifront/session.py b/src/heurams/unifront/session.py index f5aab12..09cfc15 100644 --- a/src/heurams/unifront/session.py +++ b/src/heurams/unifront/session.py @@ -1,3 +1,5 @@ """会话模块""" + + class Session: - pass \ No newline at end of file + pass From f0b63fdeb62fb8a00a7a1d994cac57f434815d33 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Fri, 24 Apr 2026 15:38:10 +0800 Subject: [PATCH 52/79] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 41 +++++++++++++---- README.md | 49 +++++++++------------ data/misc/attics/ana.pkl | Bin 111 -> 111 bytes src/heurams/interface/__init__.py | 2 + src/heurams/interface/screens/about.py | 4 +- src/heurams/interface/screens/dashboard.py | 2 +- src/heurams/interface/screens/memoqueue.py | 2 + src/heurams/kernel/reactor/README.md | 8 ++-- 8 files changed, 65 insertions(+), 43 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f5076fa..5be4631 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,17 +8,40 @@ - `main` 分支: 稳定版本, 仅当稳定版本释出或修补版本时将 `dev` 合并到 `main` 上 - `dev` 分支: 主线开发版本, 自身仅用于非重构的问题修复和整合功能分支 -- 功能与重构分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/v版本号`() +- 功能与重构分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/v版本号` - 不要将功能与重构分支先应被合并至 `dev` 后在 `dev` 完成文档开发后再释出至 `main` - 代码格式化: -- 对于 Python, 使用 `black` 格式化 + +代码格式化: + +- 安装工具: + ```bash + python -m pip install black autoflake mdformat + ``` +- 对于 Python, 使用 `black` 与 `autoflake` 格式化\ + 命令: + ```bash + # black 的多线程在某些环境下有兼容性问题 + black . --workers=1 + ``` + ```bash + # autoflake 注意排除 __init__.py + autoflake --in-place --remove-all-unused-imports --recursive ./src/ --exclude __init__.py + ``` - 对于 Markdown, 使用 `mdformat` 格式化 -- 对于 Textual CSS, 使用 `prettier` 格式化 + 命令: + ```bash + mdformat --number . + ``` +- 对于 Textual CSS, 可以使用 `prettier` 格式化 - 格式化不是必需的, 可以整合入一次 `style` 提交, 但 `main` 和 `dev` 分支上的代码应尽量整洁, 以便合并时审查 - 提交消息: + +提交消息: + - 使用简体中文或英文撰写清晰的提交消息 - 提交消息格式: 遵循 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) 规范, 建议使用 `koji` 工具 - 合并方式: + +合并方式: + - 为了一致性和可追溯性, 项目自 v0.4.0 重构后重新初始化仓库起就禁止使用 Fast-forward 合并 - 可以设置 `git config merge.ff false` @@ -43,7 +66,7 @@ uv run heurams # 验证包安装 uv run tui # 启动 TUI -# 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不支持 uv 的环境运行 HeurAMS) +# 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不便支持 uv 与硬链接的环境和文件系统(例如 termux)运行 HeurAMS) ## 安装依赖并将 HeurAMS 安装为本地包 python3 -m pip install -r requirements.txt @@ -69,13 +92,13 @@ HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: - 我们的内置 Textual TUI 前端不是唯一可用的前端 -- 您可以在自己的项目中以独立进程/服务调用 HeurAMS (但不能在代码中链接), 而免于受 AGPL-3.0 "污染" +- 您可以在自己的项目中以独立进程/服务调用 HeurAMS (但不能在代码中链接), 而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. - 如果您有一个自己开发的且可用的 HeurAMS 前端 (例如我们暂未实现的 flutter 前端), 并且以 AGPL-3.0/GPL-3.0 开放源代码, 可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) - 如果您通过独立进程/服务调用方式开发了另外的软件, 开源但不愿使用 AGPL-3.0/GPL-3.0 许可证, 也可以联系我们, 我们乐于将您的项目链接添加到友链中 -- 如果您想创建程序库的其他语言 (例如 dart) 版本以协助此语言下的方便集成, 并且同样以 AGPL-3.0/GPL-3.0 开放源代码, 也可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) +- 如果您想创建程序库的其他语言 (例如 dart 或 rust) 版本以协助此语言下的方便集成, 并且同样以 AGPL-3.0/GPL-3.0 开放源代码, 也可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) ## 软件开发之外的贡献 diff --git a/README.md b/README.md index bfd291a..d16858e 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ ## 项目结构 -这个仓库是 "潜进" 的核心程序库在 python 语言下的实现 -包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) -除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库, 使用框架构建其他辅助记忆功能前端或其他应用程序 +这个仓库是 "潜进" 的核心程序库在 python 语言下的实现\ +包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块)\ +除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库, 使用框架构建其他辅助记忆功能前端或其他应用程序 ## 特性 @@ -27,16 +27,17 @@ ### 多模态学习进程 与 `Anki` 的 SQLite `apkg` 包不同, 潜进项目坚持使用人类可读的文件夹组织单元集, 这带来了若干好处, 包括: -- 人类可读: 您可以用任意工具, 乃至一个记事本修改记忆载荷数据而无需打开软件 + +- 人类可读: 您可以用任意工具, 乃至一个记事本自由修改记忆载荷数据而无需打开软件 - 元数据配置: 配置自由度极高, 可以任意组合, 重造, 乃至创造新内容 -- 测验, 算法与知识互相隔离: 您的记忆项目不再是单一的闪卡, 而是 `载荷(payload)` 和 `谜题(puzzle)` 通过 `元数据(typedef)` 抽象成的 `核子(nucleon)` 对象, 在程序内部和 `算法数据(algodata)` 抽象成的 `电子`, `调度设置(schedule)` 定义的 `轨道(orbital)` 共同有机组合成的运行时对象 `原子(atom)`! 这意味着一条知识不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧这些概念复杂--仅需从云端下载单元集即可无痛体验所有功能! +- 测验, 算法与知识互相隔离: 您的记忆项目不再是单一的闪卡, 而是 `载荷(payload)` 和 `谜题(puzzle)` 通过 `元数据(typedef)` 抽象成的 `核子(nucleon)` 对象, 在程序内部和 `算法数据(algodata)` 抽象成的 `电子`, `调度设置(schedule)` 定义的 `轨道(orbital)` 共同有机组合成的运行时对象 `原子(atom)`! 这意味着一条知识不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧这些概念复杂--仅需从云端下载单元集即可开箱即用上述特性! - 多模态学习 - 软件自身集成了文本转语音 (TTS) , 音频与语言模型 (LLM) 模块, 这些功能乃至功能本身都是可插拔, 可扩展, 可切换驱动的, 这为内容创建了极大的丰富度 - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择启用 - 软件天然支持动态内容生成, 支持宏驱动的模板系统, 根据上下文乃至语言模型动态生成知识点的解析 - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 - 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持 .zip/.tar.gz/.tar.xz 导入与导出 -- 优越性能: 得益于现代的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 +- 性能提升: 得益于现代且支持分块的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 ### 实用用户界面 @@ -59,24 +60,8 @@ python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ ### 从源码安装 -1. 克隆仓库: - - ```bash - git clone https://gitea.imwangzhiyu.xyz/ajax/HeurAMS - cd HeurAMS - ``` - -2. 安装依赖: - - ```bash - pip install -r requirements.txt - ``` - -3. 以开发模式安装包: - - ```bash - pip install -e . - ``` +我们提供原生 python 和 uv 两种安装方式\ +详见[贡献指南](CONTRIBUTING.md) ## 项目结构 @@ -94,14 +79,24 @@ python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ ### 第三方代码 -项目在 `src/heurams/vendor/` 目录下嵌入了以下第三方代码(可能有修改): +项目在 `src/heurams/vendor/` 目录下嵌入或在其他位置间接使用了以下第三方代码(可能有修改): -#### py-fsrs +#### py-fsrs (open-spaced-repetition) - 上游版本: 6.3.1 +- 引用方式: vendor - 位置: `src/heurams/vendor/pyfsrs/` - 原项目: [py-fsrs](https://github.com/open-spaced-repetition/py-fsrs) -- 原许可证: Copyright (c) 2026 Open Spaced Repetition Contributors +- 原版权: Copyright (c) 2026 Open Spaced Repetition Contributors +- 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` + +#### SM.js (slaypni) + +- 上游版本: commit `6e3bb4afaf484426deb4a9fa3bcffe42ac066b45` (2015年2月4日上游已停止维护) +- 引用方式: 将 coffeescript 重写为 python 并间接引用, 数学原理一致; 并对重写后代码进行逻辑, 性能与标准化 API 改进 +- 位置: `src/heurams/kernel/algorithms/sm15m*.py` +- 原项目: [SM.js](https://github.com/slaypni/SM-15) +- 原版权: Copyright (c) 2014 Kazuaki Tanida - 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` 本项目受益于他们无私且优秀的工作 diff --git a/data/misc/attics/ana.pkl b/data/misc/attics/ana.pkl index 7099c7c9e1eaef9b13c543682d109ca8b7038abb..e76af3010a9956bc4c04609f72f6947afc207bae 100644 GIT binary patch literal 111 zcmZo*nVP}?0ku;!dN@n+OA>QRGILX>xI1L0-An*V^>F7Gq~;ZrR#oMs7EkdO?BRy8 y<5P=@rg$^-u!H4`Qm1%x^l*aMg{7&bKptZcOHN{O$rN|TTU7Hz>UGAQ!^ literal 111 zcmZo*otnY`0ku;!dN@n+OA>QRGILX>xH|+2?cN8J>fz2WNX;uKt*XjNEuP{n)58sA y$EOw*P4Q;v;RMMSmZp}bPVrXkVaZ7>E}7!)c&p07@`^)h4?9?Q5m1h$R1W|xXeZAA diff --git a/src/heurams/interface/__init__.py b/src/heurams/interface/__init__.py index 2011d63..5d55e74 100644 --- a/src/heurams/interface/__init__.py +++ b/src/heurams/interface/__init__.py @@ -1,5 +1,7 @@ from time import sleep, perf_counter +# import gc +# gc.set_threshold(100, 1, 1) print("欢迎使用基本用户界面!") print("加载配置与上下文... ", end="", flush=True) _start_all = perf_counter() diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index 15ff6b3..bb6fcbf 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -62,7 +62,7 @@ API 版本代号: `{version.codename.capitalize()}` 以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. -您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为基本的全功能前端实现与程序库测试, 位于程序库根目录中的 interface 文件夹. +您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为第一个全功能前端实现与程序库测试套件, 位于程序库根目录中的 interface 文件夹. 您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新. @@ -154,7 +154,7 @@ Textual 框架版本: {textual_version} import distro return f"{distro.name()} {distro.version()}" - except ImportError, AttributeError: + except (ImportError, AttributeError): return platform.platform() else: return platform.platform() diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index e7ecb56..4b90412 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -82,7 +82,7 @@ class DashboardScreen(Screen): a = Attic("ana", {"totaltime": 0, "openpuzzles": 0, "puzzles_err": 0}) yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 yield Label( - f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + '个/s'}", + f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + ' 个每秒'}", id="analysis", ) # 版本信息 yield Footer() diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 55de24b..1275093 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -209,6 +209,8 @@ class MemScreen(Screen): logger.debug(f"Quality: {quality}") self.atom_reporter(quality) if quality <= 3: + from heurams.services.attic import Attic + a = Attic("ana", {"puzzles_err": 0}) a.data["puzzles_err"] += 1 self.procession.append() diff --git a/src/heurams/kernel/reactor/README.md b/src/heurams/kernel/reactor/README.md index 0d48a48..03b56a7 100644 --- a/src/heurams/kernel/reactor/README.md +++ b/src/heurams/kernel/reactor/README.md @@ -51,9 +51,9 @@ Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ | Router | unsure | ['新记忆', '总体复习'] | 新记忆 | ``` -| Type | State | Processions | Current Procession | +| Type | State | Processions | Current Procession | | :----- | :----- | :--------------------- | :----------------- | -| Router | unsure | ['新记忆', '总体复习'] | 新记忆 | +| Router | unsure | ['新记忆', '总体复习'] | 新记忆 | ### 方法 @@ -105,9 +105,9 @@ Router 的 __repr__ 定义了此对象"官方的显示"用作直观的调试.\ | Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ``` -| Type | Name | State | Progress | Procession | Current Atom | +| Type | Name | State | Progress | Procession | Current Atom | | :--------- | :----- | :----- | :------- | :--------------------- | :---------------------------- | -| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | +| Procession | 新记忆 | active | 1 / 2 | ['秦孝公>', '君臣固>'] | 秦孝公据崤函之固, 拥雍州之地, | ### 方法 From b235651db5041e4f04e2755a7896df89acc0cf49 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Fri, 24 Apr 2026 15:40:42 +0800 Subject: [PATCH 53/79] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d16858e..844c6e4 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ - 位置: `src/heurams/vendor/pyfsrs/` - 原项目: [py-fsrs](https://github.com/open-spaced-repetition/py-fsrs) - 原版权: Copyright (c) 2026 Open Spaced Repetition Contributors -- 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` +- 原许可证: MIT License #### SM.js (slaypni) @@ -97,6 +97,6 @@ python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ - 位置: `src/heurams/kernel/algorithms/sm15m*.py` - 原项目: [SM.js](https://github.com/slaypni/SM-15) - 原版权: Copyright (c) 2014 Kazuaki Tanida -- 原许可证: MIT License, 详见 `src/heurams/vendor/pyfsrs/LICENSE` +- 原许可证: MIT License 本项目受益于他们无私且优秀的工作 From 7f2bcf45de9e88786c33f75f9af6c88af1b3c25d Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 25 Apr 2026 01:38:33 +0800 Subject: [PATCH 54/79] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + ARCHITECTURE.md | 485 ++++++++++++-- pyproject.toml | 16 + src/heurams/vendor/pyfsrs/LICENSE | 21 - src/heurams/vendor/pyfsrs/__init__.py | 29 - src/heurams/vendor/pyfsrs/card.py | 167 ----- src/heurams/vendor/pyfsrs/optimizer.py | 674 ------------------- src/heurams/vendor/pyfsrs/py.typed | 0 src/heurams/vendor/pyfsrs/rating.py | 15 - src/heurams/vendor/pyfsrs/review_log.py | 117 ---- src/heurams/vendor/pyfsrs/scheduler.py | 856 ------------------------ src/heurams/vendor/pyfsrs/state.py | 14 - tests/conftest.py | 54 ++ tests/test_base_algorithm.py | 58 ++ tests/test_electron.py | 150 +++++ tests/test_epath.py | 72 ++ tests/test_evalizor.py | 47 ++ tests/test_hasher.py | 25 + tests/test_lict.py | 198 ++++++ tests/test_nsp0.py | 70 ++ tests/test_sm2.py | 123 ++++ tests/test_textproc.py | 35 + uv.lock | 278 ++++++++ 23 files changed, 1573 insertions(+), 1933 deletions(-) delete mode 100644 src/heurams/vendor/pyfsrs/LICENSE delete mode 100644 src/heurams/vendor/pyfsrs/__init__.py delete mode 100644 src/heurams/vendor/pyfsrs/card.py delete mode 100644 src/heurams/vendor/pyfsrs/optimizer.py delete mode 100644 src/heurams/vendor/pyfsrs/py.typed delete mode 100644 src/heurams/vendor/pyfsrs/rating.py delete mode 100644 src/heurams/vendor/pyfsrs/review_log.py delete mode 100644 src/heurams/vendor/pyfsrs/scheduler.py delete mode 100644 src/heurams/vendor/pyfsrs/state.py create mode 100644 tests/conftest.py create mode 100644 tests/test_base_algorithm.py create mode 100644 tests/test_electron.py create mode 100644 tests/test_epath.py create mode 100644 tests/test_evalizor.py create mode 100644 tests/test_hasher.py create mode 100644 tests/test_lict.py create mode 100644 tests/test_nsp0.py create mode 100644 tests/test_sm2.py create mode 100644 tests/test_textproc.py diff --git a/.gitignore b/.gitignore index b6e5eda..c77d7ef 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ data/session build/ dist/ old/ +AGENT.md +AGENTS.md *.log.* # Byte-compiled / optimized / DLL files diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index fe14469..8d18648 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,62 +1,467 @@ -# 项目架构 - -## 架构图(待更新 0.5.0) - -以下 Mermaid 图展示了 HeurAMS 的主要组件及其关系: +## 整体架构概览 ```mermaid graph TB subgraph "用户界面层 (TUI)" - TUI[Textual TUI] - Widgets[界面组件] + TUI[Textual App] Screens[应用屏幕] + Widgets[谜题组件] + end + + subgraph "内核层 Kernel" + Reactor[调度反应器] + Algorithms[算法模块] + Particles[数据模型] + Puzzles[谜题引擎] + RepoLib[仓库系统] + Auxiliary[辅助工具] end subgraph "服务层" - Config[配置管理] + Config[配置管理 ConfigDict] Logger[日志系统] Timer[时间服务] - AudioService[音频服务] - TTSService[TTS服务] - SyncService[同步服务] - OtherServices[其他服务] - end - - subgraph "内核层" - Algorithms[算法模块] - Particles[数据模型] - Puzzles[谜题模块] - Reactor[调度反应器] + Audio[音频服务] + TTS[TTS 服务] + Favorites[收藏管理] + Attic[持久化] + Hasher[哈希服务] end subgraph "提供者层" - AudioProvider[音频提供者] - TTSProvider[TTS提供者] - OtherProviders[其他提供者] + AudioProv[音频提供者] + TTSProv[TTS 提供者] + LLMProv[LLM 提供者] end subgraph "数据层" - Files[本地文件数据] + RepoDir[TOML/JSON 仓库目录] + ConfigDir[TOML 配置目录] + Logs[日志文件] end - subgraph "上下文管理" - Context[ConfigContext] - CtxVar[config_var] - end - - TUI --> Config - TUI --> Logger - TUI --> AudioService - TUI --> TTSService - TUI --> OtherServices - Config --> Files - Config --> Context - AudioService --> AudioProvider - TTSService --> TTSProvider - OtherServices --> OtherProviders + TUI --> Screens + Screens --> Reactor + Screens --> RepoLib + Screens --> Widgets + Widgets --> Puzzles + Widgets --> Reactor Reactor --> Algorithms Reactor --> Particles Reactor --> Puzzles - Particles --> Files - Algorithms --> Files + Particles --> RepoLib + RepoLib --> Config + RepoLib --> Auxiliary + Auxiliary --> Lict + Auxiliary --> Evalizer + TUI --> Config + TUI --> Logger + TUI --> Audio + TUI --> TTS + Config --> ConfigDir + Audio --> AudioProv + TTS --> TTSProv + Attic --> RepoDir ``` + +## 数据模型 + +项目以物理粒子隐喻为核心, 将记忆单元拆解为三个模型: + +### Nucleon (核子) — 内容层 + +``` +Nucleon(ident, payload, common) +``` + +- **只读**内容容器. 通过 `Evalizer` (基于 `eval()` 的模板系统)对 payload 和 common 进行编译展开. +- 包含 `puzzles` 字段, 定义该记忆单元支持哪些谜题类型. +- 从 `repo.payload` 和 `repo.typedef["common"]` 配对创建. +- 一旦创建, 内容不可修改 (`__setitem__` 抛出 `AttributeError`). + +### Electron (电子) — 状态层 + +``` +Electron(ident, algodata, algo_name) +``` + +- 算法状态数据的包装器. 每个 Electron 绑定一个算法 (`algorithms[algo_name]`). +- `algodata` 是到仓库 `algodata.lict` 中对应字典的**引用**, 修改即持久化. +- 核心方法:`activate()` (标记激活)、`revisor()` (评分迭代)、`is_due()` (到期判断). + +### Orbital (轨道) — 策略层 + +``` +orbital = { + "schedule": ["quick_review", "recognition"], + "routes": { + "quick_review": [["MCQ", "1.0"], ["Cloze", "0.5"]], + "recognition": [["Recognition", "1.0"]], + } +} +``` + +- 定义复习阶段流程和各阶段内谜题选择策略的纯字典. +- 每个阶段对应一组 `(谜题类型, 概率系数)` 元组列表, 概率系数 >1 的部分表示强制重复次数. + +### Atom (原子) — 运行时组装 + +``` +Atom(nucleon, electron, orbital) +``` + +- 三者的运行时组合, 附带 `runtime` 运行时标志 (`locked`, `min_rate`, `new_activation`). +- 是 UI 和调度层操作的基本单位. +- `revise()` 方法在 `locked` 为真时调用 `electron.revisor(min_rate)`, 执行最终评分迭代. + +**关系图**: + +```mermaid +graph LR + subgraph "持久化存储" + Payload[(payload.toml)] + Common[(typedef.toml)] + Algodata[(algodata.json)] + Schedule[(schedule.toml)] + end + + subgraph "运行时组装" + Nucleon -->|内容| Atom + Electron -->|状态| Atom + Orbital -->|策略| Atom + end + + Payload --> Nucleon + Common --> Nucleon + Algodata --> Electron + Schedule --> Orbital +``` + +--- + +## 调度反应器 (Reactor) + +调度反应器是核心业务流程引擎, 采用三层嵌套的有限状态机设计 (基于 `transitions` 库). + +### 状态枚举定义 + +| 状态机 | 状态 | 说明 | +|--------|------|------| +| **RouterState** | `unsure` | 初始状态, 自动推进 | +| | `quick_review` | 快速复习阶段 | +| | `recognition` | 新记忆识别阶段 | +| | `final_review` | 最终总复习阶段 | +| | `finished` | 完成, 执行评分 | +| **ProcessionState** | `active` | 进行中 | +| | `finished` | 已完成 | +| **ExpanderState** | `exammode` | 考试模式 (正面答题) | +| | `retronly` | 回溯模式 (仅识别) | + +### 三层嵌套结构 + +```mermaid +graph TB + subgraph "Router (全局路由器)" + R[Router
状态: unsure→quick_review→recognition→final_review→finished] + P1[Procession 队列1: 快速复习] + P2[Procession 队列2: 新记忆] + P3[Procession 队列3: 总复习] + R --> P1 + R --> P2 + R --> P3 + end + + subgraph "Procession (单阶段队列)" + P1 --> E1[Expander 原子A] + P1 --> E2[Expander 原子B] + P1 --> E3[Expander 原子C] + M{forward 推进} --> |完成| Finish((FINISHED)) + end + + subgraph "Expander (单原子展开器)" + E1 --> S[(轨道策略)] + S -->|概率展开| PZ1[谜题1: MCQ] + S -->|概率展开| PZ2[谜题2: Cloze] + PZ1 -->|评分| RPT[report] + PZ2 -->|评分| RPT + RPT -->|finish| RETRO[retronly 回溯模式] + end +``` + +### 数据流详解 + +``` +Router.__init__(atoms) + │ + ├─ 新旧原子分流 + │ ├─ old_atoms → Procession(quick_review) "初始复习" + │ └─ new_atoms → Procession(recognition) "新记忆" + │ + └─ 所有原子 → Procession(final_review) "总体复习" + │ + └─ Procession.forward() + │ + ├─ cursor >= len(atoms) → finish() + └─ cursor < len(atoms) → next_atom + │ + └─ Procession.get_expander() + │ + └─ Expander(atom, route) + │ + ├─ 读取 orbital.routes[route_value] + ├─ 概率展开为谜题列表 self.puzzles_inf + ├─ exammode → 依次展示谜题 + ├─ report(rating) → 记录最低评分 + ├─ forward() → 下一个谜题或 finish → retronly + └─ retronly → 展示 Recognition + │ + └─ Atom.revise() + │ + └─ Electron.revisor(min_rate) + │ + └─ Algorithm.revisor(algodata, feedback) +``` + +--- + +## 算法系统 + +所有算法继承自 `BaseAlgorithm`, 以类方法的风格实现, 通过 `algorithms` 字典注册. + +| 算法 | 文件 | 状态 | 说明 | +|------|------|------|------| +| **SM-2** | `sm2.py` | ✅ 完成 | 经典 SuperMemo 1987 算法 | +| **NSP-0** | `nsp0.py` | ✅ 完成 | 非间隔过滤调度器 | +| **SM-15M** | `sm15m.py` + `sm15m_calc.py` | ✅ 完成 | 从 CoffeeScript 移植的 SM-15 | +| **FSRS** | `fsrs.py` | ❌ 未实现 | 进度: `logger.info("尚未实现")` | +| **Base** | `base.py` | ✅ 基类 | 定义 `AlgodataDict` 结构和默认值 | + +每个算法提供以下类方法: + +| 方法 | 功能 | +|------|------| +| `revisor(algodata, feedback, is_new_activation)` | 根据评分迭代记忆数据 | +| `is_due(algodata)` | 判断是否到期复习 | +| `get_rating(algodata)` | 获取评分信息 | +| `nextdate(algodata)` | 获取下一次复习时间戳 | +| `check_integrity(algodata)` | 校验 algodata 数据结构完整性 | + +### 算法数据结构 (AlgodataDict) + +```python +{ + "real_rept": int, # 实际复习次数 + "rept": int, # 当前重复计数 + "interval": int, # 间隔天数 + "last_date": int, # 上次复习日期 + "next_date": int, # 下次到期日期 + "is_activated": int, # 是否已激活 (0/1) + "last_modify": float, # 最后修改时间戳 +} +``` + +--- + +## 仓库系统 (Repo) + +仓库是 TOML/JSON 文件目录, 无数据库依赖. + +### 目录结构 + +``` +data/repo// +├── manifest.toml # 元信息: title, author, package, desc +├── typedef.toml # 通用元数据、谜题定义、注解 +├── payload.toml # 记忆条目 (key=ident) +├── algodata.json # 算法状态 (key=ident) +└── schedule.toml # 轨道/复习策略 +``` + +### Repo 类设计 + +```mermaid +classDiagram + class Repo { + +dict schedule + +Lict payload + +dict manifest + +dict typedef + +Lict algodata + +Path source + +Lict nucleonic_data_lict + +dict orbitic_data + +Lict electronic_data_lict + +from_repodir(source) ~Repo + +from_dict(dictdata) ~Repo + +create_new_repo() ~Repo + +persist_to_repodir(save_list, source) + +export_to_dict() dict + } +``` + +- `payload` 和 `algodata` 使用 `Lict` (列表+字典混合容器), 支持双模式访问. +- `_generate_particles_data()` 在初始化时自动将 payload 数据转换为 `Nucleon` 所需的格式. +- 默认保存列表 `default_save_list = ["algodata"]`, 仅持久化算法状态. + +--- + +## Lict 集合 + +`Lict` 继承 `MutableSequence`, 同时维护列表和字典访问: + +```python +lict = Lict() +lict.append(("key1", value1)) # 列表追加 +lict["key1"] # 字典访问 +lict[0] # 索引访问 +lict.keys() # 所有键 +lict.dicted_data # 纯字典导出 +``` + +脏同步机制:修改列表时自动同步字典, 修改字典时自动同步列表. 用于 `payload` 和 `algodata` 的双模式访问需求. + +--- + +## 配置系统 (ConfigDict) + +`ConfigDict` 继承 `UserDict`, 是**单例模式**的 TOML 懒加载配置管理器. + +### 配置目录约定 + +``` +data/config/ +├── _.toml # 顶层默认值 (递归合并) +├── interface/ +│ ├── _.toml # interface 层默认值 +│ ├── global.toml +│ └── puzzles.toml +├── services/ +│ ├── _.toml # services 层默认值 +│ ├── audio.toml +│ └── tts.toml +└── repo/ + └── _.toml +``` + +- `_.toml` 文件 = 该目录层级的默认值, 合并到父级 +- 带后缀文件 = 按需懒加载 +- 子目录 = 递归子配置 + +### 上下文管理 + +```python +from heurams.context import config_var, ConfigContext + +# 全局访问 +config = config_var.get() +algo = config["interface"]["global"]["algorithm"] + +# 作用域覆盖 +with ConfigContext(test_config): + ... # 临时使用测试配置 +``` + +--- + +## 提供者系统 (Providers) + +可插拔的后端实现, 通过 `providers/__init__.py` 中的字典注册. + +| 类别 | 提供者 | 说明 | +|------|--------|------| +| **TTS** | `edge_tts` | Microsoft Edge TTS (在线) | +| | `basetts` | 桩基类 (未实现) | +| **Audio** | `playsound` | 跨平台音频播放 | +| | `termux` | Android Termux 环境 | +| **LLM** | `openai` | OpenAI 兼容 API (未完整实现) | + +选择方式:`services/*.toml` 中的 `provider` 字段. + +--- + +## 谜题系统 (Puzzles) + +谜题引擎用于在复习阶段生成评估视图: + +| 谜题 | 文件 | 说明 | +|------|------|------| +| **MCQ** | `mcq.py` | 选择题 (Multiple Choice) | +| **Cloze** | `cloze.py` | 完形填空 (Cloze Deletion) | +| **Recognition** | `recognition.py` | 认读识别 | +| **Guess** | `guess.py` | 猜测词义 | +| **Base** | `base.py` | 抽象基类 | + +谜题通过轨道策略 (Orbital)在 `Expander` 中按概率展开, 每个原子可产生多个谜题, 每个谜题独立评分. + +--- + +## 服务层 + +| 服务 | 文件 | 说明 | +|------|------|------| +| **Config** | `config.py` | `ConfigDict(UserDict)` TOML 懒加载单例 | +| **Logger** | `logger.py` | `get_logger(name)` → 层级日志 (`heurams.*`) | +| **Timer** | `timer.py` | `get_daystamp()` / `get_timestamp()`, 支持可配置覆盖 | +| **Audio** | `audio_service.py` | 音频播放, 路由到配置的音频提供者 | +| **TTS** | `tts_service.py` | 文本转语音, 路由到配置的 TTS 提供者 | +| **Favorites** | `favorite_service.py` | JSON5 持久化的收藏管理器 (单例) | +| **Attic** | `attic.py` | 结构化 pickle 持久化, 支持 ``/`` 占位符 | +| **Hasher** | `hasher.py` | MD5 哈希 | +| **Epath** | `epath.py` | 点符号嵌套字典访问 (`epath(dct, "a.b.c")`) | +| **TextProc** | `textproc.py` | `truncate()`, `domize()`, `undomize()` | + +日志系统:每个模块通过 `get_logger(__name__)` 创建自己的日志器, 日志文件 10MB 轮转, 最多 5 个备份, 追加到 `heurams.log`. + +--- + +## 复习全流程 + +```mermaid +sequenceDiagram + participant User as 用户 + participant UI as TUI + participant Router as Router + participant Procession as Procession + participant Expander as Expander + participant Atom as Atom + participant Electron as Electron + participant Algo as Algorithm + + User->>UI: 开始复习 + UI->>Router: Router(atoms) + Router->>Procession: 创建复习队列 + Router->>Procession: 创建新记忆队列 + Router->>Procession: 创建总复习队列 + Procession->>Expander: 展开当前原子 + Expander->>Expander: 解析轨道策略 + Expander-->>UI: 展示谜题 + User->>UI: 评分 (1-5) + UI->>Expander: report(rating) + Expander->>Expander: forward() 下一个谜题 + Expander-->>UI: 下一个谜题或回溯 + Expander->>Expander: finish() → retronly + Expander-->>UI: Recognition 回溯 + User->>UI: 最终评分 + UI->>Atom: revise() + Atom->>Electron: revisor(min_rate) + Electron->>Algo: revisor(algodata, feedback) + Algo-->>Electron: 更新 algodata + Algo-->>Atom: 更新 interval, next_date + Procession->>Procession: forward() 下一原子 + Procession-->>Router: 队列完成 + Router->>Router: 切换阶段 + Router-->>UI: 完成 (finished) + UI->>User: 显示总结 +``` + +--- + +## 关键设计决策 + +1. **无数据库** — 所有持久化基于 TOML/JSON 文件目录, 方便版本管理和手动编辑. +2. **Lict 双模式访问** — payload 和 algodata 同时支持列表迭代和字典查找, 兼顾批处理和随机访问. +3. **物理隐喻分离** — 内容 (Nucleon)、状态 (Electron)、策略 (Orbital) 三者正交, 可独立替换, 便于组合不同算法和内容类型. +4. **transitions 状态机** — 使用 `transitions` 库实现 Router → Procession → Expander 三层嵌套状态机, 每个层次职责明确. +5. **Evalizer eval 模板** — 使用 `eval()` 实现动态模板替换, 功能灵活但存在安全风险 (标记为待替换). +6. **配置单例** — `ConfigDict` 以规范化路径为键实现单例, 避免多实例导致的配置不一致问题. +7. **评分累积** — 原子在多谜题阶段的最终评分取所有谜题的最低评分 (`min_rate`), 确保严格评估. diff --git a/pyproject.toml b/pyproject.toml index 68abe9b..28961fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ license = "AGPL-3.0-or-later" license-files = ["LICENSE"] dependencies = [ + "fsrs>=6.3.1", #"edge-tts>=7.2.8", #"jieba>=0.42.1", #"openai>=2.32.0", @@ -34,6 +35,21 @@ Issues = "https://github.com/heurams/heurams/issues" heurams = "heurams.__main__:main" tui = "heurams.interface.__main__:main" +[dependency-groups] +dev = [ + "pytest>=8.0.0", + "pytest-cov>=6.0.0", +] + +[tool.pytest.ini_options] +testpaths = ["tests"] +python_files = ["test_*.py", "*_test.py"] +pythonpath = ["src"] +markers = [ + "slow: marks tests as slow (deselect with '-m \"not slow\"')", + "integration: marks tests as integration tests", +] + [build-system] requires = ["uv_build>=0.7.19"] build-backend = "uv_build" diff --git a/src/heurams/vendor/pyfsrs/LICENSE b/src/heurams/vendor/pyfsrs/LICENSE deleted file mode 100644 index 29d7488..0000000 --- a/src/heurams/vendor/pyfsrs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Open Spaced Repetition - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/heurams/vendor/pyfsrs/__init__.py b/src/heurams/vendor/pyfsrs/__init__.py deleted file mode 100644 index ae59e0d..0000000 --- a/src/heurams/vendor/pyfsrs/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -py-fsrs -------- - -Py-FSRS is the official Python implementation of the FSRS scheduler algorithm, which can be used to develop spaced repetition systems. -""" - -from fsrs.scheduler import Scheduler -from fsrs.state import State -from fsrs.card import Card -from fsrs.rating import Rating -from fsrs.review_log import ReviewLog -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from fsrs.optimizer import Optimizer - - -# lazy load the Optimizer module due to heavy dependencies -def __getattr__(name: str) -> type: - if name == "Optimizer": - global Optimizer - from fsrs.optimizer import Optimizer - - return Optimizer - raise AttributeError - - -__all__ = ["Scheduler", "Card", "Rating", "ReviewLog", "State", "Optimizer"] diff --git a/src/heurams/vendor/pyfsrs/card.py b/src/heurams/vendor/pyfsrs/card.py deleted file mode 100644 index 2531ea1..0000000 --- a/src/heurams/vendor/pyfsrs/card.py +++ /dev/null @@ -1,167 +0,0 @@ -""" -fsrs.card ---------- - -This module defines the Card and State classes. - -Classes: - Card: Represents a flashcard in the FSRS system. - State: Enum representing the learning state of a Card object. -""" - -from __future__ import annotations -from dataclasses import dataclass -from datetime import datetime, timezone -import time -import json -from typing import TypedDict -from typing_extensions import Self -from fsrs.state import State - - -class CardDict(TypedDict): - """ - JSON-serializable dictionary representation of a Card object. - """ - - card_id: int - state: int - step: int | None - stability: float | None - difficulty: float | None - due: str - last_review: str | None - - -@dataclass(init=False) -class Card: - """ - Represents a flashcard in the FSRS system. - - Attributes: - card_id: The id of the card. Defaults to the epoch milliseconds of when the card was created. - state: The card's current learning state. - step: The card's current learning or relearning step or None if the card is in the Review state. - stability: Core mathematical parameter used for future scheduling. - difficulty: Core mathematical parameter used for future scheduling. - due: The date and time when the card is due next. - last_review: The date and time of the card's last review. - """ - - card_id: int - state: State - step: int | None - stability: float | None - difficulty: float | None - due: datetime - last_review: datetime | None - - def __init__( - self, - card_id: int | None = None, - state: State = State.Learning, - step: int | None = None, - stability: float | None = None, - difficulty: float | None = None, - due: datetime | None = None, - last_review: datetime | None = None, - ) -> None: - if card_id is None: - # epoch milliseconds of when the card was created - card_id = int(datetime.now(timezone.utc).timestamp() * 1000) - # wait 1ms to prevent potential card_id collision on next Card creation - time.sleep(0.001) - self.card_id = card_id - - self.state = state - - if self.state == State.Learning and step is None: - step = 0 - self.step = step - - self.stability = stability - self.difficulty = difficulty - - if due is None: - due = datetime.now(timezone.utc) - self.due = due - - self.last_review = last_review - - def to_dict(self) -> CardDict: - """ - Returns a dictionary representation of the Card object. - - Returns: - CardDict: A dictionary representation of the Card object. - """ - - return { - "card_id": self.card_id, - "state": self.state.value, - "step": self.step, - "stability": self.stability, - "difficulty": self.difficulty, - "due": self.due.isoformat(), - "last_review": self.last_review.isoformat() if self.last_review else None, - } - - @classmethod - def from_dict(cls, source_dict: CardDict) -> Self: - """ - Creates a Card object from an existing dictionary. - - Args: - source_dict: A dictionary representing an existing Card object. - - Returns: - Self: A Card object created from the provided dictionary. - """ - - return cls( - card_id=int(source_dict["card_id"]), - state=State(int(source_dict["state"])), - step=source_dict["step"], - stability=( - float(source_dict["stability"]) if source_dict["stability"] else None - ), - difficulty=( - float(source_dict["difficulty"]) if source_dict["difficulty"] else None - ), - due=datetime.fromisoformat(source_dict["due"]), - last_review=( - datetime.fromisoformat(source_dict["last_review"]) - if source_dict["last_review"] - else None - ), - ) - - def to_json(self, indent: int | str | None = None) -> str: - """ - Returns a JSON-serialized string of the Card object. - - Args: - indent: Equivalent argument to the indent in json.dumps() - - Returns: - str: A JSON-serialized string of the Card object. - """ - return json.dumps(self.to_dict(), indent=indent) - - @classmethod - def from_json(cls, source_json: str) -> Self: - """ - Creates a Card object from a JSON-serialized string. - - Args: - source_json: A JSON-serialized string of an existing Card object. - - Returns: - Self: A Card object created from the JSON string. - """ - - source_dict: CardDict = json.loads(source_json) - return cls.from_dict(source_dict=source_dict) - - -__all__ = ["Card"] diff --git a/src/heurams/vendor/pyfsrs/optimizer.py b/src/heurams/vendor/pyfsrs/optimizer.py deleted file mode 100644 index d19c9bb..0000000 --- a/src/heurams/vendor/pyfsrs/optimizer.py +++ /dev/null @@ -1,674 +0,0 @@ -""" -fsrs.optimizer ---------- - -This module defines the optional Optimizer class. -""" - -from fsrs.card import Card -from fsrs.review_log import ReviewLog, Rating -from fsrs.scheduler import ( - Scheduler, - DEFAULT_PARAMETERS, - LOWER_BOUNDS_PARAMETERS, - UPPER_BOUNDS_PARAMETERS, -) - -import math -from datetime import datetime, timezone -from copy import deepcopy -from random import Random -from statistics import mean - -try: - import torch - from torch.nn import BCELoss - from torch import optim - import pandas as pd - from tqdm import tqdm - - # weight clipping - LOWER_BOUNDS_PARAMETERS_TENSORS = torch.tensor( - LOWER_BOUNDS_PARAMETERS, - dtype=torch.float64, - ) - - UPPER_BOUNDS_PARAMETERS_TENSORS = torch.tensor( - UPPER_BOUNDS_PARAMETERS, - dtype=torch.float64, - ) - - # hyper parameters - num_epochs = 5 - mini_batch_size = 512 - learning_rate = 4e-2 - max_seq_len = ( - 64 # up to the first 64 reviews of each card are used for optimization - ) - - class Optimizer: - """ - The FSRS optimizer. - - Enables the optimization of FSRS scheduler parameters from existing review logs for more accurate interval calculations. - - Attributes: - review_logs: A collection of previous ReviewLog objects from a user. - _revlogs_train: The collection of review logs, sorted and formatted for optimization. - """ - - review_logs: tuple[ReviewLog, ...] - _revlogs_train: dict - - def __init__( - self, review_logs: tuple[ReviewLog, ...] | list[ReviewLog] - ) -> None: - """ - Initializes the Optimizer with a set of ReviewLogs. Also formats a copy of the review logs for optimization. - - Note that the ReviewLogs provided by the user don't need to be in order. - """ - - def _format_revlogs() -> dict: - """ - Sorts and converts the tuple of ReviewLog objects to a dictionary format for optimizing - """ - - revlogs_train = {} - for review_log in self.review_logs: - # pull data out of current ReviewLog object - card_id = review_log.card_id - rating = review_log.rating - review_datetime = review_log.review_datetime - review_duration = review_log.review_duration - - # if the card was rated Again, it was not recalled - recall = 0 if rating == Rating.Again else 1 - - # as a ML problem, [x, y] = [ [review_datetime, rating, review_duration], recall ] - datum = [[review_datetime, rating, review_duration], recall] - - if card_id not in revlogs_train: - revlogs_train[card_id] = [] - - revlogs_train[card_id].append((datum)) - revlogs_train[card_id] = sorted( - revlogs_train[card_id], key=lambda x: x[0][0] - ) # keep reviews sorted - - # sort the dictionary in order of when each card history starts - revlogs_train = dict(sorted(revlogs_train.items())) - - return revlogs_train - - self.review_logs = deepcopy(tuple(review_logs)) - - # format the ReviewLog data for optimization - self._revlogs_train = _format_revlogs() - - def _compute_batch_loss(self, *, parameters: list[float]) -> float: - """ - Computes the current total loss for the entire batch of review logs. - """ - - card_ids = list(self._revlogs_train.keys()) - params = torch.tensor(parameters, dtype=torch.float64) - loss_fn = BCELoss() - scheduler = Scheduler(parameters=params) - step_losses = [] - - for card_id in card_ids: - card_review_history = self._revlogs_train[card_id][:max_seq_len] - - for i in range(len(card_review_history)): - review = card_review_history[i] - - x_date = review[0][0] - y_retrievability = review[1] - u_rating = review[0][1] - - if i == 0: - card = Card(card_id=card_id, due=x_date) - - y_pred_retrievability = scheduler.get_card_retrievability( - card=card, current_datetime=x_date - ) - y_retrievability = torch.tensor( - y_retrievability, dtype=torch.float64 - ) - - if card.last_review and (x_date - card.last_review).days > 0: - step_loss = loss_fn(y_pred_retrievability, y_retrievability) - step_losses.append(step_loss) - - card, _ = scheduler.review_card( - card=card, - rating=u_rating, - review_datetime=x_date, - review_duration=None, - ) - - batch_loss = torch.sum(torch.stack(step_losses)) - batch_loss = batch_loss.item() / len(step_losses) - - return batch_loss - - def compute_optimal_parameters(self, verbose: bool = False) -> list[float]: - """ - Computes a set of optimized parameters for the FSRS scheduler and returns it as a list of floats. - - High level explanation of optimization: - --------------------------------------- - FSRS is a many-to-many sequence model where the "State" at each step is a Card object at a given point in time, - the input is the time of the review and the output is the predicted retrievability of the card at the time of review. - - Each card's review history can be thought of as a sequence, each review as a step and each collection of card review histories - as a batch. - - The loss is computed by comparing the predicted retrievability of the Card at each step with whether the Card was actually - sucessfully recalled or not (0/1). - - Finally, the card objects at each step in their sequences are updated using the current parameters of the Scheduler - as well as the rating given to that card by the user. The parameters of the Scheduler is what is being optimized. - """ - - def _num_reviews() -> int: - """ - Computes how many Review-state reviews there are in the dataset. - Only the loss from Review-state reviews count for optimization and their number must - be computed in advance to properly initialize the Cosine Annealing learning rate scheduler. - """ - - scheduler = Scheduler() - num_reviews = 0 - # iterate through the card review histories - card_ids = list(self._revlogs_train.keys()) - for card_id in card_ids: - card_review_history = self._revlogs_train[card_id][:max_seq_len] - - # iterate through the current Card's review history - for i in range(len(card_review_history)): - review = card_review_history[i] - - review_datetime = review[0][0] - rating = review[0][1] - - # if this is the first review, create the Card object - if i == 0: - card = Card(card_id=card_id, due=review_datetime) - - # only non-same-day reviews count - if ( - card.last_review - and (review_datetime - card.last_review).days > 0 - ): - num_reviews += 1 - - card, _ = scheduler.review_card( - card=card, - rating=rating, - review_datetime=review_datetime, - review_duration=None, - ) - - return num_reviews - - def _update_parameters( - *, - step_losses: list, - adam_optimizer: torch.optim.Adam, - params: torch.Tensor, - lr_scheduler: torch.optim.lr_scheduler.CosineAnnealingLR, - ) -> None: - """ - Computes and updates the current FSRS parameters based on the step losses. Also updates the learning rate scheduler. - """ - - # Backpropagate through the loss - mini_batch_loss = torch.sum(torch.stack(step_losses)) - adam_optimizer.zero_grad() # clear previous gradients - mini_batch_loss.backward() # compute gradients - adam_optimizer.step() # Update parameters - - # clamp the weights in place without modifying the computational graph - with torch.no_grad(): - params.clamp_( - min=LOWER_BOUNDS_PARAMETERS_TENSORS, - max=UPPER_BOUNDS_PARAMETERS_TENSORS, - ) - - # update the learning rate - lr_scheduler.step() - - # set local random seed for reproducibility - rng = Random(42) - - card_ids = list(self._revlogs_train.keys()) - - num_reviews = _num_reviews() - - if num_reviews < mini_batch_size: - return list(DEFAULT_PARAMETERS) - - # Define FSRS Scheduler parameters as torch tensors with gradients - params = torch.tensor( - DEFAULT_PARAMETERS, requires_grad=True, dtype=torch.float64 - ) - - loss_fn = BCELoss() - adam_optimizer = optim.Adam([params], lr=learning_rate) - lr_scheduler = optim.lr_scheduler.CosineAnnealingLR( - optimizer=adam_optimizer, - T_max=math.ceil(num_reviews / mini_batch_size) * num_epochs, - ) - - best_params = None - best_loss = math.inf - # iterate through the epochs - for _ in tqdm( - range(num_epochs), - desc="Optimizing", - unit="epoch", - disable=(not verbose), - ): - # randomly shuffle the order of which Card's review histories get computed first - # at the beginning of each new epoch - rng.shuffle(card_ids) - - # initialize new scheduler with updated parameters each epoch - scheduler = Scheduler(parameters=params) - - # stores the computed loss of each individual review - step_losses = [] - - # iterate through the card review histories (sequences) - for card_id in card_ids: - card_review_history = self._revlogs_train[card_id][:max_seq_len] - - # iterate through the current Card's review history (steps) - for i in range(len(card_review_history)): - review = card_review_history[i] - - # input - x_date = review[0][0] - # target - y_retrievability = review[1] - # update - u_rating = review[0][1] - - # if this is the first review, create the Card object - if i == 0: - card = Card(card_id=card_id, due=x_date) - - # predicted target - y_pred_retrievability = scheduler.get_card_retrievability( - card=card, current_datetime=x_date - ) - y_retrievability = torch.tensor( - y_retrievability, dtype=torch.float64 - ) - - # only compute step-loss on non-same-day reviews - if card.last_review and (x_date - card.last_review).days > 0: - step_loss = loss_fn(y_pred_retrievability, y_retrievability) - step_losses.append(step_loss) - - # update the card's state - card, _ = scheduler.review_card( - card=card, - rating=u_rating, - review_datetime=x_date, - review_duration=None, - ) - - # take a gradient step after each mini-batch - if len(step_losses) == mini_batch_size: - _update_parameters( - step_losses=step_losses, - adam_optimizer=adam_optimizer, - params=params, - lr_scheduler=lr_scheduler, - ) - - # update the scheduler's with the new parameters - scheduler = Scheduler(parameters=params) - # clear the step losses for next batch - step_losses = [] - - # remove gradient history from tensor card parameters for next batch - card.stability = card.stability.detach() - card.difficulty = card.difficulty.detach() - - # update params on remaining review logs - if len(step_losses) > 0: - _update_parameters( - step_losses=step_losses, - adam_optimizer=adam_optimizer, - params=params, - lr_scheduler=lr_scheduler, - ) - - # compute the current batch loss after each epoch - detached_params = [ - x.detach().item() for x in list(params.detach()) - ] # convert to floats - with torch.no_grad(): - epoch_batch_loss = self._compute_batch_loss( - parameters=detached_params - ) - - # if the batch loss is better with the current parameters, update the current best parameters - if epoch_batch_loss < best_loss: - best_loss = epoch_batch_loss - best_params = detached_params - - return best_params - - def _compute_probs_and_costs(self) -> dict[str, float]: - review_log_df = pd.DataFrame( - vars(review_log) for review_log in self.review_logs - ) - - review_log_df = review_log_df.sort_values( - by=["card_id", "review_datetime"], ascending=[True, True] - ).reset_index(drop=True) - - # dictionary to return - probs_and_costs_dict = {} - - # compute the probabilities and costs of the first rating - first_reviews_df = review_log_df.loc[ - ~review_log_df["card_id"].duplicated(keep="first") - ].reset_index(drop=True) - - first_again_reviews_df = first_reviews_df.loc[ - first_reviews_df["rating"] == Rating.Again - ] - first_hard_reviews_df = first_reviews_df.loc[ - first_reviews_df["rating"] == Rating.Hard - ] - first_good_reviews_df = first_reviews_df.loc[ - first_reviews_df["rating"] == Rating.Good - ] - first_easy_reviews_df = first_reviews_df.loc[ - first_reviews_df["rating"] == Rating.Easy - ] - - # compute the probability of the user clicking again/hard/good/easy given it's their first review - num_first_again = len(first_again_reviews_df) - num_first_hard = len(first_hard_reviews_df) - num_first_good = len(first_good_reviews_df) - num_first_easy = len(first_easy_reviews_df) - - num_first_review = ( - num_first_again + num_first_hard + num_first_good + num_first_easy - ) - - prob_first_again = num_first_again / num_first_review - prob_first_hard = num_first_hard / num_first_review - prob_first_good = num_first_good / num_first_review - prob_first_easy = num_first_easy / num_first_review - - probs_and_costs_dict["prob_first_again"] = prob_first_again - probs_and_costs_dict["prob_first_hard"] = prob_first_hard - probs_and_costs_dict["prob_first_good"] = prob_first_good - probs_and_costs_dict["prob_first_easy"] = prob_first_easy - - # compute the cost of the user clicking again/hard/good/easy on their first review - first_again_review_durations = list( - first_again_reviews_df["review_duration"] - ) - first_hard_review_durations = list(first_hard_reviews_df["review_duration"]) - first_good_review_durations = list(first_good_reviews_df["review_duration"]) - first_easy_review_durations = list(first_easy_reviews_df["review_duration"]) - - avg_first_again_review_duration = ( - mean(first_again_review_durations) - if first_again_review_durations - else 0 - ) - avg_first_hard_review_duration = ( - mean(first_hard_review_durations) if first_hard_review_durations else 0 - ) - avg_first_good_review_duration = ( - mean(first_good_review_durations) if first_good_review_durations else 0 - ) - avg_first_easy_review_duration = ( - mean(first_easy_review_durations) if first_easy_review_durations else 0 - ) - - probs_and_costs_dict["avg_first_again_review_duration"] = ( - avg_first_again_review_duration - ) - probs_and_costs_dict["avg_first_hard_review_duration"] = ( - avg_first_hard_review_duration - ) - probs_and_costs_dict["avg_first_good_review_duration"] = ( - avg_first_good_review_duration - ) - probs_and_costs_dict["avg_first_easy_review_duration"] = ( - avg_first_easy_review_duration - ) - - # compute the probabilities and costs of non-first ratings - non_first_reviews_df = review_log_df.loc[ - review_log_df["card_id"].duplicated(keep="first") - ].reset_index(drop=True) - - again_reviews_df = non_first_reviews_df.loc[ - non_first_reviews_df["rating"] == Rating.Again - ] - hard_reviews_df = non_first_reviews_df.loc[ - non_first_reviews_df["rating"] == Rating.Hard - ] - good_reviews_df = non_first_reviews_df.loc[ - non_first_reviews_df["rating"] == Rating.Good - ] - easy_reviews_df = non_first_reviews_df.loc[ - non_first_reviews_df["rating"] == Rating.Easy - ] - - # compute the probability of the user clicking hard/good/easy given they correctly recalled the card - num_hard = len(hard_reviews_df) - num_good = len(good_reviews_df) - num_easy = len(easy_reviews_df) - - num_recall = num_hard + num_good + num_easy - - prob_hard = num_hard / num_recall - prob_good = num_good / num_recall - prob_easy = num_easy / num_recall - - probs_and_costs_dict["prob_hard"] = prob_hard - probs_and_costs_dict["prob_good"] = prob_good - probs_and_costs_dict["prob_easy"] = prob_easy - - again_review_durations = list(again_reviews_df["review_duration"]) - hard_review_durations = list(hard_reviews_df["review_duration"]) - good_review_durations = list(good_reviews_df["review_duration"]) - easy_review_durations = list(easy_reviews_df["review_duration"]) - - avg_again_review_duration = ( - mean(again_review_durations) if again_review_durations else 0 - ) - avg_hard_review_duration = ( - mean(hard_review_durations) if hard_review_durations else 0 - ) - avg_good_review_duration = ( - mean(good_review_durations) if good_review_durations else 0 - ) - avg_easy_review_duration = ( - mean(easy_review_durations) if easy_review_durations else 0 - ) - - probs_and_costs_dict["avg_again_review_duration"] = ( - avg_again_review_duration - ) - probs_and_costs_dict["avg_hard_review_duration"] = avg_hard_review_duration - probs_and_costs_dict["avg_good_review_duration"] = avg_good_review_duration - probs_and_costs_dict["avg_easy_review_duration"] = avg_easy_review_duration - - return probs_and_costs_dict - - def _simulate_cost( - self, - *, - desired_retention: float, - parameters: tuple[float, ...] | list[float], - num_cards_simulate: int, - probs_and_costs_dict: dict[str, float], - ) -> float: - rng = Random(42) - - # simulate from the beginning of 2025 till before the beginning of 2026 - start_date = datetime(2025, 1, 1, 0, 0, 0, 0, timezone.utc) - end_date = datetime(2026, 1, 1, 0, 0, 0, 0, timezone.utc) - - scheduler = Scheduler( - parameters=parameters, - desired_retention=desired_retention, - enable_fuzzing=False, - ) - - # unpack probs_and_costs_dict - prob_first_again = probs_and_costs_dict["prob_first_again"] - prob_first_hard = probs_and_costs_dict["prob_first_hard"] - prob_first_good = probs_and_costs_dict["prob_first_good"] - prob_first_easy = probs_and_costs_dict["prob_first_easy"] - - avg_first_again_review_duration = probs_and_costs_dict[ - "avg_first_again_review_duration" - ] - avg_first_hard_review_duration = probs_and_costs_dict[ - "avg_first_hard_review_duration" - ] - avg_first_good_review_duration = probs_and_costs_dict[ - "avg_first_good_review_duration" - ] - avg_first_easy_review_duration = probs_and_costs_dict[ - "avg_first_easy_review_duration" - ] - - prob_hard = probs_and_costs_dict["prob_hard"] - prob_good = probs_and_costs_dict["prob_good"] - prob_easy = probs_and_costs_dict["prob_easy"] - - avg_again_review_duration = probs_and_costs_dict[ - "avg_again_review_duration" - ] - avg_hard_review_duration = probs_and_costs_dict["avg_hard_review_duration"] - avg_good_review_duration = probs_and_costs_dict["avg_good_review_duration"] - avg_easy_review_duration = probs_and_costs_dict["avg_easy_review_duration"] - - simulation_cost = 0 - for i in range(num_cards_simulate): - card = Card() - curr_date = start_date - while curr_date < end_date: - # the card is new - if curr_date == start_date: - rating = rng.choices( - [Rating.Again, Rating.Hard, Rating.Good, Rating.Easy], - weights=[ - prob_first_again, - prob_first_hard, - prob_first_good, - prob_first_easy, - ], - )[0] - - if rating == Rating.Again: - simulation_cost += avg_first_again_review_duration - - elif rating == Rating.Hard: - simulation_cost += avg_first_hard_review_duration - - elif rating == Rating.Good: - simulation_cost += avg_first_good_review_duration - - elif rating == Rating.Easy: - simulation_cost += avg_first_easy_review_duration - - # the card is not new - else: - rating = rng.choices( - ["recall", Rating.Again], - weights=[desired_retention, 1.0 - desired_retention], - )[0] - - if rating == "recall": - # compute probability that the user chose hard/good/easy, GIVEN that they correctly recalled the card - rating = rng.choices( - [Rating.Hard, Rating.Good, Rating.Easy], - weights=[prob_hard, prob_good, prob_easy], - )[0] - - if rating == Rating.Again: - simulation_cost += avg_again_review_duration - - elif rating == Rating.Hard: - simulation_cost += avg_hard_review_duration - - elif rating == Rating.Good: - simulation_cost += avg_good_review_duration - - elif rating == Rating.Easy: - simulation_cost += avg_easy_review_duration - - card, _ = scheduler.review_card( - card=card, rating=rating, review_datetime=curr_date - ) - curr_date = card.due - - total_knowledge = desired_retention * num_cards_simulate - simulation_cost = simulation_cost / total_knowledge - - return simulation_cost - - def compute_optimal_retention( - self, parameters: tuple[float, ...] | list[float] - ) -> list[float]: - def _validate_review_logs() -> None: - if len(self.review_logs) < 512: - raise ValueError( - "Not enough ReviewLog's: at least 512 ReviewLog objects are required to compute optimal retention" - ) - - for review_log in self.review_logs: - if review_log.review_duration is None: - raise ValueError( - "ReviewLog.review_duration cannot be None when computing optimal retention" - ) - - _validate_review_logs() - - NUM_CARDS_SIMULATE = 1000 - DESIRED_RETENTIONS = [0.7, 0.75, 0.8, 0.85, 0.9, 0.95] - - probs_and_costs_dict = self._compute_probs_and_costs() - - simulation_costs = [] - for desired_retention in DESIRED_RETENTIONS: - simulation_cost = self._simulate_cost( - desired_retention=desired_retention, - parameters=parameters, - num_cards_simulate=NUM_CARDS_SIMULATE, - probs_and_costs_dict=probs_and_costs_dict, - ) - simulation_costs.append(simulation_cost) - - min_index = simulation_costs.index(min(simulation_costs)) - optimal_retention = DESIRED_RETENTIONS[min_index] - - return optimal_retention - -except ImportError: - - class Optimizer: - def __init__(self, *args, **kwargs) -> None: - raise ImportError( - 'Optimizer is not installed.\nInstall it with: pip install "fsrs[optimizer]"' - ) - - -__all__ = ["Optimizer"] diff --git a/src/heurams/vendor/pyfsrs/py.typed b/src/heurams/vendor/pyfsrs/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/src/heurams/vendor/pyfsrs/rating.py b/src/heurams/vendor/pyfsrs/rating.py deleted file mode 100644 index 65c994d..0000000 --- a/src/heurams/vendor/pyfsrs/rating.py +++ /dev/null @@ -1,15 +0,0 @@ -from enum import IntEnum - - -class Rating(IntEnum): - """ - Enum representing the four possible ratings when reviewing a card. - """ - - Again = 1 - Hard = 2 - Good = 3 - Easy = 4 - - -__all__ = ["Rating"] diff --git a/src/heurams/vendor/pyfsrs/review_log.py b/src/heurams/vendor/pyfsrs/review_log.py deleted file mode 100644 index a787d9b..0000000 --- a/src/heurams/vendor/pyfsrs/review_log.py +++ /dev/null @@ -1,117 +0,0 @@ -""" -fsrs.review_log ---------- - -This module defines the ReviewLog and Rating classes. - -Classes: - ReviewLog: Represents the log entry of a Card that has been reviewed. - Rating: Enum representing the four possible ratings when reviewing a card. -""" - -from __future__ import annotations -from dataclasses import dataclass -from datetime import datetime -from typing import TypedDict -import json -from typing_extensions import Self -from fsrs.rating import Rating - - -class ReviewLogDict(TypedDict): - """ - JSON-serializable dictionary representation of a ReviewLog object. - """ - - card_id: int - rating: int - review_datetime: str - review_duration: int | None - - -@dataclass -class ReviewLog: - """ - Represents the log entry of a Card object that has been reviewed. - - Attributes: - card_id: The id of the card being reviewed. - rating: The rating given to the card during the review. - review_datetime: The date and time of the review. - review_duration: The number of milliseconds it took to review the card or None if unspecified. - """ - - card_id: int - rating: Rating - review_datetime: datetime - review_duration: int | None - - def to_dict( - self, - ) -> ReviewLogDict: - """ - Returns a dictionary representation of the ReviewLog object. - - Returns: - ReviewLogDict: A dictionary representation of the ReviewLog object. - """ - - return { - "card_id": self.card_id, - "rating": int(self.rating), - "review_datetime": self.review_datetime.isoformat(), - "review_duration": self.review_duration, - } - - @classmethod - def from_dict( - cls, - source_dict: ReviewLogDict, - ) -> Self: - """ - Creates a ReviewLog object from an existing dictionary. - - Args: - source_dict: A dictionary representing an existing ReviewLog object. - - Returns: - Self: A ReviewLog object created from the provided dictionary. - """ - - return cls( - card_id=source_dict["card_id"], - rating=Rating(int(source_dict["rating"])), - review_datetime=datetime.fromisoformat(source_dict["review_datetime"]), - review_duration=source_dict["review_duration"], - ) - - def to_json(self, indent: int | str | None = None) -> str: - """ - Returns a JSON-serialized string of the ReviewLog object. - - Args: - indent: Equivalent argument to the indent in json.dumps() - - Returns: - str: A JSON-serialized string of the ReviewLog object. - """ - - return json.dumps(self.to_dict(), indent=indent) - - @classmethod - def from_json(cls, source_json: str) -> Self: - """ - Creates a ReviewLog object from a JSON-serialized string. - - Args: - source_json: A JSON-serialized string of an existing ReviewLog object. - - Returns: - Self: A ReviewLog object created from the JSON string. - """ - - source_dict: ReviewLogDict = json.loads(source_json) - return cls.from_dict(source_dict=source_dict) - - -__all__ = ["ReviewLog"] diff --git a/src/heurams/vendor/pyfsrs/scheduler.py b/src/heurams/vendor/pyfsrs/scheduler.py deleted file mode 100644 index 6d42ecb..0000000 --- a/src/heurams/vendor/pyfsrs/scheduler.py +++ /dev/null @@ -1,856 +0,0 @@ -""" -fsrs.scheduler ---------- - -This module defines the Scheduler class as well as the various constants used in its calculations. - -Classes: - Scheduler: The FSRS spaced-repetition scheduler. -""" - -from __future__ import annotations -from collections.abc import Sequence -import math -from datetime import datetime, timezone, timedelta -from copy import copy -import json -from random import random -from dataclasses import dataclass -from fsrs.state import State -from fsrs.card import Card -from fsrs.rating import Rating -from fsrs.review_log import ReviewLog -from typing import TYPE_CHECKING, TypedDict, overload - -if TYPE_CHECKING: - from torch import Tensor # torch is optional; import only for type checking -from typing_extensions import Self - -FSRS_DEFAULT_DECAY = 0.1542 -DEFAULT_PARAMETERS = ( - 0.212, - 1.2931, - 2.3065, - 8.2956, - 6.4133, - 0.8334, - 3.0194, - 0.001, - 1.8722, - 0.1666, - 0.796, - 1.4835, - 0.0614, - 0.2629, - 1.6483, - 0.6014, - 1.8729, - 0.5425, - 0.0912, - 0.0658, - FSRS_DEFAULT_DECAY, -) - -STABILITY_MIN = 0.001 -LOWER_BOUNDS_PARAMETERS = ( - STABILITY_MIN, - STABILITY_MIN, - STABILITY_MIN, - STABILITY_MIN, - 1.0, - 0.001, - 0.001, - 0.001, - 0.0, - 0.0, - 0.001, - 0.001, - 0.001, - 0.001, - 0.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.1, -) - -INITIAL_STABILITY_MAX = 100.0 -UPPER_BOUNDS_PARAMETERS = ( - INITIAL_STABILITY_MAX, - INITIAL_STABILITY_MAX, - INITIAL_STABILITY_MAX, - INITIAL_STABILITY_MAX, - 10.0, - 4.0, - 4.0, - 0.75, - 4.5, - 0.8, - 3.5, - 5.0, - 0.25, - 0.9, - 4.0, - 1.0, - 6.0, - 2.0, - 2.0, - 0.8, - 0.8, -) - -MIN_DIFFICULTY = 1.0 -MAX_DIFFICULTY = 10.0 - -FUZZ_RANGES = [ - { - "start": 2.5, - "end": 7.0, - "factor": 0.15, - }, - { - "start": 7.0, - "end": 20.0, - "factor": 0.1, - }, - { - "start": 20.0, - "end": math.inf, - "factor": 0.05, - }, -] - - -class SchedulerDict(TypedDict): - """ - JSON-serializable dictionary representation of a Scheduler object. - """ - - parameters: list[float] - desired_retention: float - learning_steps: list[int] - relearning_steps: list[int] - maximum_interval: int - enable_fuzzing: bool - - -@dataclass(init=False) -class Scheduler: - """ - The FSRS scheduler. - - Enables the reviewing and future scheduling of cards according to the FSRS algorithm. - - Attributes: - parameters: The model weights of the FSRS scheduler. - desired_retention: The desired retention rate of cards scheduled with the scheduler. - learning_steps: Small time intervals that schedule cards in the Learning state. - relearning_steps: Small time intervals that schedule cards in the Relearning state. - maximum_interval: The maximum number of days a Review-state card can be scheduled into the future. - enable_fuzzing: Whether to apply a small amount of random 'fuzz' to calculated intervals. - """ - - parameters: tuple[float, ...] - desired_retention: float - learning_steps: tuple[timedelta, ...] - relearning_steps: tuple[timedelta, ...] - maximum_interval: int - enable_fuzzing: bool - - def __init__( - self, - parameters: Sequence[float] = DEFAULT_PARAMETERS, - desired_retention: float = 0.9, - learning_steps: tuple[timedelta, ...] | list[timedelta] = ( - timedelta(minutes=1), - timedelta(minutes=10), - ), - relearning_steps: tuple[timedelta, ...] | list[timedelta] = ( - timedelta(minutes=10), - ), - maximum_interval: int = 36500, - enable_fuzzing: bool = True, - ) -> None: - self._validate_parameters(parameters=parameters) - - self.parameters = tuple(parameters) - self.desired_retention = desired_retention - self.learning_steps = tuple(learning_steps) - self.relearning_steps = tuple(relearning_steps) - self.maximum_interval = maximum_interval - self.enable_fuzzing = enable_fuzzing - - self._DECAY = -self.parameters[20] - self._FACTOR = 0.9 ** (1 / self._DECAY) - 1 - - def _validate_parameters(self, *, parameters: Sequence[float]) -> None: - if len(parameters) != len(LOWER_BOUNDS_PARAMETERS): - raise ValueError( - f"Expected {len(LOWER_BOUNDS_PARAMETERS)} parameters, got {len(parameters)}." - ) - - error_messages = [] - for index, (parameter, lower_bound, upper_bound) in enumerate( - zip(parameters, LOWER_BOUNDS_PARAMETERS, UPPER_BOUNDS_PARAMETERS) - ): - if not lower_bound <= parameter <= upper_bound: - error_message = f"parameters[{index}] = {parameter} is out of bounds: ({lower_bound}, {upper_bound})" - error_messages.append(error_message) - - if len(error_messages) > 0: - raise ValueError( - "One or more parameters are out of bounds:\n" - + "\n".join(error_messages) - ) - - def get_card_retrievability( - self, card: Card, current_datetime: datetime | None = None - ) -> float: - """ - Calculates a Card object's current retrievability for a given date and time. - - The retrievability of a card is the predicted probability that the card is correctly recalled at the provided datetime. - - Args: - card: The card whose retrievability is to be calculated - current_datetime: The current date and time - - Returns: - float: The retrievability of the Card object. - """ - - if card.last_review is None or card.stability is None: - return 0 - - if current_datetime is None: - current_datetime = datetime.now(timezone.utc) - - elapsed_days = max(0, (current_datetime - card.last_review).days) - - return (1 + self._FACTOR * elapsed_days / card.stability) ** self._DECAY - - def review_card( - self, - card: Card, - rating: Rating, - review_datetime: datetime | None = None, - review_duration: int | None = None, - ) -> tuple[Card, ReviewLog]: - """ - Reviews a card with a given rating at a given time for a specified duration. - - Args: - card: The card being reviewed. - rating: The chosen rating for the card being reviewed. - review_datetime: The date and time of the review. - review_duration: The number of miliseconds it took to review the card or None if unspecified. - - Returns: - tuple[Card,ReviewLog]: A tuple containing the updated, reviewed card and its corresponding review log. - - Raises: - ValueError: If the `review_datetime` argument is not timezone-aware and set to UTC. - """ - - if review_datetime is not None and ( - (review_datetime.tzinfo is None) or (review_datetime.tzinfo != timezone.utc) - ): - raise ValueError("datetime must be timezone-aware and set to UTC") - - card = copy(card) - - if review_datetime is None: - review_datetime = datetime.now(timezone.utc) - - days_since_last_review = ( - (review_datetime - card.last_review).days if card.last_review else None - ) - - match card.state: - case State.Learning: - assert card.step is not None - - # update the card's stability and difficulty - if card.stability is None or card.difficulty is None: - card.stability = self._initial_stability(rating=rating) - card.difficulty = self._initial_difficulty( - rating=rating, clamp=True - ) - - elif days_since_last_review is not None and days_since_last_review < 1: - card.stability = self._short_term_stability( - stability=card.stability, rating=rating - ) - card.difficulty = self._next_difficulty( - difficulty=card.difficulty, rating=rating - ) - - else: - card.stability = self._next_stability( - difficulty=card.difficulty, - stability=card.stability, - retrievability=self.get_card_retrievability( - card, - current_datetime=review_datetime, - ), - rating=rating, - ) - card.difficulty = self._next_difficulty( - difficulty=card.difficulty, rating=rating - ) - - # calculate the card's next interval - ## first if-clause handles edge case where the Card in the Learning state was previously - ## scheduled with a Scheduler with more learning_steps than the current Scheduler - if len(self.learning_steps) == 0 or ( - card.step >= len(self.learning_steps) - and rating in (Rating.Hard, Rating.Good, Rating.Easy) - ): - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval(stability=card.stability) - next_interval = timedelta(days=next_interval_days) - - else: - match rating: - case Rating.Again: - card.step = 0 - next_interval = self.learning_steps[card.step] - - case Rating.Hard: - # card step stays the same - - if card.step == 0 and len(self.learning_steps) == 1: - next_interval = self.learning_steps[0] * 1.5 - elif card.step == 0 and len(self.learning_steps) >= 2: - next_interval = ( - self.learning_steps[0] + self.learning_steps[1] - ) / 2.0 - else: - next_interval = self.learning_steps[card.step] - - case Rating.Good: - if card.step + 1 == len( - self.learning_steps - ): # the last step - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - else: - card.step += 1 - next_interval = self.learning_steps[card.step] - - case Rating.Easy: - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - case _: - raise ValueError(f"Unknown rating: {rating}") - - case State.Review: - assert card.stability is not None - assert card.difficulty is not None - - # update the card's stability and difficulty - if days_since_last_review is not None and days_since_last_review < 1: - card.stability = self._short_term_stability( - stability=card.stability, rating=rating - ) - else: - card.stability = self._next_stability( - difficulty=card.difficulty, - stability=card.stability, - retrievability=self.get_card_retrievability( - card, - current_datetime=review_datetime, - ), - rating=rating, - ) - - card.difficulty = self._next_difficulty( - difficulty=card.difficulty, rating=rating - ) - - # calculate the card's next interval - match rating: - case Rating.Again: - # if there are no relearning steps (they were left blank) - if len(self.relearning_steps) == 0: - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - else: - card.state = State.Relearning - card.step = 0 - - next_interval = self.relearning_steps[card.step] - - case Rating.Hard | Rating.Good | Rating.Easy: - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - case _: - raise ValueError(f"Unknown rating: {rating}") - - case State.Relearning: - assert card.stability is not None - assert card.difficulty is not None - assert card.step is not None - - # update the card's stability and difficulty - if days_since_last_review is not None and days_since_last_review < 1: - card.stability = self._short_term_stability( - stability=card.stability, rating=rating - ) - card.difficulty = self._next_difficulty( - difficulty=card.difficulty, rating=rating - ) - - else: - card.stability = self._next_stability( - difficulty=card.difficulty, - stability=card.stability, - retrievability=self.get_card_retrievability( - card, - current_datetime=review_datetime, - ), - rating=rating, - ) - card.difficulty = self._next_difficulty( - difficulty=card.difficulty, rating=rating - ) - - # calculate the card's next interval - ## first if-clause handles edge case where the Card in the Relearning state was previously - ## scheduled with a Scheduler with more relearning_steps than the current Scheduler - if len(self.relearning_steps) == 0 or ( - card.step >= len(self.relearning_steps) - and rating in (Rating.Hard, Rating.Good, Rating.Easy) - ): - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval(stability=card.stability) - next_interval = timedelta(days=next_interval_days) - - else: - match rating: - case Rating.Again: - card.step = 0 - next_interval = self.relearning_steps[card.step] - - case Rating.Hard: - # card step stays the same - - if card.step == 0 and len(self.relearning_steps) == 1: - next_interval = self.relearning_steps[0] * 1.5 - elif card.step == 0 and len(self.relearning_steps) >= 2: - next_interval = ( - self.relearning_steps[0] + self.relearning_steps[1] - ) / 2.0 - else: - next_interval = self.relearning_steps[card.step] - - case Rating.Good: - if card.step + 1 == len( - self.relearning_steps - ): # the last step - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - else: - card.step += 1 - next_interval = self.relearning_steps[card.step] - - case Rating.Easy: - card.state = State.Review - card.step = None - - next_interval_days = self._next_interval( - stability=card.stability - ) - next_interval = timedelta(days=next_interval_days) - - case _: - raise ValueError(f"Unknown rating: {rating}") - - case _: - raise ValueError(f"Unknown card state: {card.state}") - - if self.enable_fuzzing and card.state == State.Review: - next_interval = self._get_fuzzed_interval(interval=next_interval) - - card.due = review_datetime + next_interval - card.last_review = review_datetime - - review_log = ReviewLog( - card_id=card.card_id, - rating=rating, - review_datetime=review_datetime, - review_duration=review_duration, - ) - - return card, review_log - - def reschedule_card(self, card: Card, review_logs: list[ReviewLog]) -> Card: - """ - Reschedules/updates the given card with the current scheduler provided that card's review logs. - - If the current card was previously scheduled with a different scheduler, you may want to reschedule/update - it as if it had always been scheduled with this current scheduler. For example, you may want to reschedule - each of your cards with a new scheduler after computing the optimal parameters with the Optimizer. - - Args: - card: The card to be rescheduled/updated. - review_logs: A list of that card's review logs (order doesn't matter). - - Returns: - Card: A new card that has been rescheduled/updated with this current scheduler. - - Raises: - ValueError: If any of the review logs are for a card other than the one specified, this will raise an error. - - """ - - for review_log in review_logs: - if review_log.card_id != card.card_id: - raise ValueError( - f"ReviewLog card_id {review_log.card_id} does not match Card card_id {card.card_id}" - ) - - review_logs = sorted(review_logs, key=lambda log: log.review_datetime) - - rescheduled_card = Card(card_id=card.card_id, due=card.due) - - for review_log in review_logs: - rescheduled_card, _ = self.review_card( - card=rescheduled_card, - rating=review_log.rating, - review_datetime=review_log.review_datetime, - ) - - return rescheduled_card - - def to_dict( - self, - ) -> SchedulerDict: - """ - Returns a dictionary representation of the Scheduler object. - - Returns: - SchedulerDict: A dictionary representation of the Scheduler object. - """ - - return { - "parameters": list(self.parameters), - "desired_retention": self.desired_retention, - "learning_steps": [ - int(learning_step.total_seconds()) - for learning_step in self.learning_steps - ], - "relearning_steps": [ - int(relearning_step.total_seconds()) - for relearning_step in self.relearning_steps - ], - "maximum_interval": self.maximum_interval, - "enable_fuzzing": self.enable_fuzzing, - } - - @classmethod - def from_dict(cls, source_dict: SchedulerDict) -> Self: - """ - Creates a Scheduler object from an existing dictionary. - - Args: - source_dict: A dictionary representing an existing Scheduler object. - - Returns: - Self: A Scheduler object created from the provided dictionary. - """ - - return cls( - parameters=source_dict["parameters"], - desired_retention=source_dict["desired_retention"], - learning_steps=[ - timedelta(seconds=learning_step) - for learning_step in source_dict["learning_steps"] - ], - relearning_steps=[ - timedelta(seconds=relearning_step) - for relearning_step in source_dict["relearning_steps"] - ], - maximum_interval=source_dict["maximum_interval"], - enable_fuzzing=source_dict["enable_fuzzing"], - ) - - def to_json(self, indent: int | str | None = None) -> str: - """ - Returns a JSON-serialized string of the Scheduler object. - - Args: - indent: Equivalent argument to the indent in json.dumps() - - Returns: - str: A JSON-serialized string of the Scheduler object. - """ - - return json.dumps(self.to_dict(), indent=indent) - - @classmethod - def from_json(cls, source_json: str) -> Self: - """ - Creates a Scheduler object from a JSON-serialized string. - - Args: - source_json: A JSON-serialized string of an existing Scheduler object. - - Returns: - Self: A Scheduler object created from the JSON string. - """ - - source_dict: SchedulerDict = json.loads(source_json) - return cls.from_dict(source_dict=source_dict) - - @overload - def _clamp_difficulty(self, *, difficulty: float) -> float: ... - @overload - def _clamp_difficulty(self, *, difficulty: Tensor) -> Tensor: ... - def _clamp_difficulty(self, *, difficulty: float | Tensor) -> float | Tensor: - if isinstance(difficulty, (int, float)): - difficulty = min(max(difficulty, MIN_DIFFICULTY), MAX_DIFFICULTY) - else: - difficulty = difficulty.clamp(min=MIN_DIFFICULTY, max=MAX_DIFFICULTY) - - return difficulty - - @overload - def _clamp_stability(self, *, stability: float) -> float: ... - @overload - def _clamp_stability(self, *, stability: Tensor) -> Tensor: ... - def _clamp_stability(self, *, stability: float | Tensor) -> float | Tensor: - if isinstance(stability, (int, float)): - stability = max(stability, STABILITY_MIN) - else: - stability = stability.clamp(min=STABILITY_MIN) - - return stability - - def _initial_stability(self, *, rating: Rating) -> float: - initial_stability = self.parameters[rating - 1] - - initial_stability = self._clamp_stability(stability=initial_stability) - - return initial_stability - - def _initial_difficulty(self, *, rating: Rating, clamp: bool) -> float: - initial_difficulty = ( - self.parameters[4] - (math.e ** (self.parameters[5] * (rating - 1))) + 1 - ) - - if clamp: - initial_difficulty = self._clamp_difficulty(difficulty=initial_difficulty) - - return initial_difficulty - - def _next_interval(self, *, stability: float) -> int: - next_interval = (stability / self._FACTOR) * ( - (self.desired_retention ** (1 / self._DECAY)) - 1 - ) - - if not isinstance(next_interval, (int, float)): - next_interval = next_interval.detach().item() - - next_interval = round(next_interval) # intervals are full days - - # must be at least 1 day long - next_interval = max(next_interval, 1) - - # can not be longer than the maximum interval - next_interval = min(next_interval, self.maximum_interval) - - return next_interval - - def _short_term_stability(self, *, stability: float, rating: Rating) -> float: - short_term_stability_increase = ( - math.e ** (self.parameters[17] * (rating - 3 + self.parameters[18])) - ) * (stability ** -self.parameters[19]) - - if rating in (Rating.Good, Rating.Easy): - if isinstance(short_term_stability_increase, (int, float)): - short_term_stability_increase = max(short_term_stability_increase, 1.0) - else: - short_term_stability_increase = short_term_stability_increase.clamp( - min=1.0 - ) - - short_term_stability = stability * short_term_stability_increase - - short_term_stability = self._clamp_stability(stability=short_term_stability) - - return short_term_stability - - def _next_difficulty(self, *, difficulty: float, rating: Rating) -> float: - def _linear_damping(*, delta_difficulty: float, difficulty: float) -> float: - return (10.0 - difficulty) * delta_difficulty / 9.0 - - def _mean_reversion(*, arg_1: float, arg_2: float) -> float: - return self.parameters[7] * arg_1 + (1 - self.parameters[7]) * arg_2 - - arg_1 = self._initial_difficulty(rating=Rating.Easy, clamp=False) - - delta_difficulty = -(self.parameters[6] * (rating - 3)) - arg_2 = difficulty + _linear_damping( - delta_difficulty=delta_difficulty, difficulty=difficulty - ) - - next_difficulty = _mean_reversion(arg_1=arg_1, arg_2=arg_2) - - next_difficulty = self._clamp_difficulty(difficulty=next_difficulty) - - return next_difficulty - - def _next_stability( - self, - *, - difficulty: float, - stability: float, - retrievability: float, - rating: Rating, - ) -> float: - if rating == Rating.Again: - next_stability = self._next_forget_stability( - difficulty=difficulty, - stability=stability, - retrievability=retrievability, - ) - - elif rating in (Rating.Hard, Rating.Good, Rating.Easy): - next_stability = self._next_recall_stability( - difficulty=difficulty, - stability=stability, - retrievability=retrievability, - rating=rating, - ) - - else: - raise ValueError(f"Unknown rating: {rating}") - - next_stability = self._clamp_stability(stability=next_stability) - - return next_stability - - def _next_forget_stability( - self, *, difficulty: float, stability: float, retrievability: float - ) -> float: - next_forget_stability_long_term_params = ( - self.parameters[11] - * (difficulty ** -self.parameters[12]) - * (((stability + 1) ** (self.parameters[13])) - 1) - * (math.e ** ((1 - retrievability) * self.parameters[14])) - ) - - next_forget_stability_short_term_params = stability / ( - math.e ** (self.parameters[17] * self.parameters[18]) - ) - - return min( - next_forget_stability_long_term_params, - next_forget_stability_short_term_params, - ) - - def _next_recall_stability( - self, - *, - difficulty: float, - stability: float, - retrievability: float, - rating: Rating, - ) -> float: - hard_penalty = self.parameters[15] if rating == Rating.Hard else 1 - easy_bonus = self.parameters[16] if rating == Rating.Easy else 1 - - return stability * ( - 1 - + (math.e ** (self.parameters[8])) - * (11 - difficulty) - * (stability ** -self.parameters[9]) - * ((math.e ** ((1 - retrievability) * self.parameters[10])) - 1) - * hard_penalty - * easy_bonus - ) - - def _get_fuzzed_interval(self, *, interval: timedelta) -> timedelta: - """ - Takes the current calculated interval and adds a small amount of random fuzz to it. - For example, a card that would've been due in 50 days, after fuzzing, might be due in 49, or 51 days. - - Args: - interval: The calculated next interval, before fuzzing. - - Returns: - timedelta: The new interval, after fuzzing. - """ - - interval_days = interval.days - - if interval_days < 2.5: # fuzz is not applied to intervals less than 2.5 - return interval - - def _get_fuzz_range(*, interval_days: int) -> tuple[int, int]: - """ - Helper function that computes the possible upper and lower bounds of the interval after fuzzing. - """ - - delta = 1.0 - for fuzz_range in FUZZ_RANGES: - delta += fuzz_range["factor"] * max( - min(float(interval_days), fuzz_range["end"]) - fuzz_range["start"], - 0.0, - ) - - min_ivl = int(round(interval_days - delta)) - max_ivl = int(round(interval_days + delta)) - - # make sure the min_ivl and max_ivl fall into a valid range - min_ivl = max(2, min_ivl) - max_ivl = min(max_ivl, self.maximum_interval) - min_ivl = min(min_ivl, max_ivl) - - return min_ivl, max_ivl - - min_ivl, max_ivl = _get_fuzz_range(interval_days=interval_days) - - fuzzed_interval_days = ( - random() * (max_ivl - min_ivl + 1) - ) + min_ivl # the next interval is a random value between min_ivl and max_ivl - - fuzzed_interval_days = min(round(fuzzed_interval_days), self.maximum_interval) - - fuzzed_interval = timedelta(days=fuzzed_interval_days) - - return fuzzed_interval - - -__all__ = ["Scheduler"] diff --git a/src/heurams/vendor/pyfsrs/state.py b/src/heurams/vendor/pyfsrs/state.py deleted file mode 100644 index e4157c0..0000000 --- a/src/heurams/vendor/pyfsrs/state.py +++ /dev/null @@ -1,14 +0,0 @@ -from enum import IntEnum - - -class State(IntEnum): - """ - Enum representing the learning state of a Card object. - """ - - Learning = 1 - Review = 2 - Relearning = 3 - - -__all__ = ["State"] diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..89674ff --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,54 @@ +""" +Pytest shared fixtures for HeurAMS test suite. + +Provides: +- timer_config: A ConfigDict with deterministic timer overrides for reproducible tests. +- timer_context: A ConfigContext that applies timer_config for the duration of a test. +- sample_algodata_sm2: A fresh SM-2 algodata dict. +- sample_algodata_nsp0: A fresh NSP-0 algodata dict. +""" + +import pathlib +from copy import deepcopy + +import pytest + +from heurams.context import ConfigContext, config_var, workdir +from heurams.kernel.algorithms import algorithms, nsp0 +from heurams.services.config import ConfigDict + + +@pytest.fixture +def timer_config(): + """A ConfigDict with deterministic timer overrides (daystamp=20000, timestamp=1e9). + + This allows reproducible algorithm tests without relying on wall-clock time. + """ + # Use the real config path as base, then overlay timer overrides + config = ConfigDict(workdir / "data" / "config") + # Override timer values in-place via the nested ConfigDict + timer_cfg = config["services"]["timer"] + timer_cfg["daystamp_override"] = 20000 + timer_cfg["timestamp_override"] = 1000000000.0 + return config + + +@pytest.fixture +def timer_context(timer_config): + """Context manager fixture that applies the timer overrides.""" + with ConfigContext(timer_config): + yield + + +@pytest.fixture +def sample_algodata_sm2(): + """A fresh SM-2 algodata dict (pre-activation).""" + algo = algorithms["SM-2"] + return {algo.algo_name: deepcopy(algo.defaults)} + + +@pytest.fixture +def sample_algodata_nsp0(): + """A fresh NSP-0 algodata dict (pre-activation).""" + algo = algorithms["NSP-0"] + return {algo.algo_name: deepcopy(algo.defaults)} diff --git a/tests/test_base_algorithm.py b/tests/test_base_algorithm.py new file mode 100644 index 0000000..ddc85da --- /dev/null +++ b/tests/test_base_algorithm.py @@ -0,0 +1,58 @@ +"""Tests for heurams.kernel.algorithms.base.BaseAlgorithm""" + +from copy import deepcopy + +import pytest + +from heurams.kernel.algorithms import BaseAlgorithm +from heurams.services import timer + + +class TestBaseAlgorithmDefaults: + def test_defaults_have_required_keys(self): + required = { + "real_rept", + "rept", + "interval", + "last_date", + "next_date", + "is_activated", + "last_modify", + } + assert required.issubset(BaseAlgorithm.defaults.keys()) + + def test_defaults_last_modify_is_reasonable(self): + # defaults is evaluated at module import, not test time + ts = BaseAlgorithm.defaults["last_modify"] + assert isinstance(ts, float) + assert ts > 1e9 # reasonable UNIX timestamp + + +class TestBaseAlgorithmMethods: + def test_revisor_does_nothing(self): + d = {"SM-2": {"rept": 0}} + BaseAlgorithm.revisor(d, feedback=5) + # Base.revisor is a no-op — dict unchanged + assert d["SM-2"]["rept"] == 0 + + def test_is_due_returns_one(self): + assert BaseAlgorithm.is_due({}) == 1 + + def test_get_rating_returns_empty(self): + assert BaseAlgorithm.get_rating({}) == "" + + def test_nextdate_returns_negative_one(self): + assert BaseAlgorithm.nextdate({}) == -1 + + +class TestBaseAlgorithmIntegrity: + def test_check_integrity_valid(self, sample_algodata_sm2): + # BaseAlgorithm.algo_name is "BaseAlgorithm", not "SM-2" + data = {"BaseAlgorithm": sample_algodata_sm2["SM-2"]} + assert BaseAlgorithm.check_integrity(data) == 1 + + def test_check_integrity_invalid(self): + assert BaseAlgorithm.check_integrity({"SM-2": {}}) == 0 + + def test_check_integrity_missing_key(self): + assert BaseAlgorithm.check_integrity({}) == 0 diff --git a/tests/test_electron.py b/tests/test_electron.py new file mode 100644 index 0000000..80326fb --- /dev/null +++ b/tests/test_electron.py @@ -0,0 +1,150 @@ +"""Tests for heurams.kernel.particles.electron.Electron""" + +from copy import deepcopy + +import pytest + +from heurams.kernel.algorithms import algorithms +from heurams.kernel.particles.electron import Electron +from heurams.services import timer + + +class TestElectronInit: + def test_default_algo_is_sm2(self, timer_context): + e = Electron("test-id", {}) + assert e.algoname == "SM-2" + assert e.ident == "test-id" + + def test_specific_algo(self, timer_context): + e = Electron("test-id", {}, algo_name="NSP-0") + assert e.algoname == "NSP-0" + + def test_integrity_check_fills_defaults(self, timer_context): + e = Electron("test-id", {}) + assert "SM-2" in e.algodata + assert e.algodata["SM-2"]["efactor"] == 2.5 + + def test_existing_data_preserved(self, timer_context): + data = {"SM-2": {"efactor": 1.5, "rept": 3, "real_rept": 5, "interval": 10, + "last_date": 100, "next_date": 200, "is_activated": 1, + "last_modify": 1e9}} + e = Electron("test-id", data) + assert e.algodata["SM-2"]["efactor"] == 1.5 + assert e.algodata["SM-2"]["rept"] == 3 + + +class TestElectronActivation: + def test_activate_sets_flag(self, timer_context): + e = Electron("test-id", {}) + assert e.is_activated() == 0 + e.activate() + assert e.is_activated() == 1 + + def test_is_due_requires_activation(self, timer_context): + e = Electron("test-id", {}) + e.algodata["SM-2"]["next_date"] = 0 # past + assert e.is_due() == 0 # not activated + + e.activate() + assert e.is_due() == 1 + + def test_is_due_returns_false_when_not_due(self, timer_context): + e = Electron("test-id", {}) + e.activate() + e.algodata["SM-2"]["next_date"] = 999999 + assert e.is_due() is False + + +class TestElectronModify: + def test_modify_valid_key(self, timer_context): + e = Electron("test-id", {}) + e.modify("efactor", 3.0) + assert e.algodata["SM-2"]["efactor"] == 3.0 + + def test_modify_invalid_key_raises(self, timer_context): + e = Electron("test-id", {}) + with pytest.raises(AttributeError): + e.modify("nonexistent", 42) + + +class TestElectronRevisor: + def test_revisor_delegates_to_algo(self, timer_context): + e = Electron("test-id", {}) + e.activate() + e.algodata["SM-2"]["next_date"] = 0 + assert e.is_due() == 1 + + e.revisor(quality=5) + # After good review, interval > 0 + assert e.algodata["SM-2"]["interval"] >= 1 + + def test_revisor_nsp0(self, timer_context): + e = Electron("test-id", {}, algo_name="NSP-0") + e.activate() + e.algodata["NSP-0"]["next_date"] = 0 + assert e.is_due() == 1 + + e.revisor(quality=3) # bad feedback + assert e.algodata["NSP-0"]["interval"] == 1 + + +class TestElectronProperties: + def test_rept(self, timer_context): + e = Electron("test-id", {}) + assert e.rept() == 0 + + def test_rept_real(self, timer_context): + e = Electron("test-id", {}) + assert e.rept(real_rept=True) == 0 + + def test_get_rating(self, timer_context): + e = Electron("test-id", {}) + rating = e.get_rating() + assert isinstance(rating, str) + + def test_nextdate_returns_int(self, timer_context): + e = Electron("test-id", {}) + nd = e.nextdate() + assert isinstance(nd, int) + + def test_hash(self, timer_context): + e = Electron("test-id", {}) + assert hash(e) == hash("test-id") + + def test_len(self, timer_context): + e = Electron("test-id", {}) + assert len(e) == len(algorithms["SM-2"].defaults) + + +class TestElectronGetSetItem: + def test_getitem_ident(self, timer_context): + e = Electron("test-id", {}) + assert e["ident"] == "test-id" + + def test_getitem_algo_key(self, timer_context): + e = Electron("test-id", {}) + assert e["efactor"] == 2.5 + + def test_getitem_missing_key_raises(self, timer_context): + e = Electron("test-id", {}) + with pytest.raises(KeyError): + _ = e["nonexistent"] + + def test_setitem_valid_key(self, timer_context): + e = Electron("test-id", {}) + e["efactor"] = 3.5 + assert e["efactor"] == 3.5 + + def test_setitem_ident_raises(self, timer_context): + e = Electron("test-id", {}) + with pytest.raises(AttributeError): + e["ident"] = "new-id" + + +class TestElectronFromData: + def test_from_data_creates_electron(self, timer_context): + data = {"SM-2": {}} + e = Electron.from_data(("my-ident", data), algo_name="SM-2") + assert e.ident == "my-ident" + assert e.algoname == "SM-2" + assert "SM-2" in e.algodata diff --git a/tests/test_epath.py b/tests/test_epath.py new file mode 100644 index 0000000..590b6db --- /dev/null +++ b/tests/test_epath.py @@ -0,0 +1,72 @@ +"""Tests for heurams.services.epath""" + +from heurams.services.epath import epath + + +class TestEpathRead: + def test_empty_path_returns_self(self): + d = {"a": 1} + assert epath(d, "") is d + + def test_simple_key(self): + d = {"a": 1} + assert epath(d, "a") == 1 + + def test_nested_key(self): + d = {"a": {"b": {"c": 42}}} + assert epath(d, "a.b.c") == 42 + + def test_missing_key_returns_default(self): + d = {"a": 1} + assert epath(d, "b", default=None) is None + + def test_missing_key_no_default(self): + d = {"a": 1} + assert epath(d, "b") is None + + def test_list_index_access(self): + d = {"items": [10, 20, 30]} + assert epath(d, "items.[1]") == 20 + + def test_leading_dot_stripped(self): + d = {"a": 1} + assert epath(d, ".a") == 1 + + def test_trailing_dot_stripped(self): + d = {"a": 1} + assert epath(d, "a.") == 1 + + +class TestEpathParents: + def test_parents_creates_missing_dict_keys(self): + d = {} + result = epath(d, "a.b.c", parents=True, default=None) + # parents=True creates all intermediate keys including the leaf + assert result == {} + assert d == {"a": {"b": {"c": {}}}} + + +class TestEpathModify: + def test_modify_dict_key(self): + d = {"a": 1} + result = epath(d, "a", enable_modify=True, new_value=99) + assert result == 99 + assert d["a"] == 99 + + def test_modify_nested_key(self): + d = {"a": {"b": 2}} + epath(d, "a.b", enable_modify=True, new_value=42) + assert d["a"]["b"] == 42 + + def test_modify_list_index(self): + d = {"items": [10, 20]} + epath(d, "items.[0]", enable_modify=True, new_value=99) + assert d["items"][0] == 99 + + def test_modify_list_index_with_parents(self): + d = {"items": []} + result = epath( + d, "items.[3]", enable_modify=True, new_value=42, parents=True + ) + assert result == 42 + assert d["items"] == [None, None, None, 42] diff --git a/tests/test_evalizor.py b/tests/test_evalizor.py new file mode 100644 index 0000000..9187cd8 --- /dev/null +++ b/tests/test_evalizor.py @@ -0,0 +1,47 @@ +"""Tests for heurams.kernel.auxiliary.evalizor.Evalizer""" + +from heurams.kernel.auxiliary.evalizor import Evalizer + + +class TestEvalizer: + def test_noop_on_plain_string(self): + e = Evalizer({"x": 42}) + assert e("hello") == "hello" + + def test_eval_expression(self): + e = Evalizer({"x": 42}) + assert e("eval: x") == 42 + + def test_eval_arithmetic(self): + e = Evalizer({"a": 10, "b": 20}) + assert e("eval: a + b") == 30 + + def test_traverses_dict(self): + e = Evalizer({"val": 99}) + data = {"key_a": "plain", "key_b": "eval: val + 1"} + result = e(data) + assert result == {"key_a": "plain", "key_b": 100} + + def test_traverses_list(self): + e = Evalizer({"val": 5}) + data = ["eval: val", "plain", "eval: val * 2"] + result = e(data) + assert result == [5, "plain", 10] + + def test_traverses_nested(self): + e = Evalizer({"val": 3}) + data = {"outer": {"inner": "eval: val ** 2"}} + result = e(data) + assert result == {"outer": {"inner": 9}} + + def test_traverses_tuple(self): + e = Evalizer({"val": 7}) + data = ("eval: val", "other") + result = e(data) + assert result == (7, "other") + + def test_non_string_passthrough(self): + e = Evalizer({}) + assert e(42) == 42 + assert e(None) is None + assert e([1, 2, 3]) == [1, 2, 3] diff --git a/tests/test_hasher.py b/tests/test_hasher.py new file mode 100644 index 0000000..7bda877 --- /dev/null +++ b/tests/test_hasher.py @@ -0,0 +1,25 @@ +"""Tests for heurams.services.hasher""" + +from heurams.services.hasher import get_md5, hash + + +class TestGetMD5: + def test_known_value(self): + # MD5 of "hello" is known + assert get_md5("hello") == "5d41402abc4b2a76b9719d911017c592" + + def test_empty_string(self): + assert get_md5("") == "d41d8cd98f00b204e9800998ecf8427e" + + def test_unicode(self): + result = get_md5("中文测试") + assert isinstance(result, str) + assert len(result) == 32 + + def test_different_inputs_differ(self): + assert get_md5("abc") != get_md5("abcd") + + +class TestHash: + def test_hash_delegates_to_md5(self): + assert hash("hello") == get_md5("hello") diff --git a/tests/test_lict.py b/tests/test_lict.py new file mode 100644 index 0000000..75faa42 --- /dev/null +++ b/tests/test_lict.py @@ -0,0 +1,198 @@ +"""Tests for heurams.kernel.auxiliary.lict.Lict""" + +import pytest + +from heurams.kernel.auxiliary.lict import Lict + + +class TestLictInit: + def test_empty(self): + l = Lict() + assert len(l) == 0 + assert list(l) == [] + + def test_from_list(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + assert l["a"] == 1 + assert l["b"] == 2 + assert len(l) == 2 + + def test_from_dict(self): + l = Lict(initdict={"x": 10, "y": 20}) + assert l["x"] == 10 + assert l["y"] == 20 + assert len(l) == 2 + + +class TestLictListInterface: + def test_list_getitem(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + assert l[0] == ("a", 1) + assert l[1] == ("b", 2) + + def test_list_setitem(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + l[0] = ("c", 3) + assert l["c"] == 3 + assert l[0] == ("c", 3) + + def test_list_delitem(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + del l[0] + assert "a" not in l + assert len(l) == 1 + + def test_append(self): + l = Lict() + l.append(("k", "v")) + assert l["k"] == "v" + assert l[0] == ("k", "v") + + def test_insert(self): + l = Lict(initlist=[("a", 1), ("c", 3)]) + l.insert(1, ("b", 2)) + assert l[1] == ("b", 2) + assert l["b"] == 2 + assert len(l) == 3 + + def test_pop(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + item = l.pop() + assert item == ("b", 2) + assert "b" not in l + + def test_remove_by_key(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + l.remove("a") + assert "a" not in l + assert len(l) == 1 + + def test_remove_by_tuple(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + l.remove(("a", 1)) + assert "a" not in l + + def test_clear(self): + l = Lict(initlist=[("a", 1)]) + l.clear() + assert len(l) == 0 + assert list(l) == [] + + +class TestLictDictInterface: + def test_dict_getitem(self): + l = Lict(initlist=[("a", 1)]) + assert l["a"] == 1 + + def test_dict_setitem(self): + l = Lict() + l["k"] = "v" + assert l["k"] == "v" + # dict set marks list dirty — sync on access + assert l[0] == ("k", "v") + + def test_dict_delitem(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + del l["a"] + assert "a" not in l + assert len(l) == 1 + + def test_keys(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + assert set(l.keys()) == {"a", "b"} + + def test_values(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + assert set(l.values()) == {1, 2} + + def test_items(self): + l = Lict(initlist=[("a", 1), ("b", 2)]) + assert set(l.items()) == {("a", 1), ("b", 2)} + + def test_get_itemic_unit(self): + l = Lict(initlist=[("a", 1)]) + assert l.get_itemic_unit("a") == ("a", 1) + + +class TestLictSync: + def test_dict_to_list_sync(self): + """After dict modification, list access triggers sync.""" + l = Lict(initdict={"a": 1}) + assert l[0] == ("a", 1) + + def test_list_to_dict_sync(self): + """After list modification, dict access triggers sync.""" + l = Lict(initlist=[("a", 1)]) + assert l["a"] == 1 + + def test_append_list_maintained(self): + l = Lict() + l.append(("x", 100)) + l.append(("y", 200)) + # List order preserved + assert list(l) == [("x", 100), ("y", 200)] + + +class TestLictEdgeCases: + def test_append_non_tuple_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.append("not_a_tuple") # type: ignore + + def test_append_bad_tuple_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.append((1, 2, 3)) # type: ignore + + def test_contains_by_key(self): + l = Lict(initlist=[("a", 1)]) + assert "a" in l + + def test_contains_by_value(self): + l = Lict(initlist=[("a", 1)]) + assert 1 in l + + def test_contains_by_tuple(self): + l = Lict(initlist=[("a", 1)]) + assert ("a", 1) in l + + def test_not_contains(self): + l = Lict(initlist=[("a", 1)]) + assert "z" not in l + + def test_forced_order(self): + l = Lict(initlist=[("b", 2), ("a", 1)], forced_order=True) + assert l[0] == ("a", 1) + assert l[1] == ("b", 2) + + def test_append_if_not_exists(self): + l = Lict() + l.append_if_it_doesnt_exist_before(("k", "v")) + assert l["k"] == "v" + l.append_if_it_doesnt_exist_before(("k", "v")) + assert len(l) == 1 + + def test_keys_equal_with(self): + a = Lict(initlist=[("x", 1), ("y", 2)]) + b = Lict(initlist=[("y", 3), ("x", 4)]) + assert a.keys_equal_with(b) + + def test_index_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.index() + + def test_extend_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.extend() + + def test_sort_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.sort() + + def test_reverse_raises(self): + l = Lict() + with pytest.raises(NotImplementedError): + l.reverse() diff --git a/tests/test_nsp0.py b/tests/test_nsp0.py new file mode 100644 index 0000000..33c0bb4 --- /dev/null +++ b/tests/test_nsp0.py @@ -0,0 +1,70 @@ +"""Tests for heurams.kernel.algorithms.nsp0.NSP0Algorithm""" + +from copy import deepcopy + +import pytest + +from heurams.kernel.algorithms import algorithms +from heurams.services import timer + + +@pytest.fixture +def algo(): + return algorithms["NSP-0"] + + +@pytest.fixture +def algodata(sample_algodata_nsp0): + return sample_algodata_nsp0 + + +class TestNSP0Defaults: + def test_defaults_have_important(self, algo): + assert algo.defaults["important"] == 0 + + def test_algo_name(self, algo): + assert algo.algo_name == "NSP-0" + + +class TestNSP0Revisor: + def test_negative_one_skip(self, algo, algodata): + d = deepcopy(algodata) + algo.revisor(d, feedback=-1) + assert d == algodata + + def test_feedback_three_or_less_sets_interval_one(self, algo, algodata): + for fb in (0, 1, 2, 3): + d = deepcopy(algodata) + algo.revisor(d, feedback=fb) + assert d["NSP-0"]["interval"] == 1 + assert d["NSP-0"]["important"] == 1 + + def test_feedback_greater_than_three_sets_infinite_interval(self, algo, algodata): + for fb in (4, 5): + d = deepcopy(algodata) + algo.revisor(d, feedback=fb) + assert d["NSP-0"]["interval"] == float("inf") + assert d["NSP-0"]["important"] == 0 + + def test_revisor_updates_dates(self, algo, algodata, timer_context): + d = deepcopy(algodata) + algo.revisor(d, feedback=3) + assert d["NSP-0"]["last_date"] == timer.get_daystamp() + assert d["NSP-0"]["next_date"] == timer.get_daystamp() + 1 + + +class TestNSP0IsDue: + def test_due_when_past(self, algo, algodata, timer_context): + d = deepcopy(algodata) + d["NSP-0"]["next_date"] = 100 + assert algo.is_due(d) is True + + def test_not_due_when_future(self, algo, algodata, timer_context): + d = deepcopy(algodata) + d["NSP-0"]["next_date"] = 999999 + assert algo.is_due(d) is False + + def test_nextdate_returns_stored(self, algo, algodata): + d = deepcopy(algodata) + d["NSP-0"]["next_date"] = 42 + assert algo.nextdate(d) == 42 diff --git a/tests/test_sm2.py b/tests/test_sm2.py new file mode 100644 index 0000000..ac20df4 --- /dev/null +++ b/tests/test_sm2.py @@ -0,0 +1,123 @@ +"""Tests for heurams.kernel.algorithms.sm2.SM2Algorithm""" + +from copy import deepcopy + +import pytest + +from heurams.kernel.algorithms import algorithms +from heurams.services import timer + + +@pytest.fixture +def algo(): + return algorithms["SM-2"] + + +@pytest.fixture +def algodata(sample_algodata_sm2): + return sample_algodata_sm2 + + +class TestSM2Defaults: + def test_defaults_have_efactor(self, algo): + assert algo.defaults["efactor"] == 2.5 + + def test_algo_name(self, algo): + assert algo.algo_name == "SM-2" + + +class TestSM2Revisor: + def test_feedback_negative_one_skips(self, algo, algodata): + """feedback == -1 should be a no-op.""" + d = deepcopy(algodata) + algo.revisor(d, feedback=-1) + assert d == algodata # unchanged + + def test_good_feedback_increases_efactor(self, algo, algodata): + d = deepcopy(algodata) + ef_before = d["SM-2"]["efactor"] + algo.revisor(d, feedback=5) + assert d["SM-2"]["efactor"] > ef_before + + def test_bad_feedback_resets_rept(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["rept"] = 5 + algo.revisor(d, feedback=2) + assert d["SM-2"]["rept"] == 0 + assert d["SM-2"]["interval"] == 1 + + def test_efactor_minimum_floor(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["efactor"] = 0.5 + algo.revisor(d, feedback=2) + assert d["SM-2"]["efactor"] >= 1.3 + + def test_rept_increments_on_good_feedback(self, algo, algodata): + d = deepcopy(algodata) + algo.revisor(d, feedback=4) + assert d["SM-2"]["rept"] == 1 + + def test_new_activation_resets_state(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["rept"] = 10 + d["SM-2"]["efactor"] = 3.0 + algo.revisor(d, feedback=5, is_new_activation=True) + assert d["SM-2"]["rept"] == 0 + assert d["SM-2"]["efactor"] == 2.5 + + def test_interval_at_rept_zero(self, algo, algodata): + d = deepcopy(algodata) + algo.revisor(d, feedback=2) + assert d["SM-2"]["interval"] == 1 + + def test_interval_at_rept_one(self, algo, algodata): + d = deepcopy(algodata) + # rept=0 + feedback>=3 -> rept becomes 1 -> interval=6 + algo.revisor(d, feedback=5) + assert d["SM-2"]["interval"] == 6 + + def test_interval_for_rept_gt_one(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["rept"] = 2 + d["SM-2"]["interval"] = 6 + d["SM-2"]["efactor"] = 2.0 + algo.revisor(d, feedback=5) + # efactor 2.0 + 0.1(feedback=5) = 2.1; interval = round(6 * 2.1) = 13 + assert d["SM-2"]["interval"] == 13 + + def test_real_rept_always_increments(self, algo, algodata): + d = deepcopy(algodata) + algo.revisor(d, feedback=5) + assert d["SM-2"]["real_rept"] == 1 + algo.revisor(d, feedback=0) + assert d["SM-2"]["real_rept"] == 2 + + +class TestSM2DueDate: + def test_is_due_when_past(self, algo, algodata, timer_context): + d = deepcopy(algodata) + d["SM-2"]["next_date"] = 100 # far in the past + assert algo.is_due(d) is True + + def test_not_due_when_future(self, algo, algodata, timer_context): + d = deepcopy(algodata) + d["SM-2"]["next_date"] = 999999 # far in the future + assert algo.is_due(d) is False + + def test_nextdate_returns_stored(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["next_date"] = 12345 + assert algo.nextdate(d) == 12345 + + def test_revisor_updates_dates(self, algo, algodata, timer_context): + d = deepcopy(algodata) + algo.revisor(d, feedback=5) + assert d["SM-2"]["last_date"] == timer.get_daystamp() + assert d["SM-2"]["next_date"] > timer.get_daystamp() + + +class TestSM2Rating: + def test_get_rating_returns_efactor(self, algo, algodata): + d = deepcopy(algodata) + d["SM-2"]["efactor"] = 2.5 + assert algo.get_rating(d) == "2.5" diff --git a/tests/test_textproc.py b/tests/test_textproc.py new file mode 100644 index 0000000..a78fd6f --- /dev/null +++ b/tests/test_textproc.py @@ -0,0 +1,35 @@ +"""Tests for heurams.services.textproc""" + +from heurams.services.textproc import domize, truncate, undomize + + +class TestTruncate: + def test_short_string_unchanged(self): + assert truncate("ab") == "ab" + + def test_three_char_unchanged(self): + assert truncate("abc") == "abc" + + def test_longer_string_truncated(self): + assert truncate("abcd") == "abc>" + + def test_empty_string(self): + assert truncate("") == "" + + +class TestDomizeUndomize: + def test_domize_replaces_dot(self): + assert domize("a.b.c") == "a--DOT--b--DOT--c" + + def test_domize_no_dot(self): + assert domize("abc") == "abc" + + def test_undomize_restores_dot(self): + assert undomize("a--DOT--b") == "a.b" + + def test_undomize_no_marker(self): + assert undomize("abc") == "abc" + + def test_roundtrip(self): + original = "config.key.subkey" + assert undomize(domize(original)) == original diff --git a/uv.lock b/uv.lock index c219516..81fe0e3 100644 --- a/uv.lock +++ b/uv.lock @@ -84,11 +84,163 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, + { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, + { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, + { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, + { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fsrs" +version = "6.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/00/337de60fd5497ea4fed046192d17fa79809ca2aad7326da2e464d9d8950b/fsrs-6.3.1.tar.gz", hash = "sha256:43c5c6056b97266baf6ebfef9e4cadeb9ac5a4e1b29ffdfb300f445b6e6b15ca", size = 32645, upload-time = "2026-03-10T14:01:03.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/3c/e7e140f8cdb95b042cb125ee142e7630187e8e78d21847ca81e9d1e99bb8/fsrs-6.3.1-py3-none-any.whl", hash = "sha256:ac1bf9939573592d8c9bc1e11a00bd17e04146dc9f2c913127e2bcc431b9040b", size = 22840, upload-time = "2026-03-10T14:01:01.084Z" }, +] + [[package]] name = "heurams" version = "0.5.0" source = { editable = "." } dependencies = [ + { name = "fsrs" }, { name = "psutil" }, { name = "tabulate" }, { name = "textual" }, @@ -97,8 +249,15 @@ dependencies = [ { name = "zmq" }, ] +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, +] + [package.metadata] requires-dist = [ + { name = "fsrs", specifier = ">=6.3.1" }, { name = "psutil", specifier = ">=7.2.2" }, { name = "tabulate", specifier = ">=0.10.0" }, { name = "textual", specifier = ">=8.2.3" }, @@ -107,6 +266,21 @@ requires-dist = [ { name = "zmq", specifier = ">=0.0.0" }, ] +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.0.0" }, + { name = "pytest-cov", specifier = ">=6.0.0" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "linkify-it-py" version = "2.1.0" @@ -157,6 +331,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "packaging" +version = "26.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, +] + [[package]] name = "platformdirs" version = "4.9.6" @@ -166,6 +349,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "psutil" version = "7.2.2" @@ -212,6 +404,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + [[package]] name = "pyzmq" version = "27.1.0" @@ -342,6 +566,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, ] +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + [[package]] name = "transitions" version = "0.9.3" From fa2f8fa7018402e953368b632deacf1da2e92ab8 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 25 Apr 2026 01:54:18 +0800 Subject: [PATCH 55/79] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=97=A9?= =?UTF-8?q?=E6=9C=9F=20FSRS=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/interface/global.toml | 2 +- data/config/repo/cngk-t.toml | 2 +- data/misc/attics/ana.pkl | Bin 111 -> 111 bytes src/heurams/kernel/algorithms/__init__.py | 3 + src/heurams/kernel/algorithms/fsrs.py | 244 +++++++++++++++++++++- 5 files changed, 247 insertions(+), 4 deletions(-) diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index 37f575c..dbde270 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -14,7 +14,7 @@ scheduled_num = 420 _scheduled_num_desc = "默认记忆单元数量\n可被单元集设置覆盖" refresh_on_resume = true _refresh_on_resume_desc = "[调试] 每当 Screen 激活后都刷新状态" -algorithm = "SM-2" +algorithm = "FSRS" _algorithm_desc = "默认记忆调度算法\n可被单元集设置覆盖" [_algorithm_candidate] diff --git a/data/config/repo/cngk-t.toml b/data/config/repo/cngk-t.toml index 3cd8fc9..4563bc9 100644 --- a/data/config/repo/cngk-t.toml +++ b/data/config/repo/cngk-t.toml @@ -1,4 +1,4 @@ -algorithm = "NSP-0" +algorithm = "FSRS" _algorithm_desc = "记忆调度算法" scheduled_num = 420 _scheduled_num_desc = "单次记忆单元数量" diff --git a/data/misc/attics/ana.pkl b/data/misc/attics/ana.pkl index e76af3010a9956bc4c04609f72f6947afc207bae..490efedaca3737666d3a236f7563826f0ba7017a 100644 GIT binary patch delta 87 zcmd1LpCB7_>x%;e149pYenDzpL1|T0PHOQKZ{Z$pC_6s2sA!5eLk~Mxz9@ByH)jtg fh+SBkS_ Rating: + """将 SM-2 风格 feedback (0-5) 映射为 FSRS Rating (1-4)""" + if feedback <= 2: + return Rating.Again + elif feedback == 3: + return Rating.Hard + elif feedback == 4: + return Rating.Good + else: + return Rating.Easy + + +def _datetime_to_daystamp(dt: datetime) -> int: + """将 datetime 转换为天数戳(从 1970-01-01)""" + epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + delta = dt - epoch + return delta.days + + +def _daystamp_to_datetime(daystamp: int) -> datetime: + """将天数戳转换为 UTC datetime""" + epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + return epoch + timedelta(days=daystamp) + + +class FSRSAlgorithm(BaseAlgorithm): + algo_name = "FSRS" + desc = "基于 py-fsrs 的现代间隔重复调度器" + + class AlgodataDict(TypedDict): + # FSRS 特有字段 + fsrs_state: int # State 枚举值: 1=Learning, 2=Review, 3=Relearning + fsrs_step: int # 当前学习步进索引, -1 表示 None (Review 状态) + fsrs_stability: float # 稳定性(秒),0.0 表示尚未计算 + fsrs_difficulty: float # 难度 [1.0, 10.0], 0.0 表示尚未计算 + # 标准 BaseAlgorithm 兼容字段 + real_rept: int + rept: int + interval: int + last_date: int + next_date: int + is_activated: int + last_modify: float + + defaults = { + "fsrs_state": 1, # State.Learning + "fsrs_step": 0, + "fsrs_stability": 0.0, + "fsrs_difficulty": 0.0, + "real_rept": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": get_timestamp(), + } + + @classmethod + def _algodata_to_card(cls, algodata): + """从 algodata 恢复 Card 实例""" + data = algodata.get(cls.algo_name, cls.defaults.copy()) + + card = Card() + + # State: int → IntEnum + card.state = data.get("fsrs_state", 1) + + # Step: -1 表示 None(Review 状态下的 card.step 为 None) + step = data.get("fsrs_step", -1) + card.step = None if step == -1 else step + + # Stability: 0.0 表示尚未计算(新卡片) + stability = data.get("fsrs_stability", 0.0) + card.stability = None if stability == 0.0 else stability + + # Difficulty: 0.0 表示尚未计算 + difficulty = data.get("fsrs_difficulty", 0.0) + card.difficulty = None if difficulty == 0.0 else difficulty + + # due: 新卡片(next_date ≤ 0)设为当前时间 + next_date = data.get("next_date", 0) + if next_date <= 0: + card.due = datetime.now(timezone.utc) + else: + card.due = _daystamp_to_datetime(next_date) + + # last_review + last_date = data.get("last_date", 0) + card.last_review = ( + _daystamp_to_datetime(last_date) if last_date > 0 else None + ) + + return card + + @classmethod + def _card_to_algodata(cls, card, algodata): + """将 Card 实例状态写回 algodata""" + if cls.algo_name not in algodata: + algodata[cls.algo_name] = cls.defaults.copy() + + data = algodata[cls.algo_name] + data["fsrs_state"] = int(card.state) + data["fsrs_step"] = card.step if card.step is not None else -1 + data["fsrs_stability"] = card.stability if card.stability is not None else 0.0 + data["fsrs_difficulty"] = ( + card.difficulty if card.difficulty is not None else 0.0 + ) + data["last_date"] = ( + _datetime_to_daystamp(card.last_review) + if card.last_review + else data.get("last_date", 0) + ) + data["next_date"] = ( + _datetime_to_daystamp(card.due) if card.due else 0 + ) + data["interval"] = max(0, data["next_date"] - data["last_date"]) + data["last_modify"] = get_timestamp() + return algodata + + @classmethod + def revisor( + cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False + ): + """FSRS 算法迭代决策机制实现 + + 将 feedback (0-5) 映射为 FSRS Rating 后交由 py-fsrs 调度器处理。 + + Args: + feedback (int): 0-5 的记忆保留率量化参数 + is_new_activation: 是否为全新激活(重置为初始状态) + """ + logger.debug( + "FSRS.revisor 开始, feedback: %d, is_new_activation: %s", + feedback, + is_new_activation, + ) + + if feedback == -1: + logger.debug("feedback 为 -1, 跳过更新") + return + + scheduler = _get_global_scheduler() + rating = _feedback_to_rating(feedback) + + if is_new_activation: + card = Card() + logger.debug("新激活,创建新 Card") + else: + card = cls._algodata_to_card(algodata) + + card, review_log = scheduler.review_card(card, rating) + _save_global_scheduler(scheduler) + + cls._card_to_algodata(card, algodata) + # real_rept: 总复习次数 + algodata[cls.algo_name]["real_rept"] += 1 + # rept: 成功回忆次数(feedback ≥ 3 视为成功) + if feedback >= 3: + algodata[cls.algo_name]["rept"] += 1 + + logger.debug( + "FSRS.revisor 完成: stability=%s, difficulty=%s, state=%s, " + "next_date=%d", + card.stability, + card.difficulty, + card.state, + algodata[cls.algo_name]["next_date"], + ) + + @classmethod + def is_due(cls, algodata): + data = algodata.get(cls.algo_name, cls.defaults.copy()) + next_date = data.get("next_date", 0) + current = get_daystamp() + result = next_date <= current + logger.debug( + "FSRS.is_due: next_date=%d, current=%d, result=%s", + next_date, + current, + result, + ) + return result + + @classmethod + def get_rating(cls, algodata): + data = algodata.get(cls.algo_name, cls.defaults.copy()) + difficulty = data.get("fsrs_difficulty", 0.0) + logger.debug("FSRS.get_rating: difficulty=%f", difficulty) + return str(difficulty) + + @classmethod + def nextdate(cls, algodata) -> int: + data = algodata.get(cls.algo_name, cls.defaults.copy()) + next_date = data.get("next_date", 0) + logger.debug("FSRS.nextdate: %d", next_date) + return next_date From dead6cb1a161d3170100e71a15b512ceebd3eb82 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 25 Apr 2026 02:14:55 +0800 Subject: [PATCH 56/79] =?UTF-8?q?feat:=20=E9=AB=98=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=E6=94=AF=E6=8C=81=E4=B8=8E=20SM-15M?= =?UTF-8?q?=20=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/interface/global.toml | 2 +- data/config/repo/cngk-t.toml | 2 +- src/heurams/kernel/algorithms/sm15m.py | 948 ++++++++--- src/heurams/kernel/algorithms/sm15m_calc.py | 1572 ------------------- src/heurams/services/timer.py | 30 + 5 files changed, 777 insertions(+), 1777 deletions(-) delete mode 100644 src/heurams/kernel/algorithms/sm15m_calc.py diff --git a/data/config/interface/global.toml b/data/config/interface/global.toml index dbde270..37f575c 100644 --- a/data/config/interface/global.toml +++ b/data/config/interface/global.toml @@ -14,7 +14,7 @@ scheduled_num = 420 _scheduled_num_desc = "默认记忆单元数量\n可被单元集设置覆盖" refresh_on_resume = true _refresh_on_resume_desc = "[调试] 每当 Screen 激活后都刷新状态" -algorithm = "FSRS" +algorithm = "SM-2" _algorithm_desc = "默认记忆调度算法\n可被单元集设置覆盖" [_algorithm_candidate] diff --git a/data/config/repo/cngk-t.toml b/data/config/repo/cngk-t.toml index 4563bc9..3cd8fc9 100644 --- a/data/config/repo/cngk-t.toml +++ b/data/config/repo/cngk-t.toml @@ -1,4 +1,4 @@ -algorithm = "FSRS" +algorithm = "NSP-0" _algorithm_desc = "记忆调度算法" scheduled_num = 420 _scheduled_num_desc = "单次记忆单元数量" diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 1765c13..0e0a5dc 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -1,69 +1,652 @@ """ -SM-15 接口兼容实现, 基于 SM-15 算法的逆向工程 -全局状态保存在文件中, 项目状态通过 algodata 字典传递 +SM-15M — 基于 sm.js 的间隔重复算法 基于: https://github.com/slaypni/sm.js -原始 CoffeeScript 代码: (c) 2014 Kazuaki Tanida -MIT 许可证 +原始 CoffeeScript (c) 2014 Kazuaki Tanida, MIT 许可证 """ - import datetime import json +import math import os import pathlib from typing import TypedDict from heurams.context import config_var -from heurams.kernel.algorithms.sm15m_calc import ( - MAX_AF, - MIN_AF, - SM, - Item, +from heurams.services.logger import get_logger +from heurams.services.timer import ( + get_daystamp, + get_timestamp, + get_timestamp_ms, + daystamp_to_datetime, + datetime_to_daystamp, + get_now_datetime, ) -# 全局状态文件路径 -_GLOBAL_STATE_FILE = os.path.expanduser( - pathlib.Path(config_var.get()["global"]["paths"]["data"]) - / "global" - / "sm15m_global_state.json" -) +from .base import BaseAlgorithm + +logger = get_logger(__name__) + +# ============================================================================ +# Constants +# ============================================================================ + +RANGE_AF = 20 +RANGE_REPETITION = 20 + +MIN_AF = 1.2 +NOTCH_AF = 0.3 +MAX_AF = MIN_AF + NOTCH_AF * (RANGE_AF - 1) # 6.9 + +MAX_GRADE = 5 +THRESHOLD_RECALL = 3 + +# ============================================================================ +# Math Helpers +# ============================================================================ + + +def sum_values(values): + return sum(values) + + +def exponential_regression(points): + """y = a * exp(b * x)""" + n = len(points) + X = [p[0] for p in points] + Y = [p[1] for p in points] + logY = [math.log(y) for y in Y] + sqX = [x * x for x in X] + + sum_logY = sum(logY) + sum_sqX = sum(sqX) + sumX = sum(X) + sumX_logY = sum(X[i] * logY[i] for i in range(n)) + sq_sumX = sumX * sumX + + denom = n * sum_sqX - sq_sumX + a_coeff = (sum_logY * sum_sqX - sumX * sumX_logY) / denom if denom else 0 + b_coeff = (n * sumX_logY - sumX * sum_logY) / denom if denom else 0 + + a = math.exp(a_coeff) + + def y_func(x): + return a * math.exp(b_coeff * x) + + def x_func(y): + if b_coeff == 0: + return 0 + return (-a_coeff + math.log(y)) / b_coeff + + return {"y": y_func, "x": x_func, "a": a, "b": b_coeff} + + +def linear_regression(points): + """y = a + b * x""" + n = len(points) + X = [p[0] for p in points] + Y = [p[1] for p in points] + + sumX = sum(X) + sumY = sum(Y) + sumXY = sum(X[i] * Y[i] for i in range(n)) + sum_sqX = sum(x * x for x in X) + sq_sumX = sumX * sumX + + denom = n * sum_sqX - sq_sumX + a = (sumY * sum_sqX - sumX * sumXY) / denom if denom else 0 + b = (n * sumXY - sumX * sumY) / denom if denom else 0 + + def y_func(x): + return a + b * x + + def x_func(y): + if b == 0: + return 0 + return (y - a) / b + + return {"y": y_func, "x": x_func, "a": a, "b": b} + + +def power_law_model(a, b): + """y = a * x^b""" + + def y_func(x): + return a * (x ** b) + + def x_func(y): + if a == 0 or b == 0: + return 0 + return (y / a) ** (1.0 / b) + + return {"y": y_func, "x": x_func, "a": a, "b": b} + + +def fixed_point_power_law_regression(points, fixed_point): + """y = q * (x/p)^b, through fixed point (p, q)""" + n = len(points) + p, q = fixed_point + log_q = math.log(q) + + X = [math.log(point[0] / p) for point in points] + Y = [math.log(point[1]) - log_q for point in points] + + sumXY = sum(X[i] * Y[i] for i in range(n)) + sum_sqX = sum(x * x for x in X) + b = sumXY / sum_sqX if sum_sqX else 0 + + return power_law_model(q / (p ** b), b) + + +# ============================================================================ +# FI-G Grade Graph +# ============================================================================ + + +class FI_G: + """Forgetting Index — Grade graph (exponential regression).""" + + MAX_POINTS_COUNT = 5000 + GRADE_OFFSET = 1 + + def __init__(self, sm, points=None): + self.sm = sm + self._graph = None + if points is not None: + self.points = points + else: + self.points = [] + self._register_point(0, MAX_GRADE) + self._register_point(100, 0) + + def _register_point(self, fi, grade): + self.points.append([fi, grade + self.GRADE_OFFSET]) + if len(self.points) > self.MAX_POINTS_COUNT: + self.points = self.points[-self.MAX_POINTS_COUNT:] + self._graph = None + + def update(self, grade, item, now): + def expected_fi(): + return (item.uf(now) / item.of) * self.sm.requested_fi + + self._register_point(expected_fi(), grade) + + def fi(self, grade): + if not self.points: + return 50.0 + if self._graph is None: + self._graph = exponential_regression(self.points) + return max(0.0, min(100.0, self._graph["x"](grade + self.GRADE_OFFSET))) + + def data(self): + return {"points": self.points} + + @classmethod + def load(cls, sm, data): + return cls(sm, data.get("points")) + + +# ============================================================================ +# Forgetting Curve (single cell) +# ============================================================================ + + +class ForgettingCurve: + MAX_POINTS_COUNT = 500 + FORGOTTEN = 1 + REMEMBERED = 100 + FORGOTTEN # 101 + + def __init__(self, points): + self.points = points + self._curve = None + + def register_point(self, grade, uf): + is_remembered = grade >= THRESHOLD_RECALL + self.points.append([uf, self.REMEMBERED if is_remembered else self.FORGOTTEN]) + if len(self.points) > self.MAX_POINTS_COUNT: + self.points = self.points[-self.MAX_POINTS_COUNT:] + self._curve = None + + def retention(self, uf): + if not self.points: + return 50.0 + if self._curve is None: + self._curve = exponential_regression(self.points) + clamped = max(self.FORGOTTEN, min(self._curve["y"](uf), self.REMEMBERED)) + return clamped - self.FORGOTTEN + + def uf(self, retention): + if not self.points: + return 1.0 + if self._curve is None: + self._curve = exponential_regression(self.points) + return max(0.0, self._curve["x"](retention + self.FORGOTTEN)) + + +# ============================================================================ +# Forgetting Curves Matrix (repetition × af) +# ============================================================================ + + +class ForgettingCurves: + FORGOTTEN = 1 + REMEMBERED = 100 + FORGOTTEN + + def __init__(self, sm, points=None): + self.sm = sm + self.curves = [] + for r in range(RANGE_REPETITION): + row = [] + for a in range(RANGE_AF): + if points is not None: + partial = points[r][a] + else: + if r > 0: + pts = [] + for i in range(21): + v = MIN_AF + NOTCH_AF * i + y = math.exp( + -(r + 1) / 200 * (i - a * math.sqrt(2.0 / (r + 1))) + ) * (self.REMEMBERED - self.sm.requested_fi) + pts.append([v, min(self.REMEMBERED, y)]) + partial = [[0, self.REMEMBERED]] + pts + else: + pts = [] + for i in range(21): + v = MIN_AF + NOTCH_AF * i + y = math.exp( + -1.0 / (10 + 1 * (a + 1)) * (i - a ** 0.6) + ) * (self.REMEMBERED - self.sm.requested_fi) + pts.append([v, min(self.REMEMBERED, y)]) + partial = [[0, self.REMEMBERED]] + pts + row.append(ForgettingCurve(partial)) + self.curves.append(row) + + def register_point(self, grade, item, now): + af_index = item.af_index() if item.repetition > 0 else item.lapse + self.curves[item.repetition][af_index].register_point(grade, item.uf(now)) + + def data(self): + return { + "points": [ + [self.curves[r][a].points for a in range(RANGE_AF)] + for r in range(RANGE_REPETITION) + ] + } + + @classmethod + def load(cls, sm, data): + return cls(sm, data.get("points")) + + +# ============================================================================ +# R-Factor Matrix +# ============================================================================ + + +class RFM: + def __init__(self, sm): + self.sm = sm + + def rf(self, repetition, af_index): + return self.sm.forgetting_curves.curves[repetition][af_index].uf( + 100 - self.sm.requested_fi + ) + + +# ============================================================================ +# O-Factor Matrix +# ============================================================================ + + +class OFM: + INITIAL_REP_VALUE = 1 + + def __init__(self, sm): + self.sm = sm + self._ofm = None + self._ofm0 = None + self.update() + + def update(self): + def af_from_index(a): + return a * NOTCH_AF + MIN_AF + + def rep_from_index(r): + return r + self.INITIAL_REP_VALUE + + # D-factors: power law decay along repetition axis + dfs = [] + for a in range(RANGE_AF): + pts = [ + [rep_from_index(r), self.sm.rfm.rf(r, a)] + for r in range(1, RANGE_REPETITION) + ] + fp = [rep_from_index(1), af_from_index(a)] + model = fixed_point_power_law_regression(pts, fp) + dfs.append(model["b"]) + + # Transform D-factors + dfs_t = [af_from_index(a) / (2.0 ** dfs[a]) for a in range(RANGE_AF)] + + # Linear regression of D-factor by A-Factor index + decay_pts = [[a, dfs_t[a]] for a in range(RANGE_AF)] + decay = linear_regression(decay_pts) + + # Build O-Factor model per A-Factor + ofm_list = [] + for a in range(RANGE_AF): + af = af_from_index(a) + d_y = decay["y"](a) + b = math.log(af / d_y) / math.log(rep_from_index(1)) if d_y != 0 else 0 + model = power_law_model(af / (rep_from_index(1) ** b), b) + + def make_ofm_funcs(m): + return { + "y": lambda r, m=m: m["y"](rep_from_index(r)), + "x": lambda y, m=m: m["x"](y) - self.INITIAL_REP_VALUE, + } + + ofm_list.append(make_ofm_funcs(model)) + + self._ofm = ofm_list + + # O-Factor for repetition 0 + ofm0_pts = [[a, self.sm.rfm.rf(0, a)] for a in range(RANGE_AF)] + ofm0 = exponential_regression(ofm0_pts) + self._ofm0 = lambda a: ofm0["y"](a) + + def of(self, repetition, af_index): + if repetition == 0: + return self._ofm0(af_index) + return self._ofm[af_index]["y"](repetition) + + def af(self, repetition, of_val): + for a in range(RANGE_AF): + if abs(self.of(repetition, a) - of_val) < 1e-10: + return a * NOTCH_AF + MIN_AF + # Find closest + best, best_a = float("inf"), 0 + for a in range(RANGE_AF): + d = abs(self.of(repetition, a) - of_val) + if d < best: + best, best_a = d, a + return best_a * NOTCH_AF + MIN_AF + + +# ============================================================================ +# Item (per-card state) +# ============================================================================ + + +class Item: + MAX_AFS_COUNT = 30 + + def __init__(self, sm, value=None): + self.sm = sm + self.value = value + self.lapse = 0 + self.repetition = -1 + self.of = 1.0 + self.optimum_interval = sm.interval_base # ms + self.due_date = datetime.datetime(1970, 1, 1) + self.previous_date = None + self._afs = [] + self._af = None + + def interval(self, now=None): + if now is None: + now = datetime.datetime.now() + if self.previous_date is None: + return self.sm.interval_base + return (now - self.previous_date).total_seconds() * 1000 + + def uf(self, now=None): + if now is None: + now = datetime.datetime.now() + adjusted = self.optimum_interval / self.of + return self.interval(now) / adjusted if adjusted else 0 + + def af(self, value=None): + if value is None: + return self._af + a = round((value - MIN_AF) / NOTCH_AF) + self._af = max(MIN_AF, min(MAX_AF, MIN_AF + a * NOTCH_AF)) + return self._af + + def af_index(self): + target = self.af() if self._af is not None else MIN_AF + best, best_i = float("inf"), 0 + for i in range(RANGE_AF): + d = abs(target - (MIN_AF + i * NOTCH_AF)) + if d < best: + best, best_i = d, i + return best_i + + def _I(self, now=None): + if now is None: + now = datetime.datetime.now() + af_idx = self.lapse if self.repetition == 0 else self.af_index() + of_val = self.sm.ofm.of(self.repetition, af_idx) + self.of = max(1.0, (of_val - 1) * (self.interval(now) / self.optimum_interval) + 1) + self.optimum_interval = round(self.optimum_interval * self.of) + self.previous_date = now + self.due_date = now + datetime.timedelta(milliseconds=self.optimum_interval) + + def _update_af(self, grade, now=None): + if now is None: + now = datetime.datetime.now() + estimated_fi = max(1.0, self.sm.fi_g.fi(grade)) + corrected_uf = self.uf(now) * (self.sm.requested_fi / estimated_fi) + if self.repetition > 0: + estimated_af = self.sm.ofm.af(self.repetition, corrected_uf) + else: + estimated_af = max(MIN_AF, min(MAX_AF, corrected_uf)) + self._afs.append(estimated_af) + if len(self._afs) > self.MAX_AFS_COUNT: + self._afs = self._afs[-self.MAX_AFS_COUNT:] + wsum = sum(af * (i + 1) for i, af in enumerate(self._afs)) + wtotal = sum(range(1, len(self._afs) + 1)) + self.af(wsum / wtotal if wtotal else estimated_af) + + def answer(self, grade, now=None): + if now is None: + now = datetime.datetime.now() + if self.repetition >= 0: + self._update_af(grade, now) + if grade >= THRESHOLD_RECALL: + if self.repetition < RANGE_REPETITION - 1: + self.repetition += 1 + self._I(now) + else: + if self.lapse < RANGE_AF - 1: + self.lapse += 1 + self.optimum_interval = self.sm.interval_base + self.previous_date = None + self.due_date = now + self.repetition = -1 + + def data(self): + return { + "value": self.value, + "repetition": self.repetition, + "lapse": self.lapse, + "of": self.of, + "optimumInterval": self.optimum_interval, + "dueDate": self.due_date.isoformat(), + "previousDate": ( + self.previous_date.isoformat() if self.previous_date else None + ), + "_afs": self._afs, + } + + @classmethod + def load(cls, sm, data): + item = cls(sm) + item.value = data.get("value") + item.repetition = data.get("repetition", -1) + item.lapse = data.get("lapse", 0) + item.of = data.get("of", 1.0) + item.optimum_interval = data.get("optimumInterval", sm.interval_base) + item._afs = data.get("_afs", []) + due_str = data.get("dueDate") + if due_str: + if isinstance(due_str, str): + item.due_date = datetime.datetime.fromisoformat( + due_str.replace("Z", "+00:00") + ) + else: + item.due_date = datetime.datetime.fromtimestamp(due_str / 1000) + prev_str = data.get("previousDate") + if prev_str: + if isinstance(prev_str, str): + item.previous_date = datetime.datetime.fromisoformat( + prev_str.replace("Z", "+00:00") + ) + else: + item.previous_date = datetime.datetime.fromtimestamp(prev_str / 1000) + if item._afs: + item.af(sum(item._afs) / len(item._afs)) + return item + + +# ============================================================================ +# SM (global scheduler) +# ============================================================================ + + +class SM: + def __init__(self): + self.requested_fi = 10.0 + self.interval_base = 3 * 60 * 60 * 1000 # 3 hours in ms + self.q = [] + self.fi_g = FI_G(self) + self.forgetting_curves = ForgettingCurves(self) + self.rfm = RFM(self) + self.ofm = OFM(self) + + def _find_index_to_insert(self, item, r=None): + if r is None: + r = list(range(len(self.q))) + if not r: + return 0 + v = item.due_date + i = len(r) // 2 + if len(r) == 1: + return r[i] if v < self.q[r[i]].due_date else r[i] + 1 + if v < self.q[r[i]].due_date: + return self._find_index_to_insert(item, r[:i]) + return self._find_index_to_insert(item, r[i:]) + + def add_item(self, value): + item = Item(self, value) + idx = self._find_index_to_insert(item) + self.q.insert(idx, item) + + def next_item(self, is_advanceable=False): + if not self.q: + return None + now = datetime.datetime.now() + if is_advanceable or self.q[0].due_date < now: + return self.q[0] + return None + + def answer(self, grade, item, now=None): + if now is None: + now = datetime.datetime.now() + self._update(grade, item, now) + self.discard(item) + idx = self._find_index_to_insert(item) + self.q.insert(idx, item) + + def _update(self, grade, item, now=None): + if now is None: + now = datetime.datetime.now() + if item.repetition >= 0: + self.forgetting_curves.register_point(grade, item, now) + self.ofm.update() + self.fi_g.update(grade, item, now) + item.answer(grade, now) + + def discard(self, item): + if item in self.q: + self.q.remove(item) + + def data(self): + return { + "requestedFI": self.requested_fi, + "intervalBase": self.interval_base, + "q": [item.data() for item in self.q], + "fi_g": self.fi_g.data(), + "forgettingCurves": self.forgetting_curves.data(), + "version": 1, + } + + @classmethod + def load(cls, data): + sm = cls() + sm.requested_fi = data.get("requestedFI", 10.0) + sm.interval_base = data.get("intervalBase", 3 * 60 * 60 * 1000) + sm.q = [Item.load(sm, d) for d in data.get("q", [])] + sm.fi_g = FI_G.load(sm, data.get("fi_g", {})) + sm.forgetting_curves = ForgettingCurves.load( + sm, data.get("forgettingCurves", {}) + ) + sm.rfm = RFM(sm) + sm.ofm = OFM(sm) + return sm + + +# ============================================================================ +# Global state management +# ============================================================================ + +_GLOBAL_STATE_FILE = pathlib.Path( + config_var.get()["global"]["paths"]["data"] +) / "global" / "sm15m_global_state.json" def _get_global_sm(): - """获取全局 SM 实例, 从文件加载或创建新的""" if os.path.exists(_GLOBAL_STATE_FILE): try: with open(_GLOBAL_STATE_FILE, "r", encoding="utf-8") as f: - data = json.load(f) - sm_instance = SM.load(data) - return sm_instance + return SM.load(json.load(f)) except Exception: - # 如果加载失败, 创建新的实例 - pass - - # 创建新的 SM 实例 - sm_instance = SM() - # 保存初始状态 - _save_global_sm(sm_instance) - return sm_instance + logger.warning("SM-15M 全局状态文件加载失败,创建新实例") + sm = SM() + _save_global_sm(sm) + return sm -def _save_global_sm(sm_instance): - """保存全局 SM 实例到文件""" +def _save_global_sm(sm): try: - data = sm_instance.data() + _GLOBAL_STATE_FILE.parent.mkdir(parents=True, exist_ok=True) with open(_GLOBAL_STATE_FILE, "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) + json.dump(sm.data(), f, indent=2) except Exception: - # 忽略保存错误 - pass + logger.exception("SM-15M 全局状态保存失败") -class SM15MAlgorithm: +# ============================================================================ +# SM15MAlgorithm (HeurAMS interface) +# ============================================================================ + + +class SM15MAlgorithm(BaseAlgorithm): algo_name = "SM-15M" + desc = "基于 sm.js 的 SM-15 间隔重复算法" class AlgodataDict(TypedDict): - efactor: float + # SM-15M 特有 + lapse: int + repetition: int + of_val: float # O-Factor + optimum_interval_days: int # 最优间隔(天) + afs: list # A-Factor 历史 + af: float # 当前 A-Factor + # 毫秒精度(子日排程) + last_date_ms: int + next_date_ms: int + # BaseAlgorithm 兼容(天精度,向后兼容) real_rept: int rept: int interval: int @@ -73,219 +656,178 @@ class SM15MAlgorithm: last_modify: float defaults = { - "efactor": 2.5, + "lapse": 0, + "repetition": -1, + "of_val": 1.0, + "optimum_interval_days": 0, + "afs": [], + "af": 0.0, "real_rept": 0, "rept": 0, "interval": 0, "last_date": 0, "next_date": 0, "is_activated": 0, - "last_modify": 0.0, + # 毫秒精度字段 + "last_date_ms": 0, + "next_date_ms": 0, + "last_modify": get_timestamp(), } @classmethod - def _get_timestamp(cls): - """获取当前时间戳(秒)""" - return datetime.datetime.now().timestamp() + def _algodata_to_item(cls, algodata, sm): + data = algodata.get(cls.algo_name, cls.defaults.copy()) + item = Item(sm) + item.repetition = data.get("repetition", -1) + item.lapse = data.get("lapse", 0) + item.of = data.get("of_val", 1.0) + item._afs = list(data.get("afs", [])) + af = data.get("af", 0.0) + if af > 0: + item.af(af) + if item._afs: + if item._af is None and item._afs: + item.af(sum(item._afs) / len(item._afs)) - @classmethod - def _get_daystamp(cls): - """获取当前天数戳(从某个纪元开始的天数)""" - # 使用与原始 SM-2 相同的纪元:1970-01-01 - now = datetime.datetime.now() - epoch = datetime.datetime(1970, 1, 1) - delta = now - epoch - return delta.days + opt_days = data.get("optimum_interval_days", 0) + item.optimum_interval = ( + opt_days * 24 * 60 * 60 * 1000 if opt_days > 0 else sm.interval_base + ) - @classmethod - def _algodata_to_item(cls, algodata, sm_instance): - """将 algodata 转换为 Item 实例""" - # 从 algodata 获取 SM-2 数据 - sm15_data = algodata.get(cls.algo_name, cls.defaults.copy()) - - # 创建 Item 实例 - item = Item(sm_instance) - - # 映射字段 - # efactor -> A-Factor (需要转换) - efactor = sm15_data.get("efactor", 2.5) - # SM-2 的 efactor 范围 [1.3, 2.5+], SM-15 的 A-Factor 范围 [1.2, 6.9] - # 简单线性映射:af = (efactor - 1.3) * (MAX_AF - MIN_AF) / (2.5 - 1.3) + MIN_AF - # 但 efactor 可能大于 2.5, 所以需要限制 - af = max(MIN_AF, min(MAX_AF, efactor * 2.0)) # 粗略映射 - # 调试 - # print(f"DEBUG: efactor={efactor}, af before set={af}") - item.af(af) - # print(f"DEBUG: item.af() after set={item.af()}") - - # rept -> repetition (成功回忆次数) - rept = sm15_data.get("rept", 0) - item.repetition = ( - rept - 1 if rept > 0 else -1 - ) # SM-15 中 repetition=-1 表示新项目 - - # real_rept -> lapse? 或者忽略 - real_rept = sm15_data.get("real_rept", 0) - # 可以存储在 value 中或忽略 - - # interval -> optimum_interval (需要从天数转换为毫秒) - interval_days = sm15_data.get("interval", 0) - if interval_days == 0: - item.optimum_interval = sm_instance.interval_base + # 毫秒精度优先,退化至天精度 + last_date_ms = data.get("last_date_ms", 0) + if last_date_ms: + item.previous_date = datetime.datetime(1970, 1, 1) + datetime.timedelta( + milliseconds=last_date_ms + ) else: - item.optimum_interval = interval_days * 24 * 60 * 60 * 1000 # 天转毫秒 + last_date = data.get("last_date", 0) + item.previous_date = ( + daystamp_to_datetime(last_date).replace(tzinfo=None) + if last_date > 0 else None + ) - # last_date -> previous_date - last_date_days = sm15_data.get("last_date", 0) - if last_date_days > 0: - epoch = datetime.datetime(1970, 1, 1) - item.previous_date = epoch + datetime.timedelta(days=last_date_days) - - # next_date -> due_date - next_date_days = sm15_data.get("next_date", 0) - if next_date_days > 0: - epoch = datetime.datetime(1970, 1, 1) - item.due_date = epoch + datetime.timedelta(days=next_date_days) - - # is_activated 和 last_modify 忽略 - - # 将原始 algodata 保存在 value 中以便恢复 - item.value = { - "front": "SM-15 item", - "back": "SM-15 item", - "_sm15_data": sm15_data, - } + next_date_ms = data.get("next_date_ms", 0) + if next_date_ms: + item.due_date = datetime.datetime(1970, 1, 1) + datetime.timedelta( + milliseconds=next_date_ms + ) + else: + next_date = data.get("next_date", 0) + item.due_date = ( + daystamp_to_datetime(next_date).replace(tzinfo=None) + if next_date > 0 + else datetime.datetime(1970, 1, 1) + ) + item.value = {"_restored": True} return item @classmethod def _item_to_algodata(cls, item, algodata): - """将 Item 实例状态写回 algodata""" if cls.algo_name not in algodata: algodata[cls.algo_name] = cls.defaults.copy() + data = algodata[cls.algo_name] - sm15_data = algodata[cls.algo_name] + data["lapse"] = item.lapse + data["repetition"] = item.repetition + data["of_val"] = item.of - # A-Factor -> efactor (反向映射) - af = item.af() - if af is None: - af = MIN_AF - # 反向粗略映射 - efactor = max(1.3, min(af / 2.0, 10.0)) # 限制范围 - # 调试 - # print(f"DEBUG: item.af()={af}, computed efactor={efactor}") - sm15_data["efactor"] = efactor + opt_ms = max(item.optimum_interval, 0) + data["optimum_interval_days"] = round(opt_ms / (24 * 60 * 60 * 1000)) - # repetition -> rept - rept = item.repetition + 1 if item.repetition >= 0 else 0 - sm15_data["rept"] = rept + data["afs"] = list(item._afs) + data["af"] = item.af() if item._af is not None else 0.0 - # real_rept: 递增在 revisor 中处理, 这里保持不变 - # 但如果没有 real_rept 字段, 则初始化为0 - if "real_rept" not in sm15_data: - sm15_data["real_rept"] = 0 - - # optimum_interval -> interval (毫秒转天) - interval_ms = item.optimum_interval - if interval_ms == item.sm.interval_base: - sm15_data["interval"] = 0 - else: - interval_days = max(0, round(interval_ms / (24 * 60 * 60 * 1000))) - sm15_data["interval"] = interval_days - - # previous_date -> last_date + # 毫秒精度 if item.previous_date: - epoch = datetime.datetime(1970, 1, 1) - last_date_days = (item.previous_date - epoch).days - sm15_data["last_date"] = last_date_days - else: - sm15_data["last_date"] = 0 - - # due_date -> next_date - if item.due_date: - epoch = datetime.datetime(1970, 1, 1) - next_date_days = (item.due_date - epoch).days - sm15_data["next_date"] = next_date_days - else: - sm15_data["next_date"] = 0 - - # is_activated: 保持不变或设为1 - if "is_activated" not in sm15_data: - sm15_data["is_activated"] = 1 - - # last_modify: 更新时间戳 - sm15_data["last_modify"] = cls._get_timestamp() - + data["last_date_ms"] = int(item.previous_date.timestamp() * 1000) + data["last_date"] = datetime_to_daystamp(item.previous_date) + data["next_date_ms"] = int(item.due_date.timestamp() * 1000) + data["next_date"] = datetime_to_daystamp(item.due_date) + data["interval"] = max( + 0, data["next_date"] - (data.get("last_date", 0) or 0) + ) + data["last_modify"] = get_timestamp() return algodata @classmethod def revisor( cls, algodata: dict, feedback: int = 5, is_new_activation: bool = False ): - """SM-15 算法迭代决策机制实现""" - # 获取全局 SM 实例 - sm_instance = _get_global_sm() + logger.debug( + "SM-15M.revisor 开始, feedback=%d, is_new_activation=%s", + feedback, + is_new_activation, + ) + if feedback == -1: + return - # 将 algodata 转换为 Item - item = cls._algodata_to_item(algodata, sm_instance) + sm = _get_global_sm() + item = cls._algodata_to_item(algodata, sm) - # 处理 is_new_activation if is_new_activation: - # 重置为初始状态 item.repetition = -1 item.lapse = 0 - item.optimum_interval = sm_instance.interval_base + item.of = 1.0 + item.optimum_interval = sm.interval_base item.previous_date = None - item.due_date = datetime.datetime.fromtimestamp(0) - item.af(2.5) # 重置 efactor + item.due_date = datetime.datetime(1970, 1, 1) + item._afs = [] + item._af = None + item.af(2.5) - # 将项目临时添加到 SM 实例(以便 answer 更新共享状态) - sm_instance.q.append(item) + sm.answer(feedback, item) + _save_global_sm(sm) - # 处理反馈(评分) - # SM-2 的 feedback 是 0-5, SM-15 的 grade 也是 0-5 - grade = feedback - now = datetime.datetime.now() - - # 调用 answer 方法 - item.answer(grade, now) - - # 更新共享状态(FI-Graph, ForgettingCurves, OFM) - if item.repetition >= 0: - sm_instance.forgetting_curves.register_point(grade, item, now) - sm_instance.ofm.update() - sm_instance.fi_g.update(grade, item, now) - - # 从队列中移除项目 - sm_instance.q.remove(item) - - # 保存全局状态 - _save_global_sm(sm_instance) - - # 将更新后的 Item 状态写回 algodata cls._item_to_algodata(item, algodata) - - # 更新 real_rept(总复习次数) algodata[cls.algo_name]["real_rept"] += 1 + if feedback >= THRESHOLD_RECALL: + algodata[cls.algo_name]["rept"] += 1 + + logger.debug( + "SM-15M.revisor 完成: repetition=%d, of=%.4f, next_date=%d", + item.repetition, + item.of, + algodata[cls.algo_name]["next_date"], + ) @classmethod def is_due(cls, algodata): - """检查项目是否到期""" - sm15_data = algodata.get(cls.algo_name, cls.defaults.copy()) - next_date_days = sm15_data.get("next_date", 0) - current_daystamp = cls._get_daystamp() - return next_date_days <= current_daystamp + data = algodata.get(cls.algo_name, cls.defaults.copy()) + # 毫秒精度优先 + next_date_ms = data.get("next_date_ms", 0) + if next_date_ms: + result = next_date_ms <= get_timestamp_ms() + logger.debug( + "SM-15M.is_due: next_date_ms=%d, now_ms=%d, result=%s", + next_date_ms, + get_timestamp_ms(), + result, + ) + return result + # 退化至天精度 + next_date = data.get("next_date", 0) + current = get_daystamp() + result = next_date <= current + logger.debug( + "SM-15M.is_due: next_date=%d, current=%d, result=%s", + next_date, + current, + result, + ) + return result @classmethod - def rate(cls, algodata): - """获取项目的评分(返回 efactor 字符串)""" - sm15_data = algodata.get(cls.algo_name, cls.defaults.copy()) - efactor = sm15_data.get("efactor", 2.5) - return str(efactor) + def get_rating(cls, algodata): + data = algodata.get(cls.algo_name, cls.defaults.copy()) + af = data.get("af", 0.0) + logger.debug("SM-15M.get_rating: af=%f", af) + return str(af) @classmethod def nextdate(cls, algodata) -> int: - """获取下次复习日期(天数戳)""" - sm15_data = algodata.get(cls.algo_name, cls.defaults.copy()) - next_date_days = sm15_data.get("next_date", 0) - return next_date_days + data = algodata.get(cls.algo_name, cls.defaults.copy()) + n = data.get("next_date", 0) + logger.debug("SM-15M.nextdate: %d", n) + return n diff --git a/src/heurams/kernel/algorithms/sm15m_calc.py b/src/heurams/kernel/algorithms/sm15m_calc.py deleted file mode 100644 index d70021b..0000000 --- a/src/heurams/kernel/algorithms/sm15m_calc.py +++ /dev/null @@ -1,1572 +0,0 @@ -""" -基于: https://github.com/slaypni/sm.js -原始 CoffeeScript 代码: (c) 2014 Kazuaki Tanida -MIT 许可证 - -================================================================================ - -主要算法概念: - -1. 间隔重复 (Spaced Repetition) - - 根据记忆强度动态调整复习间隔 - - 使用遗忘曲线预测记忆保留率 - -2. A-Factor (难度因子) - - 表示项目的记忆难度 - - 范围: MIN_AF (1.2) 到 MAX_AF (≈7.5) - - 值越大表示项目越容易记忆 - -3. O-Factor (最优因子) - - 基于重复次数和难度因子的最优间隔乘数 - - 存储在 O-Factor 矩阵中 - -4. R-Factor (回忆因子) - - 基于重复次数和实际遗忘指数的实际间隔乘数 - - 存储在 R-Factor 矩阵中 - -5. 遗忘曲线 (Forgetting Curve) - - 描述记忆保留率随时间衰减的曲线 - - 用于计算遗忘指数 (Forgetting Index) - -6. 遗忘指数-评分图 (FI-Grade Graph) - - 建立遗忘指数与用户评分之间的关系 - - 用于校正回忆因子 - -================================================================================ -""" - -import datetime -import json -import math -import sys - -# ============================================================================ -# Global Constants -# ============================================================================ - -# A-Factor 的取值范围大小(矩阵维度) -RANGE_AF = 20 - -# 重复次数的取值范围大小(矩阵维度) -RANGE_REPETITION = 20 - -# 最小 A-Factor 值(最简单的项目) -MIN_AF = 1.2 - -# A-Factor 的步长(每个等级的增量) -NOTCH_AF = 0.3 - -# 最大 A-Factor 值(最难的项目) -# 计算公式: MIN_AF + NOTCH_AF * (RANGE_AF - 1) = 1.2 + 0.3 * 19 = 6.9 -MAX_AF = MIN_AF + NOTCH_AF * (RANGE_AF - 1) - -# 最大评分值(用户评分的上限) -MAX_GRADE = 5 - -# 记忆阈值:评分 >= 此值表示成功回忆 -THRESHOLD_RECALL = 3 - -# ============================================================================ -# Helper Functions -# ============================================================================ - - -def sum_values(values): - """ - 计算列表中所有数值的和 - - 参数: - values: 数值列表 - - 返回: - 所有数值的总和 - """ - return sum(values) - - -def mse(y_func, points): - """ - 计算函数 y 与数据点之间的均方误差 (Mean Squared Error) - - 参数: - y_func: 函数 y = f(x) - points: 数据点列表, 每个点为 (x, y) - - 返回: - 均方误差值, 衡量函数拟合程度 - """ - errors = [(y_func(p[0]) - p[1]) ** 2 for p in points] - return sum(errors) / len(points) if errors else 0 - - -def exponential_regression(points): - """ - 指数回归: y = a * exp(b * x) - - 使用最小二乘法拟合指数函数 y = a * e^(b*x)。 - 算法参考: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html - - 参数: - points: 数据点列表, 每个点为 (x, y) - - 返回: - 包含以下键的字典: - - 'y': 函数 y(x) = a * exp(b * x) - - 'x': 反函数 x(y) = (ln(y) - ln(a)) / b - - 'a': 系数 a - - 'b': 指数系数 b - - 'mse': 计算均方误差的函数 - - 数学推导: - 对 y = a * e^(b*x) 两边取对数: ln(y) = ln(a) + b*x - 令 Y' = ln(y), a' = ln(a), 转换为线性回归: Y' = a' + b*x - 使用最小二乘法求解 a' 和 b, 然后 a = exp(a') - """ - n = len(points) - X = [p[0] for p in points] - Y = [p[1] for p in points] - logY = [math.log(y) for y in Y] - sqX = [x * x for x in X] - - sum_logY = sum(logY) - sum_sqX = sum(sqX) - sumX = sum(X) - sumX_logY = sum(X[i] * logY[i] for i in range(n)) - sq_sumX = sumX * sumX - - a_coeff = (sum_logY * sum_sqX - sumX * sumX_logY) / (n * sum_sqX - sq_sumX) - b_coeff = (n * sumX_logY - sumX * sum_logY) / (n * sum_sqX - sq_sumX) - - a = math.exp(a_coeff) - b = b_coeff - - def y_func(x): - return a * math.exp(b * x) - - def x_func(y): - return (-a_coeff + math.log(y)) / b if b != 0 else 0 - - result = { - "y": y_func, - "x": x_func, - "a": a, - "b": b, - "mse": lambda: mse(y_func, points), - } - return result - - -def linear_regression(points): - """ - 线性回归: y = a + b * x - - 使用最小二乘法拟合线性函数。 - - 参数: - points: 数据点列表, 每个点为 (x, y) - - 返回: - 包含以下键的字典: - - 'y': 函数 y(x) = a + b * x - - 'x': 反函数 x(y) = (y - a) / b - - 'a': 截距 - - 'b': 斜率 - - 计算公式: - b = (n*Σxy - ΣxΣy) / (n*Σx² - (Σx)²) - a = (Σy - b*Σx) / n - """ - n = len(points) - X = [p[0] for p in points] - Y = [p[1] for p in points] - sqX = [x * x for x in X] - - sumY = sum(Y) - sum_sqX = sum(sqX) - sumX = sum(X) - sumXY = sum(X[i] * Y[i] for i in range(n)) - sq_sumX = sumX * sumX - - a = (sumY * sum_sqX - sumX * sumXY) / (n * sum_sqX - sq_sumX) - b = (n * sumXY - sumX * sumY) / (n * sum_sqX - sq_sumX) - - def y_func(x): - return a + b * x - - def x_func(y): - return (y - a) / b if b != 0 else 0 - - return {"y": y_func, "x": x_func, "a": a, "b": b} - - -def power_law_model(a, b): - """ - 幂律模型: y = a * x^b - - 创建幂律函数模型对象。 - - 参数: - a: 系数 - b: 指数 - - 返回: - 包含以下键的字典: - - 'y': 函数 y(x) = a * x^b - - 'x': 反函数 x(y) = (y / a)^(1/b) - - 'a': 系数 a - - 'b': 指数 b - """ - - def y_func(x): - return a * (x**b) - - def x_func(y): - return (y / a) ** (1 / b) if a != 0 and b != 0 else 0 - - return {"y": y_func, "x": x_func, "a": a, "b": b} - - -def power_law_regression(points): - """ - 幂律回归: y = a * x^b - - 使用最小二乘法拟合幂律函数。 - 算法参考: http://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html - - 参数: - points: 数据点列表, 每个点为 (x, y) - - 返回: - 幂律模型字典(包含 'y', 'x', 'a', 'b', 'mse' 键) - - 数学推导: - 对 y = a * x^b 两边取对数: ln(y) = ln(a) + b * ln(x) - 令 Y' = ln(y), X' = ln(x), a' = ln(a) - 转换为线性回归: Y' = a' + b * X' - 使用最小二乘法求解 a' 和 b, 然后 a = exp(a') - """ - n = len(points) - X = [p[0] for p in points] - Y = [p[1] for p in points] - logX = [math.log(x) for x in X] - logY = [math.log(y) for y in Y] - - sum_logX_logY = sum(logX[i] * logY[i] for i in range(n)) - sum_logX = sum(logX) - sum_logY = sum(logY) - sum_sq_logX = sum(lx * lx for lx in logX) - sq_sum_logX = sum_logX * sum_logX - - b = (n * sum_logX_logY - sum_logX * sum_logY) / (n * sum_sq_logX - sq_sum_logX) - a_coeff = (sum_logY - b * sum_logX) / n - a = math.exp(a_coeff) - - model = power_law_model(a, b) - model["mse"] = lambda: mse(model["y"], points) - return model - - -def fixed_point_power_law_regression(points, fixed_point): - """ - 定点幂律回归: y = q * (x/p)^b - - 拟合经过固定点 (p, q) 的幂律函数。 - 在 SM-15 算法中用于拟合 O-Factor 矩阵。 - - 参数: - points: 数据点列表, 每个点为 (x, y) - fixed_point: 固定点 (p, q), 函数必须经过此点 - - 返回: - 幂律模型字典(包含 'y', 'x', 'a', 'b' 键) - - 数学推导: - 给定固定点 (p, q), 模型为: y = q * (x/p)^b - 对两边取对数: ln(y) = b * ln(x/p) + ln(q) - 令 Y' = ln(y) - ln(q), X' = ln(x/p) - 转换为通过原点的线性回归: Y' = b * X' - 使用最小二乘法求解 b - """ - n = len(points) - p, q = fixed_point - logQ = math.log(q) - - X = [math.log(point[0] / p) for point in points] - Y = [math.log(point[1]) - logQ for point in points] - - # Linear regression through origin on transformed points - sumXY = sum(X[i] * Y[i] for i in range(n)) - sum_sqX = sum(x * x for x in X) - b = sumXY / sum_sqX if sum_sqX != 0 else 0 - - model = power_law_model(q / (p**b), b) - return model - - -def linear_regression_through_origin(points): - """ - 通过原点的线性回归: y = b * x - - 拟合通过原点的线性函数, 即截距为 0。 - - 参数: - points: 数据点列表, 每个点为 (x, y) - - 返回: - 包含以下键的字典: - - 'y': 函数 y(x) = b * x - - 'x': 反函数 x(y) = y / b - - 'b': 斜率 - - 计算公式: - b = Σ(x_i * y_i) / Σ(x_i²) - """ - n = len(points) - X = [p[0] for p in points] - Y = [p[1] for p in points] - - sumXY = sum(X[i] * Y[i] for i in range(n)) - sum_sqX = sum(x * x for x in X) - b = sumXY / sum_sqX if sum_sqX != 0 else 0 - - def y_func(x): - return b * x - - def x_func(y): - return y / b if b != 0 else 0 - - return {"y": y_func, "x": x_func, "b": b} - - -# ============================================================================ -# Core Classes -# ============================================================================ - - -class Item: - """ - 表示单个闪卡项目(记忆项目)。 - - 在 SM-15 算法中, 每个项目代表一个需要记忆的单元(如单词、概念等)。 - 项目包含记忆状态、复习历史和算法参数。 - - 属性: - sm: 所属的 SM 实例 - value: 项目内容(通常是字典, 包含 front/back) - lapse: 遗忘次数 - repetition: 成功回忆次数(-1 表示新项目) - of: O-Factor 值(最优因子) - optimum_interval: 最优复习间隔(毫秒) - due_date: 下次复习到期时间 - previous_date: 上次复习时间 - _afs: 估计的 A-Factor 历史记录 - _af: 当前 A-Factor 值 - - 主要功能: - 1. 计算实际间隔和 UF(使用因子) - 2. 管理 A-Factor(难度因子) - 3. 处理用户评分并更新记忆状态 - 4. 计算下一次复习间隔 - 5. 序列化和反序列化 - - 算法原理: - - 间隔重复基于最优间隔和 O-Factor 调整 - - A-Factor 反映项目难度, 通过历史估计值加权平均计算 - - UF(使用因子)是实际间隔与调整后最优间隔的比率 - - 当评分低于阈值时, 项目被标记为遗忘(lapse增加) - """ - - MAX_AFS_COUNT = 30 - - def __init__(self, sm, value=None): - """ - 初始化新的闪卡项目。 - - 参数: - sm: 所属的 SM 实例 - value: 项目内容(通常是包含 front/back 的字典) - - 初始状态: - - lapse(遗忘次数): 0 - - repetition(重复次数): -1(表示新项目) - - of(O-Factor): 1.0(默认值) - - optimum_interval(最优间隔): 等于 SM 的基础间隔 - - due_date(到期时间): 1970-01-01(立即到期) - - previous_date(上次复习): None(尚未复习) - - _afs(A-Factor 历史): 空列表 - - _af(当前 A-Factor): None(尚未计算) - """ - self.sm = sm - self.value = value - self.lapse = 0 - self.repetition = -1 - self.of = 1.0 - self.optimum_interval = sm.interval_base - self.due_date = datetime.datetime.fromtimestamp(0) # epoch start - self.previous_date = None - self._afs = [] # estimated A-Factor history - self._af = None # current A-Factor - - def interval(self, now=None): - """ - 计算自上次复习以来的实际间隔。 - - 参数: - now: 当前时间(默认为当前时间) - - 返回: - 实际间隔(毫秒) - - 注意: - - 如果项目尚未复习过(previous_date为None), 返回基础间隔 - - 间隔计算使用实际经过的时间, 而非计划的间隔 - - 返回值为毫秒, 与SM-15算法内部表示一致 - """ - if now is None: - now = datetime.datetime.now() - - if self.previous_date is None: - return self.sm.interval_base - return ( - now - self.previous_date - ).total_seconds() * 1000 # convert to milliseconds - - def uf(self, now=None): - """ - 计算 UF(使用因子, Utilization Factor)。 - - UF 是实际间隔与调整后最优间隔的比率: - UF = 实际间隔 / (最优间隔 / O-Factor) - - 参数: - now: 当前时间(默认为当前时间) - - 返回: - UF 值 - - 算法意义: - - UF = 1: 实际间隔等于调整后最优间隔 - - UF > 1: 实际间隔长于最优间隔(可能更难回忆) - - UF < 1: 实际间隔短于最优间隔(可能更容易回忆) - - UF 用于估计 A-Factor 和校正记忆模型 - """ - if now is None: - now = datetime.datetime.now() - - interval = self.interval(now) - adjusted_optimum = self.optimum_interval / self.of - return interval / adjusted_optimum if adjusted_optimum != 0 else 0 - - def af(self, value=None): - """ - 获取或设置 A-Factor(难度因子)。 - - A-Factor 表示项目的记忆难度, 值越大表示项目越容易记忆。 - 取值范围: MIN_AF (1.2) 到 MAX_AF (≈7.5), 步长为 NOTCH_AF (0.3)。 - - 参数: - value: 要设置的 A-Factor 值(如果为None则返回当前值) - - 返回: - 当前或设置后的 A-Factor 值 - - 处理逻辑: - - 如果 value 为 None: 返回当前 _af 值 - - 如果提供 value: 将其舍入到最近的 notch 值, 确保在有效范围内 - - 舍入公式: a = round((value - MIN_AF) / NOTCH_AF) - - 最终值: MIN_AF + a * NOTCH_AF, 限制在 [MIN_AF, MAX_AF] 范围内 - """ - if value is None: - return self._af - - # Round to nearest notch - a = round((value - MIN_AF) / NOTCH_AF) - self._af = max(MIN_AF, min(MAX_AF, MIN_AF + a * NOTCH_AF)) - return self._af - - def af_index(self): - """ - 获取最接近的 A-Factor 在矩阵中的索引。 - - 由于 A-Factor 矩阵使用离散值(20个等级), 需要将连续的实际 A-Factor - 映射到最接近的离散值索引。 - - 返回: - A-Factor 矩阵中的索引(0 到 RANGE_AF-1) - - 算法: - 1. 生成所有可能的 A-Factor 值: MIN_AF + i * NOTCH_AF - 2. 计算当前 A-Factor 与每个可能值的绝对差 - 3. 返回差值最小的索引 - - 用途: - 用于从 O-Factor 矩阵和 R-Factor 矩阵中查找对应的值。 - """ - afs = [MIN_AF + i * NOTCH_AF for i in range(RANGE_AF)] - - # Find index with minimum difference - min_diff = float("inf") - min_index = 0 - - for i, af_val in enumerate(afs): - diff = abs(self.af() - af_val) # type: ignore - if diff < min_diff: - min_diff = diff - min_index = i - - return min_index - - def _I(self, now=None): - """ - 计算新的最优间隔(SM-15 算法的第1步)。 - - 注意:此实现与原始 SM-15 的不同之处在于使用实际间隔而非先前计算的间隔。 - - 参数: - now: 当前时间(默认为当前时间) - - 算法步骤: - 1. 根据重复次数和 A-Factor 索引从 O-Factor 矩阵获取 O-Factor 值 - 2. 计算新的 O-Factor: of = max(1, (of_val - 1) * (实际间隔/最优间隔) + 1) - 3. 更新最优间隔: 最优间隔 = round(最优间隔 * of) - 4. 更新时间: previous_date = now, due_date = now + 最优间隔 - - 特殊处理: - - 对于第一次重复(repetition == 0), 使用 lapse 作为 A-Factor 索引 - - 对于后续重复, 使用 af_index() 计算的索引 - - 数学意义: - - O-Factor 根据实际表现动态调整 - - 如果实际间隔长于最优间隔, O-Factor 增加(下次间隔更长) - - 如果实际间隔短于最优间隔, O-Factor 减小(下次间隔更短) - """ - if now is None: - now = datetime.datetime.now() - - # Get O-Factor from matrix - if self.repetition == 0: - af_index = self.lapse - else: - af_index = self.af_index() - - of_val = self.sm.ofm.of(self.repetition, af_index) - - # Calculate new O-Factor - actual_interval = self.interval(now) - self.of = max(1.0, (of_val - 1) * (actual_interval / self.optimum_interval) + 1) - - # Update optimum interval - self.optimum_interval = round(self.optimum_interval * self.of) - - # Update dates - self.previous_date = now - self.due_date = now + datetime.timedelta(milliseconds=self.optimum_interval) - - def _update_af(self, grade, now=None): - """ - 基于评分更新 A-Factor(SM-15 算法的第9、11步)。 - - 参数: - grade: 用户评分(0-5) - now: 当前时间(默认为当前时间) - - 算法步骤: - 1. 从 FI-Grade 图估计遗忘指数 (FI) - 2. 校正 UF: corrected_uf = UF * (requested_FI / estimated_FI) - 3. 估计 A-Factor: - - 如果 repetition > 0: 从 O-Factor 矩阵反推 A-Factor - - 否则: 直接使用 corrected_uf, 限制在有效范围内 - 4. 将估计值加入历史记录(保留最近的 MAX_AFS_COUNT 个) - 5. 计算加权平均值(最近的值权重更高) - 6. 更新当前 A-Factor - - 算法意义: - - 使用遗忘指数校正 UF, 考虑实际记忆表现 - - 通过 O-Factor 矩阵反推 A-Factor, 建立 UF 与 A-Factor 的关系 - - 使用加权平均平滑估计值, 避免单次表现的过度影响 - """ - if now is None: - now = datetime.datetime.now() - - estimated_fi = max(1.0, self.sm.fi_g.fi(grade)) - corrected_uf = self.uf(now) * (self.sm.requested_fi / estimated_fi) - - # Estimate A-Factor - if self.repetition > 0: - estimated_af = self.sm.ofm.af(self.repetition, corrected_uf) - else: - estimated_af = max(MIN_AF, min(MAX_AF, corrected_uf)) - - # Add to history (keep only recent values) - self._afs.append(estimated_af) - if len(self._afs) > self.MAX_AFS_COUNT: - self._afs = self._afs[-self.MAX_AFS_COUNT :] - - # Calculate weighted average - weights = list(range(1, len(self._afs) + 1)) - weighted_sum = sum(af * weight for af, weight in zip(self._afs, weights)) - total_weight = sum(weights) - - self.af(weighted_sum / total_weight if total_weight != 0 else estimated_af) - - def answer(self, grade, now=None): - """ - 处理用户评分, 更新项目状态。 - - 这是 SM-15 算法的核心方法, 根据用户评分决定项目下一步的状态。 - - 参数: - grade: 用户评分(0-5, 0表示完全遗忘, 5表示完美回忆) - now: 当前时间(默认为当前时间) - - 处理逻辑: - 1. 如果不是新项目(repetition >= 0), 更新 A-Factor - 2. 如果评分 >= THRESHOLD_RECALL (3): - - 增加重复次数(如果未达到上限) - - 调用 _I() 计算新的最优间隔和到期时间 - 3. 如果评分 < THRESHOLD_RECALL: - - 增加遗忘次数(如果未达到上限) - - 重置最优间隔为基础间隔 - - 重置 previous_date 为 None(下次 interval() 返回基础间隔) - - 设置 due_date 为当前时间(立即重新复习) - - 重置重复次数为 -1(重新开始学习) - - 算法意义: - - 成功回忆时, 项目进入下一轮间隔重复周期 - - 遗忘时, 项目重置为初始状态, 需要重新学习 - - 阈值 THRESHOLD_RECALL 区分成功与失败回忆 - """ - if now is None: - now = datetime.datetime.now() - - # Update A-Factor if not a new item - if self.repetition >= 0: - self._update_af(grade, now) - - if grade >= THRESHOLD_RECALL: - # Remembered successfully - if self.repetition < RANGE_REPETITION - 1: - self.repetition += 1 - self._I(now) - else: - # Forgotten - if self.lapse < RANGE_AF - 1: - self.lapse += 1 - self.optimum_interval = self.sm.interval_base - self.previous_date = None # reset interval calculation - self.due_date = now - self.repetition = -1 - - def data(self): - """ - 序列化项目数据, 用于保存和加载。 - - 返回: - 包含项目所有状态的字典, 可转换为 JSON 格式保存。 - - 数据结构: - - value: 项目内容 - - repetition: 重复次数 - - lapse: 遗忘次数 - - of: O-Factor 值 - - optimumInterval: 最优间隔(毫秒) - - dueDate: 到期时间(ISO 格式字符串) - - previousDate: 上次复习时间(ISO 格式字符串或 null) - - _afs: A-Factor 历史记录列表 - - 注意: - - 日期对象转换为 ISO 格式字符串以便序列化 - - 反序列化时需要在 load() 方法中转换回 datetime 对象 - - 保持与原始 JavaScript 版本的数据格式兼容 - """ - return { - "value": self.value, - "repetition": self.repetition, - "lapse": self.lapse, - "of": self.of, - "optimumInterval": self.optimum_interval, - "dueDate": ( - self.due_date.isoformat() - if isinstance(self.due_date, datetime.datetime) - else self.due_date - ), - "previousDate": ( - self.previous_date.isoformat() - if isinstance(self.previous_date, datetime.datetime) - else self.previous_date - ), - "_afs": self._afs, - } - - @classmethod - def load(cls, sm, data): - """ - 从序列化数据加载项目。 - - 参数: - sm: 所属的 SM 实例 - data: 序列化的项目数据字典 - - 返回: - 恢复状态的 Item 实例 - - 处理逻辑: - 1. 创建新的 Item 实例 - 2. 复制基本属性(value, repetition, lapse, of, optimumInterval, _afs) - 3. 转换日期字符串为 datetime 对象 - 4. 如果 previousDate 存在则转换, 否则设为 None - 5. 如果 _af 历史记录不为空, 设置当前 A-Factor 为最后一个值 - - 注意: - - 日期字符串应为 ISO 格式(如 data() 方法生成的格式) - - 保持与原始 JavaScript 版本的数据兼容性 - - 加载后项目状态完全恢复, 包括历史记录 - """ - item = cls(sm) - - # Copy basic properties - item.value = data.get("value") - item.repetition = data.get("repetition", -1) - item.lapse = data.get("lapse", 0) - item.of = data.get("of", 1.0) - item.optimum_interval = data.get("optimumInterval", sm.interval_base) - item._afs = data.get("_afs", []) - - # Parse dates - due_date_str = data.get("dueDate") - if due_date_str: - if isinstance(due_date_str, str): - item.due_date = datetime.datetime.fromisoformat( - due_date_str.replace("Z", "+00:00") - ) - else: - # Handle numeric timestamp - item.due_date = datetime.datetime.fromtimestamp(due_date_str / 1000) - - previous_date_str = data.get("previousDate") - if previous_date_str: - if isinstance(previous_date_str, str): - item.previous_date = datetime.datetime.fromisoformat( - previous_date_str.replace("Z", "+00:00") - ) - else: - item.previous_date = datetime.datetime.fromtimestamp( - previous_date_str / 1000 - ) - - # Initialize A-Factor if we have history - if item._afs: - item.af(sum(item._afs) / len(item._afs)) - - return item - - -class FI_G: - """ - 遗忘指数-评分图(FI-Grade Graph)。 - - 建立遗忘指数(Forgetting Index)与用户评分(Grade)之间的关系。 - 用于根据用户评分估计实际遗忘指数, 从而校正记忆模型。 - - 属性: - sm: 所属的 SM 实例 - points: 数据点列表, 每个点为 [fi, grade] - _graph: 缓存的回归模型 - MAX_POINTS_COUNT: 最大数据点数(5000) - GRADE_OFFSET: 评分偏移量(1), 避免评分为0时的数学问题 - - 算法原理: - 1. 收集 (遗忘指数, 评分) 数据点 - 2. 使用指数回归拟合 FI-Grade 关系 - 3. 根据评分估计遗忘指数, 用于校正 UF 和 A-Factor - - 默认初始化: - - 点1: (0, MAX_GRADE) - 遗忘指数为0时, 评分应为最高 - - 点2: (100, 0) - 遗忘指数为100时, 评分应为最低 - - 主要功能: - 1. 记录新的数据点 - 2. 根据评分估计遗忘指数 - 3. 更新图形(SM-15 算法的第10步) - """ - - MAX_POINTS_COUNT = 5000 - GRADE_OFFSET = 1 - - def __init__(self, sm, points=None): - self.sm = sm - self._graph = None - - if points is not None: - self.points = points - else: - # Initialize with default points - self.points = [] - self._register_point(0, MAX_GRADE) - self._register_point(100, 0) - - def _register_point(self, fi, g): - """Add a point to the graph.""" - self.points.append([fi, g + self.GRADE_OFFSET]) - - # Keep only recent points - if len(self.points) > self.MAX_POINTS_COUNT: - self.points = self.points[-self.MAX_POINTS_COUNT :] - - self._graph = None # Invalidate cached regression - - def update(self, grade, item, now=None): - """Update FI-G graph with new data (Step 10 in SM-15).""" - if now is None: - now = datetime.datetime.now() - - # Expected forgetting index - def expected_fi(): - # Simple linear forgetting curve assumption - return (item.uf(now) / item.of) * self.sm.requested_fi - - # Alternative method using forgetting curves (commented out) - # curve = self.sm.forgetting_curves.curves[item.repetition][item.af_index()] - # uf_val = curve.uf(100 - self.sm.requested_fi) - # return 100 - curve.retention(item.uf() / uf_val) - - self._register_point(expected_fi(), grade) - - def fi(self, grade): - """Estimate forgetting index for given grade.""" - if not self.points: - return 50.0 # Default value - - if self._graph is None: - self._graph = exponential_regression(self.points) - - estimated = self._graph["x"](grade + self.GRADE_OFFSET) - return max(0.0, min(100.0, estimated)) - - def grade(self, fi): - """Estimate grade for given forgetting index.""" - if not self.points: - return 2.5 # Default value - - if self._graph is None: - self._graph = exponential_regression(self.points) - - estimated = self._graph["y"](fi) - return estimated - self.GRADE_OFFSET - - def data(self): - """Serialize FI-G data.""" - return {"points": self.points} - - @classmethod - def load(cls, sm, data): - """Deserialize FI-G from data.""" - return cls(sm, data.get("points")) - - -class ForgettingCurve: - """ - 单个遗忘曲线, 针对特定的重复次数和 A-Factor。 - - 描述记忆保留率(Retention)随时间(通过 UF 表示)衰减的曲线。 - 每个曲线对应一个特定的(重复次数, A-Factor)组合。 - - 属性: - points: 数据点列表, 每个点为 [uf, retention] - _curve: 缓存的指数回归模型 - MAX_POINTS_COUNT: 最大数据点数(500) - FORGOTTEN: 遗忘状态的保留率值(1) - REMEMBERED: 成功回忆状态的保留率值(101) - - 数据表示: - - UF(使用因子): x轴, 表示时间(实际间隔/调整后最优间隔) - - 保留率: y轴, 1表示完全遗忘, 101表示完全回忆(实际为0-100%加偏移) - - 偏移量 FORGOTTEN=1 避免取对数时的数学问题 - - 算法原理: - 1. 收集 (UF, 回忆结果) 数据点 - 2. 使用指数回归拟合遗忘曲线 - 3. 根据 UF 预测保留率, 或根据保留率反推 UF - - 主要功能: - 1. 注册新的数据点(回忆结果) - 2. 计算给定 UF 的保留率 - 3. 计算给定保留率的 UF - 4. 序列化和反序列化 - """ - - MAX_POINTS_COUNT = 500 - FORGOTTEN = 1 - REMEMBERED = 100 + FORGOTTEN - - def __init__(self, points): - self.points = points - self._curve = None - - def register_point(self, grade, uf): - """Add a data point to the curve.""" - is_remembered = grade >= THRESHOLD_RECALL - self.points.append([uf, self.REMEMBERED if is_remembered else self.FORGOTTEN]) - - # Keep only recent points - if len(self.points) > self.MAX_POINTS_COUNT: - self.points = self.points[-self.MAX_POINTS_COUNT :] - - self._curve = None # Invalidate cached regression - - def retention(self, uf): - """Calculate retention probability for given UF.""" - if not self.points: - return 50.0 # Default retention - - if self._curve is None: - self._curve = exponential_regression(self.points) - - estimated = self._curve["y"](uf) - clamped = max(self.FORGOTTEN, min(estimated, self.REMEMBERED)) - return clamped - self.FORGOTTEN - - def uf(self, retention): - """Calculate UF for given retention probability.""" - if not self.points: - return 1.0 # Default UF - - if self._curve is None: - self._curve = exponential_regression(self.points) - - target = retention + self.FORGOTTEN - return max(0.0, self._curve["x"](target)) - - def data(self): - """Serialize curve data.""" - return self.points - - -class ForgettingCurves: - """ - 遗忘曲线矩阵(重复次数 × A-Factor)。 - - 包含 RANGE_REPETITION × RANGE_AF 个遗忘曲线, 每个曲线对应一个 - (重复次数, A-Factor)组合。这是 SM-15 算法的核心数据结构之一。 - - 属性: - sm: 所属的 SM 实例 - curves: 二维列表的遗忘曲线矩阵 [重复次数][A-Factor索引] - FORGOTTEN: 遗忘状态的保留率值(1) - REMEMBERED: 成功回忆状态的保留率值(101) - - 矩阵结构: - - 行: 重复次数(0 到 RANGE_REPETITION-1) - - 列: A-Factor 索引(0 到 RANGE_AF-1) - - 每个单元格: 一个 ForgettingCurve 实例 - - 初始化: - - 如果提供 points 参数: 从现有数据加载曲线 - - 否则: 生成初始曲线, 基于数学公式创建初始数据点 - - 主要功能: - 1. 为特定项目和评分注册数据点 - 2. 获取特定重复次数和 A-Factor 的曲线 - 3. 序列化和反序列化整个矩阵 - 4. 管理遗忘曲线数据的收集和更新 - - 算法作用: - - 建立 UF 与保留率之间的定量关系 - - 为 R-Factor 矩阵提供数据基础 - - 帮助估计项目的记忆强度随时间的变化 - """ - - FORGOTTEN = 1 - REMEMBERED = 100 + FORGOTTEN - - def __init__(self, sm, points=None): - self.sm = sm - self.curves = [] - - # Initialize curves matrix - for r in range(RANGE_REPETITION): - row = [] - for a in range(RANGE_AF): - if points is not None: - partial_points = points[r][a] - else: - # Generate initial points - if r > 0: - partial_points = [[0, self.REMEMBERED]] + [ - [ - MIN_AF + NOTCH_AF * i, - min( - self.REMEMBERED, - math.exp( - -(r + 1) - / 200 - * (i - a * math.sqrt(2 / (r + 1))) - ) - * (self.REMEMBERED - self.sm.requested_fi), - ), - ] - for i in range(21) - ] - else: - partial_points = [[0, self.REMEMBERED]] + [ - [ - MIN_AF + NOTCH_AF * i, - min( - self.REMEMBERED, - math.exp(-1 / (10 + 1 * (a + 1)) * (i - (a**0.6))) - * (self.REMEMBERED - self.sm.requested_fi), - ), - ] - for i in range(21) - ] - - row.append(ForgettingCurve(partial_points)) - self.curves.append(row) - - def register_point(self, grade, item, now=None): - """Register a data point in the appropriate curve.""" - if item.repetition > 0: - af_index = item.af_index() - else: - af_index = item.lapse - - self.curves[item.repetition][af_index].register_point(grade, item.uf(now)) - - def data(self): - """Serialize forgetting curves data.""" - return { - "points": [ - [self.curves[r][a].data() for a in range(RANGE_AF)] - for r in range(RANGE_REPETITION) - ] - } - - @classmethod - def load(cls, sm, data): - """Deserialize forgetting curves from data.""" - return cls(sm, data.get("points")) - - -class RFM: - """ - R-Factor 矩阵(回忆因子矩阵)。 - - R-Factor 表示在给定重复次数和 A-Factor 下, 达到目标遗忘指数所需的 UF 值。 - 实际上是遗忘曲线的包装器, 提供便捷的接口访问。 - - 属性: - sm: 所属的 SM 实例 - - 计算公式: - R-Factor = curve.uf(100 - requested_fi) - 其中 curve 是对应 (repetition, af_index) 的遗忘曲线 - uf() 方法返回达到指定保留率所需的 UF 值 - - 算法意义: - - R-Factor 是实际观察到的间隔乘数 - - 表示在特定记忆强度下, 达到目标遗忘水平所需的时间倍数 - - 用于与 O-Factor(最优因子)比较, 校正记忆模型 - - 是 O-Factor 矩阵计算的基础 - - 主要功能: - 获取特定重复次数和 A-Factor 索引的 R-Factor 值 - """ - - def __init__(self, sm): - self.sm = sm - - def rf(self, repetition, af_index): - """Get R-Factor for given repetition and A-Factor index.""" - return self.sm.forgetting_curves.curves[repetition][af_index].uf( - 100 - self.sm.requested_fi - ) - - -class OFM: - """ - O-Factor 矩阵(最优因子矩阵)。 - - O-Factor 表示在给定重复次数和 A-Factor 下的最优间隔乘数。 - 基于 R-Factor 矩阵通过幂律回归计算得出。 - - 属性: - sm: 所属的 SM 实例 - _ofm: 缓存的 O-Factor 矩阵 - _ofm0: 缓存的重复次数为0时的 O-Factor 数组 - INITIAL_REP_VALUE: 初始重复值(1) - - 矩阵结构: - - 行: 重复次数(0 到 RANGE_REPETITION-1) - - 列: A-Factor 索引(0 到 RANGE_AF-1) - - 每个单元格: O-Factor 值 - - 算法原理(update() 方法, SM-15 第8步): - 1. 对于每个 A-Factor 索引: - a. 收集 (重复次数, R-Factor) 数据点 - b. 使用定点幂律回归拟合, 固定点 (1, 1) - c. 生成该 A-Factor 对应的 O-Factor 数组 - 2. 对于重复次数0: - a. 收集 (A-Factor, R-Factor) 数据点 - b. 使用幂律回归拟合 - c. 生成重复次数0时的 O-Factor 数组 - - 主要功能: - 1. 更新 O-Factor 矩阵 - 2. 获取特定重复次数和 A-Factor 索引的 O-Factor - 3. 从 O-Factor 和 UF 反推 A-Factor - """ - - INITIAL_REP_VALUE = 1 - - def __init__(self, sm): - self.sm = sm - self._ofm = None - self._ofm0 = None - self.update() - - def update(self): - """Update O-Factor matrix (Step 8 in SM-15).""" - - # Helper functions - def af_from_index(a): - return a * NOTCH_AF + MIN_AF - - def rep_from_index(r): - return r + self.INITIAL_REP_VALUE - - # Calculate D-factors - dfs = [] - for a in range(RANGE_AF): - points = [ - [rep_from_index(r), self.sm.rfm.rf(r, a)] - for r in range(1, RANGE_REPETITION) - ] - fixed_point = [rep_from_index(1), af_from_index(a)] - model = fixed_point_power_law_regression(points, fixed_point) - dfs.append(model["b"]) - - # Transform D-factors - dfs_transformed = [af_from_index(a) / (2 ** dfs[a]) for a in range(RANGE_AF)] - - # Linear regression on D-factors - decay_points = [[a, dfs_transformed[a]] for a in range(RANGE_AF)] - decay = linear_regression(decay_points) - - # Create O-Factor model for each A-Factor - def create_ofm(a): - af = af_from_index(a) - b = ( - math.log(af / decay["y"](a)) / math.log(rep_from_index(1)) - if decay["y"](a) != 0 - else 0 - ) - model = power_law_model(af / (rep_from_index(1) ** b), b) - - return { - "y": lambda r: model["y"](rep_from_index(r)), - "x": lambda y: model["x"](y) - self.INITIAL_REP_VALUE, - } - - self._ofm = [create_ofm(a) for a in range(RANGE_AF)] - - # Create O-Factor model for repetition 0 - ofm0_points = [[a, self.sm.rfm.rf(0, a)] for a in range(RANGE_AF)] - ofm0 = exponential_regression(ofm0_points) - self._ofm0 = lambda a: ofm0["y"](a) - - def of(self, repetition, af_index): - """Get O-Factor for given repetition and A-Factor index.""" - if repetition == 0: - return self._ofm0(af_index) # type: ignore - else: - return self._ofm[af_index]["y"](repetition) # type: ignore - - def af(self, repetition, of_val): - """Get A-Factor index for given repetition and O-Factor.""" - af_from_idx = lambda a: a * NOTCH_AF + MIN_AF - - # Find closest A-Factor index - min_diff = float("inf") - min_index = 0 - - for a in range(RANGE_AF): - diff = abs(self.of(repetition, a) - of_val) - if diff < min_diff: - min_diff = diff - min_index = a - - return af_from_idx(min_index) - - -class SM: - """ - SM-15 算法主调度器。 - - 这是 SM-15 间隔重复算法的核心类, 负责协调所有组件和算法流程。 - 管理项目队列、处理用户交互、执行算法更新步骤。 - - 属性: - requested_fi: 目标遗忘指数(默认10%, 表示希望10%的项目被遗忘) - interval_base: 基础间隔(3小时, 毫秒单位) - q: 项目队列, 按 due_date 排序 - fi_g: FI-Grade 图实例 - forgetting_curves: 遗忘曲线矩阵实例 - rfm: R-Factor 矩阵实例 - ofm: O-Factor 矩阵实例 - - 主要功能: - 1. 项目管理: 添加、删除、查询项目 - 2. 复习调度: 获取到期项目, 处理用户评分 - 3. 算法协调: 调用各组件更新算法参数 - 4. 数据持久化: 保存和加载学习状态 - 5. 队列管理: 维护按到期时间排序的项目队列 - - 算法流程概览: - 1. 添加项目时创建 Item 实例, 插入排序队列 - 2. 复习时获取到期项目, 接收用户评分 - 3. 调用 answer() 处理评分, 更新项目状态 - 4. 更新 FI-Grade 图、遗忘曲线、O-Factor 矩阵 - 5. 重新计算项目的最优间隔和下次到期时间 - 6. 将项目重新插入队列的适当位置 - - 使用方式: - 1. 创建 SM 实例 - 2. 使用 add_item() 添加学习项目 - 3. 使用 next_item() 获取需要复习的项目 - 4. 使用 answer() 处理用户评分 - 5. 使用 data() 和 load() 保存/加载学习进度 - """ - - def __init__(self): - """ - 初始化 SM-15 调度器。 - - 设置默认参数并初始化所有算法组件。 - - 默认参数: - - requested_fi: 10.0(目标遗忘指数10%) - - interval_base: 3 * 60 * 60 * 1000(3小时, 毫秒单位) - - q: 空项目队列(按到期时间排序) - - 初始化的组件: - - fi_g: FI-Grade 图, 管理遗忘指数与评分的关系 - - forgetting_curves: 遗忘曲线矩阵, 存储记忆保留率数据 - - rfm: R-Factor 矩阵, 包装遗忘曲线提供 R-Factor 查询 - - ofm: O-Factor 矩阵, 计算和管理最优因子 - - 注意: - - interval_base 是算法的基础时间单位, 所有间隔计算基于此值 - - requested_fi 是算法的核心目标, 控制复习间隔的激进程度 - - 组件间存在依赖关系, 初始化顺序重要 - """ - self.requested_fi = 10.0 # target forgetting index (10%) - self.interval_base = 3 * 60 * 60 * 1000 # 3 hours in milliseconds - self.q = [] # items sorted by due_date - - # Initialize components - self.fi_g = FI_G(self) - self.forgetting_curves = ForgettingCurves(self) - self.rfm = RFM(self) - self.ofm = OFM(self) - - def _find_index_to_insert(self, item, r=None): - """Binary search to find insertion index for sorted procession.""" - if r is None: - r = list(range(len(self.q))) - - if not r: - return 0 - - v = item.due_date - i = len(r) // 2 - - if len(r) == 1: - return r[i] if v < self.q[r[i]].due_date else r[i] + 1 - - if v < self.q[r[i]].due_date: - return self._find_index_to_insert(item, r[:i]) - else: - return self._find_index_to_insert(item, r[i:]) - - def add_item(self, value): - """Add a new item to the procession.""" - item = Item(self, value) - index = self._find_index_to_insert(item) - self.q.insert(index, item) - - def next_item(self, is_advanceable=False): - """Get next item due for review.""" - if not self.q: - return None - - now = datetime.datetime.now() - if is_advanceable or self.q[0].due_date < now: - return self.q[0] - - return None - - def answer(self, grade, item, now=None): - """Process answer for given item.""" - if now is None: - now = datetime.datetime.now() - - self._update(grade, item, now) - self.discard(item) - - index = self._find_index_to_insert(item) - self.q.insert(index, item) - - def _update(self, grade, item, now=None): - """Internal update method.""" - if now is None: - now = datetime.datetime.now() - - if item.repetition >= 0: - self.forgetting_curves.register_point(grade, item, now) - self.ofm.update() - self.fi_g.update(grade, item, now) - - item.answer(grade, now) - - def discard(self, item): - """Remove item from procession.""" - if item in self.q: - self.q.remove(item) - - def data(self): - """Serialize SM state.""" - return { - "requestedFI": self.requested_fi, - "intervalBase": self.interval_base, - "q": [item.data() for item in self.q], - "fi_g": self.fi_g.data(), - "forgettingCurves": self.forgetting_curves.data(), - "version": 1, - } - - @classmethod - def load(cls, data): - """Deserialize SM from data.""" - sm = cls() - sm.requested_fi = data.get("requestedFI", 10.0) - sm.interval_base = data.get("intervalBase", 3 * 60 * 60 * 1000) - - # Load items - items_data = data.get("q", []) - sm.q = [Item.load(sm, item_data) for item_data in items_data] - - # Load components - sm.fi_g = FI_G.load(sm, data.get("fi_g", {})) - sm.forgetting_curves = ForgettingCurves.load( - sm, data.get("forgettingCurves", {}) - ) - - # Reinitialize RFM and update OFM - sm.rfm = RFM(sm) - sm.ofm = OFM(sm) - sm.ofm.update() - - return sm - - -# ============================================================================ -# Test Functions (for internal testing) -# ============================================================================ - -_test = { - "exponentialRegression": exponential_regression, - "linearRegression": linear_regression, - "powerLawRegression": power_law_regression, - "fixedPointPowerLawRegression": fixed_point_power_law_regression, - "linearRegressionThroughOrigin": linear_regression_through_origin, -} - -# ============================================================================ -# CLI Interface -# ============================================================================ - - -def main(): - """ - 简单的闪卡命令行应用程序。 - - 提供交互式命令行界面, 使用户能够使用 SM-15 算法进行闪卡学习。 - - 可用命令: - - a/add: 添加新卡片 - - n/next: 复习下一个到期的卡片 - - N/Next: 复习下一个卡片(即使未到期) - - s/save: 保存学习进度到文件 - - l/load: 从文件加载学习进度 - - e/exit: 退出程序 - - eval: 执行 Python 表达式(调试用) - - list: 列出所有卡片 - - 使用流程: - 1. 启动程序显示命令提示 - 2. 输入 'a' 添加新卡片, 依次输入正面和背面内容 - 3. 输入 'n' 复习到期的卡片 - 4. 对显示的卡片输入评分 (0-5) 或 'D' 丢弃卡片 - 5. 重复步骤3-4进行复习 - 6. 使用 's' 保存进度, 'l' 加载进度 - - 数据文件: - - 默认保存文件: data.json - - 格式: JSON, 包含所有卡片状态和算法数据 - - 兼容性: 与原始 JavaScript 版本的数据格式兼容 - - 注意事项: - - 评分范围: 0 (完全遗忘) 到 5 (完美回忆) - - 阈值: 评分 >= 3 表示成功回忆 - - 时间单位: 内部使用毫秒, 但用户界面使用自然时间表示 - """ - import sys - - print("(a)add, (n)next, (N)next advanceably, (s)save, (l)load, (e)exit") - - mode = ["entrance"] - data = None - sm = SM() - - def goto_entrance(): - nonlocal mode, data - mode = ["entrance"] - data = None - sys.stdout.write("sm> ") - sys.stdout.flush() - - goto_entrance() - - while True: - try: - user_input = input().strip() - except EOFError: - break - - if mode[0] == "entrance": - if user_input in ["a", "add"]: - mode = ["add"] - elif user_input in ["n", "next"]: - mode = ["next"] - elif user_input in ["N", "Next"]: - mode = ["next", "_adv"] - elif user_input in ["s", "save"]: - mode = ["save"] - elif user_input in ["l", "load"]: - mode = ["load"] - elif user_input in ["e", "exit"]: - mode = ["exit"] - elif user_input == "eval": - mode = ["eval"] - elif user_input == "list": - mode = ["list"] - else: - goto_entrance() - continue - - if mode[0] == "add": - if len(mode) == 1: - data = {"front": None, "back": None} - print("Enter the front of the new card:") - mode.append("front") - elif mode[1] == "front": - data["front"] = user_input # type: ignore - print("Enter the back of the new card:") - mode[1] = "back" - elif mode[1] == "back": - data["back"] = user_input # type: ignore - sm.add_item(data) - goto_entrance() - - elif mode[0] == "next": - if mode[1] in ["_adv", None]: - is_advanceable = mode[1] == "_adv" - data = sm.next_item(is_advanceable) - - if data is None: - if sm.q: - next_due = sm.q[0].due_date - print( - f'There is no card that can be shown now. The next card is due at "{next_due}".' - ) - else: - print("There is no card.") - goto_entrance() - else: - print( - f"How much do you remember [{data.value.get('front', 'No front')}]:" - ) - mode[1] = "review" - - elif mode[1] == "review": - try: - g = int(user_input) - if 0 <= g <= 5: - sm.answer(g, data) - print(f"The answer was [{data.value.get('back', 'No back')}].") # type: ignore - goto_entrance() - elif user_input == "D": - sm.discard(data) - goto_entrance() - else: - print( - "The value should be from '0' (bad) to '5' (good). Otherwise 'D' to discard:" - ) - except ValueError: - print("Please enter a number from 0 to 5, or 'D' to discard:") - - elif mode[0] == "save": - if len(mode) == 1: - print( - "Enter file name to save configuration. (default name is [data.json]):" - ) - mode.append(True) # type: ignore - else: - filename = user_input if user_input else "data.json" - with open(filename, "w") as f: - json.dump(sm.data(), f, indent=2) - print(f"Saved to {filename}") - goto_entrance() - - elif mode[0] == "load": - if len(mode) == 1: - print( - "Enter file name to load configuration. (default name is [data.json]):" - ) - mode.append(True) # type: ignore - else: - filename = user_input if user_input else "data.json" - with open(filename, "r") as f: - data = json.load(f) - sm = SM.load(data) - print(f"Loaded from {filename}") - goto_entrance() - - elif mode[0] == "exit": - if len(mode) == 1: - print("Exiting...") - break - - elif mode[0] == "eval": - if len(mode) == 1: - mode.append(True) # type: ignore - else: - try: - result = eval(user_input) - print(result) - except Exception as e: - print(f"Error: {e}") - goto_entrance() - - elif mode[0] == "list": - for item in sm.q: - print(json.dumps(item.data())) - goto_entrance() - - -if __name__ == "__main__": - try: - main() - except Exception as error: - print(f"An error occurred: {error}") - sys.exit(1) diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index 99c4d9b..39a5232 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -1,4 +1,5 @@ # 时间服务 +import datetime import time from heurams.context import config_var @@ -33,3 +34,32 @@ def get_timestamp() -> float: result = time.time() logger.debug("获取当前时间戳: %f", result) return result + + +def get_timestamp_ms() -> int: + """获取当前毫秒级 Unix 时间戳""" + return int(get_timestamp() * 1000) + + +def daystamp_to_datetime(daystamp: int) -> datetime.datetime: + """将日戳转换为 UTC datetime (当日午夜)""" + return datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta( + days=daystamp + ) + + +def datetime_to_daystamp(dt: datetime.datetime) -> int: + """将 datetime 转换为日戳(从 1970-01-01 起的天数) + + 接受带时区或 naive 的 datetime(naive 视为 UTC)。 + """ + epoch = datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=datetime.timezone.utc) + delta = dt - epoch + return delta.days + + +def get_now_datetime() -> datetime.datetime: + """获取当前时间的 UTC datetime(遵守时间覆盖)""" + return datetime.datetime.fromtimestamp(get_timestamp(), tz=datetime.timezone.utc) From 7b558f243841b508ba2fbbd17df4876933ae9fe2 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 27 Apr 2026 02:04:52 +0800 Subject: [PATCH 57/79] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- ARCHITECTURE.md | 4 +- data/misc/attics/ana.pkl | Bin 111 -> 0 bytes pyproject.toml | 55 +- src/heurams/interface/misc/theme.py | 0 uv.lock | 770 ++++++++++++++-------------- 6 files changed, 426 insertions(+), 405 deletions(-) delete mode 100644 data/misc/attics/ana.pkl create mode 100644 src/heurams/interface/misc/theme.py diff --git a/.gitignore b/.gitignore index c77d7ef..f317883 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ old/ AGENT.md AGENTS.md *.log.* - +*.pkl # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 8d18648..2b18c8c 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -232,8 +232,8 @@ Router.__init__(atoms) |------|------|------|------| | **SM-2** | `sm2.py` | ✅ 完成 | 经典 SuperMemo 1987 算法 | | **NSP-0** | `nsp0.py` | ✅ 完成 | 非间隔过滤调度器 | -| **SM-15M** | `sm15m.py` + `sm15m_calc.py` | ✅ 完成 | 从 CoffeeScript 移植的 SM-15 | -| **FSRS** | `fsrs.py` | ❌ 未实现 | 进度: `logger.info("尚未实现")` | +| **SM-15M** | `sm15m.py` | ✅ 完成 | 从 CoffeeScript 移植的 SM-15 | +| **FSRS** | `fsrs.py` | ✅ 部分完成 | 优化器不可用 | | **Base** | `base.py` | ✅ 基类 | 定义 `AlgodataDict` 结构和默认值 | 每个算法提供以下类方法: diff --git a/data/misc/attics/ana.pkl b/data/misc/attics/ana.pkl deleted file mode 100644 index 490efedaca3737666d3a236f7563826f0ba7017a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZo*nVP}?0ku;!dN@n+OA>QRGILX>xI1Lu`r-hT>fz2WNX;uKt*XjNEuP{n+`|oJ y$EOw*P4Q;vVF$|>rB3nY?BN8l3rkZ=fjp)jmYl@mk}2+vx2j$nY|@J<)dK)jfGD*9 diff --git a/pyproject.toml b/pyproject.toml index 28961fd..baaa567 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.5.0" authors = [{ name = "pluvium27", email = "pluvium27@outlook.com" }] description = "Heuristic Auxiliary Memory Scheduler" readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.12" classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", @@ -12,19 +12,45 @@ classifiers = [ license = "AGPL-3.0-or-later" license-files = ["LICENSE"] -dependencies = [ - "fsrs>=6.3.1", - #"edge-tts>=7.2.8", - #"jieba>=0.42.1", - #"openai>=2.32.0", - #"playsound==1.2.2", - #"pygobject>=3.56.2", # playsound 依赖它 - "psutil>=7.2.2", +dependencies = [ # 这些依赖只能驱动 kernel 程序库 "tabulate>=0.10.0", - "textual>=8.2.3", "toml>=0.10.2", "transitions>=0.9.3", - "zmq>=0.0.0", +] + +[project.optional-dependencies] +interface = [ # 基本用户界面依赖 + "textual>=8.2.3", + "psutil>=7.2.2", +] +algo-fsrs = [ + "fsrs>=6.3.1", # FSRS 算法底层依赖 +] +tts-edgetts = [ + "edge-tts>=7.2.8", # 微软 TTS +] +misc-jieba = [ + "jieba>=0.42.1", # 用于中文智能分词 +] +llm-openai = [ + "openai>=2.32.0", +] +audio-playsound = [ + "playsound==1.2.2", + "pygobject>=3.56.2", # playsound 依赖它 +] +dev = [ # 调试所需依赖 + "zmq>=0.0.0", # 用于 ZMQ 远程调试服务器, 在 linux 上建议先安装 libzmq + "pytest>=8.0.0", # 用于普通测试 + "pytest-cov>=6.0.0", +] +all = [ + "heurams[algo-fsrs]", + "heurams[tts-edgetts]", + "heurams[misc-jieba]", + "heurams[llm-openai]", + "heurams[audio-playsound]", + "heurams[dev]", ] [project.urls] @@ -34,12 +60,7 @@ Issues = "https://github.com/heurams/heurams/issues" [project.scripts] heurams = "heurams.__main__:main" tui = "heurams.interface.__main__:main" - -[dependency-groups] -dev = [ - "pytest>=8.0.0", - "pytest-cov>=6.0.0", -] +heurams-tui = "heurams.interface.__main__:main" [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/src/heurams/interface/misc/theme.py b/src/heurams/interface/misc/theme.py new file mode 100644 index 0000000..e69de29 diff --git a/uv.lock b/uv.lock index 81fe0e3..20a88e8 100644 --- a/uv.lock +++ b/uv.lock @@ -5,205 +5,205 @@ requires-python = ">=3.10" [[package]] name = "cffi" version = "2.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/44d/1b5909021139f/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, - { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, - { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, - { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, - { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0cf/2d91ecc3fcc06/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f73/b96c41e3b2ade/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/53f/77cbe57044e88/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3e8/37e3695668847/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5ed/a85d6d1879e69/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/933/2088d75dc3241/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fc7/de24befaeae77/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/cf3/64028c016c030/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e11/e82b744887154/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8ea/985900c5c95ce/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1f7/2fb8906754ac8/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b18/a3ed7d5b3bd8d/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b4c/854ef3adc1779/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2de/9a304e27f7596/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/baf/5215e0ab74c16/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/730/cacb21e1bdff3/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/682/4f87845e33960/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9de/40a7b0323d889/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/894/1aaadaf672462/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a05/d0c237b334909/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/946/98a9c5f91f9d1/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5fe/d36fccc0612a5/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c64/9e3a33450ec82/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/66f/011380d0e49ed/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c66/38687455baf64/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6d0/2d6655b0e54f5/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8ec/a2a813c1cb7ad/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/21d/1152871b01940/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b21/e08af67b8a103/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1e3/a615586f05fc4/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/81a/fed14892743bb/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3e1/7ed538242334b/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/392/5dd22fa2b7699/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2c8/f814d84194c9e/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/da9/02562c3e9c550/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/da6/8248800ad6320/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/467/1d9dd5ec934cb/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/00b/df7acc5f79515/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/45d/5e886156860dc/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/07b/271772c100085/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d48/a880098c96020/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f93/fd8e5c8c0a4aa/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/dd4/f05f54a52fb55/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c8d/3b5532fc71b7a/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d9b/29c1f0ae438d5/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6d5/0360be4546678/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/74a/03b9698e198d4/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/19f/705ada2530c11/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/256/f80b80ca3853f/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fc3/3c5141b55ed36/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c65/4de545946e0db/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/24b/6f81f1983e6df/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/128/73ca6cb9b0f0d/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d9b/97165e8aed927/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/afb/8db5439b81cf9/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/737/fe7d37e1a1bff/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/381/00abb9d1b1435/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/087/067fa8953339c/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/203/a48d1fb583fc7/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/dbd/5c7a25a7cb98f/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9a6/7fc9e8eb39039/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7a6/6c7204d886929/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7cc/09976e8b56f8c/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/92b/68146a71df785/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b1e/74d11748e7e98/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/28a/3a209b96630bc/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/755/3fb2090d71822/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6c6/c373cfc5c83a9/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1fc/9ea04857caf66/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d68/b6cef7827e864/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0a1/527a803f0a659/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9" }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/086/95f5cb7ed6e05/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/4f1/d9991f5acc0ca/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, ] [[package]] name = "coverage" version = "7.13.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c81/f6515c4c40141/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, - { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, - { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, - { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, - { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, - { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, - { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, - { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, - { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, - { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, - { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, - { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, - { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, - { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, - { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, - { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, - { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, - { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, - { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, - { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, - { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, - { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, - { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, - { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, - { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, - { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, - { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, - { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, - { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, - { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, - { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, - { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, - { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, - { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, - { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, - { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, - { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, - { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, - { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, - { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, - { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, - { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, - { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, - { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, - { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e07/23d2c96324561/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/52f/444e864759925/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/704/de6328e3d612a/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a1a/6d79a14e1ec18/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/790/60214983769c7/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/356/e76b46783a98c/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0ce/f0cdec915d112/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/dc0/22073d063b25a/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9b7/4db26dfea4f4e/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ad1/46744ca4fd09b/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c55/5b48be1853fe3/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/703/4b5c56a58ae5e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eb7/fdf1ef130660e/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3e1/bb5f6c78feeb1/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/66a/80c616f80181f/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/145/ede53ccbafb29/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/067/2854dc733c342/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ec1/0e2a42b41c923/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/be3/d4bbad9d4b037/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/4d2/afbc5cc54d286/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3ad/050321264c49c/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/730/0c8a6d13335b2/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eb0/7647a5738b89b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9ad/b6688e3b53adf/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7c8/d4bc913dd70b9/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0e3/c426ffc4cd952/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/259/b69bb83ad9894/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/258/354455f4e86e3/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/bff/95879c33ec8da/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/460/cf0114c5016fa/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0e2/23ce4b4ed47f0/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6e3/370441f4513c6/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/03c/cc709a17a1de0/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3f4/818d065964db3/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/012/d5319e66e9d5a/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8dd/02af98971bdb9/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f08/fd75c50a760c7/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/843/ea8643cf967d1/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9d4/4d7aa963820b1/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/713/2bed4bd7b8362/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a69/8e363641b9884/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/bdb/a0a6b8812e8c7/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d2c/87e0c473a10bf/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/bf6/9236a9a81bdca/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5ec/4af212df513e3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/941/617e518602e2d/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/da3/05e9937617ee9/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/78e/696e1cc714e57/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/02c/a0eed225b2ff3/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/046/90832cbea4e46/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/059/0e44dd2745c69/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d7c/fad2d6d81dd29/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e09/2b9499de38ae0/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/48c/39bc4a04d983a/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2d3/807015f138ffe/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ee2/aa19e03161671/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ce1/998c048300760/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/631/efb83f0156967/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f4c/d16206ad171cb/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/042/8cbef5783ad91/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e0b/216a19534b242/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/972/a9cd27894afe4/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/4b5/9148601efcd2b/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/505/d7083c8b0c87a/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/603/65289c3741e4d/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1b8/8c69c8ef5d4b6/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5b1/3955d31d1633c/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f70/c9ab2595c56f8/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/084/b84a8c63e8d6f/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ad1/4385487393e38/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7f2/c47b36fe7709a/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/67e/9bc5449801fad/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/da8/6cdcf10d2519e/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0ec/f12ecb326fe2c/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fba/bfaceaeb587e1/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9bb/2a28101a44366/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/bd3/a2fbc1c6cccb3/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6c3/6ddb64ed9d7e4/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/380/e8e9084d8eb38/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e80/8af52a0513762/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e30/1d30dd7e95ae0/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/800/bc829053c80d2/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0b6/7af5492adb319/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c91/36ff29c3a91e2/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/cff/784eef7f0b8f6/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/68a/4953be99b17ac/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/35a/31f2b1578185f/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2aa/055ae1857258f/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1b1/1eef33edeae9d/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/10a/0c37f0b646eaf/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b5d/b73ba3c41c700/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/750/db93a81e3e5a9/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9dd/b4f4a5479f253/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d8a/7a2049c14f413/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e1c/85e0b6c05c592/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/777/c4d1eff1b6787/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/669/7e29b93707167/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8fd/f453a942c3e4d/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/32c/a0c0114c9834a/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/876/9751c10f33902/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/cec/2d83125531bd1/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0cd/9ed7a8b181775/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/301/e3b7dfefecaca/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9da/cc2ad679b2927/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/34b/02417cf070e17/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61" }, ] [package.optional-dependencies] @@ -214,25 +214,25 @@ toml = [ [[package]] name = "exceptiongroup" version = "1.3.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/8b4/12432c6055b0b/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a7a/39a3bd276781e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" }, ] [[package]] name = "fsrs" version = "6.3.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/00/337de60fd5497ea4fed046192d17fa79809ca2aad7326da2e464d9d8950b/fsrs-6.3.1.tar.gz", hash = "sha256:43c5c6056b97266baf6ebfef9e4cadeb9ac5a4e1b29ffdfb300f445b6e6b15ca", size = 32645, upload-time = "2026-03-10T14:01:03.734Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/43c/5c6056b97266b/fsrs-6.3.1.tar.gz", hash = "sha256:43c5c6056b97266baf6ebfef9e4cadeb9ac5a4e1b29ffdfb300f445b6e6b15ca" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/3c/e7e140f8cdb95b042cb125ee142e7630187e8e78d21847ca81e9d1e99bb8/fsrs-6.3.1-py3-none-any.whl", hash = "sha256:ac1bf9939573592d8c9bc1e11a00bd17e04146dc9f2c913127e2bcc431b9040b", size = 22840, upload-time = "2026-03-10T14:01:01.084Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ac1/bf9939573592d/fsrs-6.3.1-py3-none-any.whl", hash = "sha256:ac1bf9939573592d8c9bc1e11a00bd17e04146dc9f2c913127e2bcc431b9040b" }, ] [[package]] @@ -275,34 +275,34 @@ dev = [ [[package]] name = "iniconfig" version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c76/315c77db06865/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f63/1c04d2c48c52b/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" }, ] [[package]] name = "linkify-it-py" version = "2.1.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "uc-micro-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c9/06ea13676ef354f0af6169587ae292d3e2406e212876a413bf9eece4eb23/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b", size = 29158, upload-time = "2026-03-01T07:48:47.683Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/433/60231720999c1/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0d2/52c1594ecba2e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e" }, ] [[package]] name = "markdown-it-py" version = "4.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/cb0/a2b4aa34f932c/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/873/27c59b172c501/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147" }, ] [package.optional-dependencies] @@ -313,101 +313,101 @@ linkify = [ [[package]] name = "mdit-py-plugins" version = "0.5.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/f49/18cb50119f504/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/07a/08422fc1936a5/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f" }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/bb4/13d29f5eea38f/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/840/08a41e51615a4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" }, ] [[package]] name = "packaging" version = "26.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/f04/2152b681c4bfa/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5d9/c0669c6285e49/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f" }, ] [[package]] name = "platformdirs" version = "4.9.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/3bf/a75b0ad0db840/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e61/adb1d5e5cb344/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917" }, ] [[package]] name = "pluggy" version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/7dc/c130b76258d33/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e92/0276dd6813095/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" }, ] [[package]] name = "psutil" version = "7.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/074/6f5f8d406af34/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, - { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, - { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, - { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, - { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, - { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, - { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, - { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, - { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, - { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, - { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, - { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, - { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, - { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, - { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, - { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2ed/ccc433cbfa046/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e78/c8603dcd9a04c/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1a5/71f2330c966c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/917/e891983ca3c18/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ab4/86563df44c17f/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ae0/aefdd8796a773/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eed/63d3b4d624495/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7b6/d09433a10592c/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1fa/4ecf83bcdf6e6/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e45/2c464a02e7dc7/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c76/63d4e37f13e88/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/11f/e5a4f61375976/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ed0/cace939114f62/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1a7/b04c10f32cc88/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/076/a2d2f923fd482/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b07/26cecd84f9474/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fd0/4ef36b4a6d599/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b58/fabe35e80b264/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eb7/e81434c8d223e/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8c2/33660f575a5a8/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee" }, ] [[package]] name = "pycparser" version = "3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/600/f49d217304a59/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b72/7414169a36b7d/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992" }, ] [[package]] name = "pygments" version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/675/7cd03768053ff/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/81a/9e26dd42fd28a/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" }, ] [[package]] name = "pytest" version = "9.0.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, @@ -417,133 +417,133 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/b86/ada508af81d19/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2c5/efc453d45394f/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9" }, ] [[package]] name = "pytest-cov" version = "7.1.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/306/74f2b5f6351aa/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a04/61110b7865f9a/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678" }, ] [[package]] name = "pyzmq" version = "27.1.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/ac0/765e3d44455ad/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, - { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, - { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, - { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, - { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, - { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, - { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, - { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, - { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, - { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, - { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, - { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, - { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, - { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, - { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, - { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, - { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, - { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, - { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, - { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, - { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, - { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, - { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, - { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, - { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, - { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, - { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, - { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, - { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, - { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, - { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, - { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, - { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, - { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, - { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, - { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, - { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/508/e23ec9bc44c00/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/507/b6f430bdcf0ee/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/bf7/b38f9fd7b81cb/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/03f/f0b279b40d687/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/677/e744fee605753/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/dd2/fec2b13137416/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/08e/90bb4b57603b8/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a5b/42d7a0658b515/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c0b/b87227430ee3a/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9a9/16f76c2ab8d04/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/226/b091818d461a3/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/079/0a0161c281ca9/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c89/5a6f35476b0c3/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5bb/f8d3630bf9655/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/15c/8bd0fe0dabf80/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/baf/cb3dd171b4ae9/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e82/9529fcaa09937/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6df/079c47d5902af/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/190/cbf120fbc0fc4/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eca/6b47df11a132d/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/452/631b640340c92/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1c1/79799b118e554/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/383/7439b7f99e603/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/43a/d9a73e3da1fab/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0de/3028d69d4cdc4/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/cf4/4a7763aea9298/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f30/f395a9e6fbca1/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/250/e5436a4ba1388/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9ce/490cf1d2ca2ad/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/75a/2f36223f0d535/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/93a/d4b0855a66422/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fbb/4f2400bfda24f/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/e34/3d067f7b151cf/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/083/63b2011dec81c/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d54/530c8c8b5b8dd/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6f3/afa12c392f0a4/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c65/047adafe573ff/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/90e/6e9441c946a8b/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/add/071b2d25f84e8/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7cc/c0700cfdf7bd4/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/808/5a9fba668216b/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/6bb/54ca21bcfe361/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ce9/80af330231615/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/177/9be8c549e54a1/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/720/0bb0f03345515/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/01c/0e07d558b06a6/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/80d/834abee71f652/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/544/b4e3b7198dde4/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ced/c4c68178e59a4/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1f0/b2a577fd770aa/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/19c/9468ae0437f80/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/dc5/dbf68a7857b59/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c17/e03cbc9312bee/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f32/8d01128373cb6/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/9c1/790386614232e/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/448/f9cb54eb0cee4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/05b/12f2d32112bf8/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/187/70c8d35637153/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ac2/5465d42f92e99/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/53b/40f8ae006f273/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f60/5d884e7c8be8f/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c9f/7f6e13dff2e44/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355" }, ] [[package]] name = "rich" version = "15.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/edd/07a4824c6b401/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/33b/d4ef74232fb73/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb" }, ] [[package]] name = "six" version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/ff7/0335d468e7eb6/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/472/1f391ed90541f/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" }, ] [[package]] name = "tabulate" version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/e2c/fde8f79420f6d/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f0b/0622e567335c8/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3" }, ] [[package]] name = "textual" version = "8.2.4" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "markdown-it-py", extra = ["linkify"] }, { name = "mdit-py-plugins" }, @@ -552,109 +552,109 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/89/bec5709fb759f9c784bbcb30b2e3497df3f901691d13c2b864dbf6694a17/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4", size = 1848933, upload-time = "2026-04-19T04:20:45.845Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/d4e/2b2ddd7157191/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/32/02932f0d597cdbb34e34bf24266ff0f2cf292ccb3aafc37dd9efcb0cc416/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba", size = 724390, upload-time = "2026-04-19T04:20:49.968Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a83/bd3f0cc7125ca/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba" }, ] [[package]] name = "toml" version = "0.10.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/b3b/da1d108d5dd99/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/806/143ae5bfb6a3c/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" }, ] [[package]] name = "tomli" version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/7c7/e1a961a0b2f24/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, - { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, - { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, - { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, - { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, - { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, - { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, - { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, - { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, - { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, - { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, - { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, - { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, - { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, - { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, - { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, - { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, - { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, - { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, - { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, - { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, - { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f8f/0fc26ec2cc2b9/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/4ab/97e64ccda8756/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/964/81a5786729fd4/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5a8/81ab208c0baf6/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/471/49d5bd38761ac/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ec9/bfaf3ad2df51a/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ff2/983983d34813c/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5ee/18d9ebdb417e3/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c25/41745709bad02/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c74/2f741d58a2894/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7f8/6fd587c4ed9dd/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ff1/8e6a727ee0ab0/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/136/443dbd7e1dee4/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5e2/62d41726bc187/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/5cb/41aa38891e073/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/da2/5dc3563bff596/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/52c/8ef851d9a240f/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f75/8f1b9299d059c/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/36d/2bd2ad5fb9ead/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eb0/dc4e38e6a1fd5/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/c7f/2c7f2b9ca6bde/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f3c/6818a1a86dd6d/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d31/2ef37c91508b0/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/515/29d40e3ca5004/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/219/0f2e9dd7508d2/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8d6/5a2fbf9d2f835/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/4b6/05484e43cdc43/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/fd0/409a3653af6c1/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/a12/0733b01c45e9a/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/559/db847dc486944/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/01f/520d4f53ef979/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/7f9/4b27a62cfad84/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/ede/3e6487c5ef5d2/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/3d4/8a93ee1c9b79c/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/88d/ceee75c2c63af/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b8c/198f8c1805dc4/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/d4d/8fe59808a5465/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/700/8df2e7655c495/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/1d8/591993e228b0c/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/734/e20b57ba95624/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/8a6/50c2dbafa08d4/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/504/aa796fe0569bb/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/b1d/22e6e9387bf47/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/2c1/c351919aca028/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/eab/21f45c7f66c13/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/0d8/5819802132122/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe" }, ] [[package]] name = "transitions" version = "0.9.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/83/9e90f3494057d73c9e6bd8de8488af7c9fa714666ccc2db30fe07d147818/transitions-0.9.3.tar.gz", hash = "sha256:881fb75bb1654ed55d86060bb067f2c716f8e155f57bb73fd444e53713aafec8", size = 1191029, upload-time = "2025-07-02T10:49:03.153Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/881/fb75bb1654ed5/transitions-0.9.3.tar.gz", hash = "sha256:881fb75bb1654ed55d86060bb067f2c716f8e155f57bb73fd444e53713aafec8" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/05/fea3020e90aa378941ff10de8860fb3b1288313c27efd10fa0c476498f7e/transitions-0.9.3-py2.py3-none-any.whl", hash = "sha256:02463248f2b668d86f66636b1e3c9e8de84d93e22915247f4e1aa9ee1cae28aa", size = 112792, upload-time = "2025-07-02T10:49:01.415Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/024/63248f2b668d8/transitions-0.9.3-py2.py3-none-any.whl", hash = "sha256:02463248f2b668d86f66636b1e3c9e8de84d93e22915247f4e1aa9ee1cae28aa" }, ] [[package]] name = "typing-extensions" version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/0ce/a48d173cc12fa/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/f0f/a19c6845758ab/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" }, ] [[package]] name = "uc-micro-py" version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/78/67/9a363818028526e2d4579334460df777115bdec1bb77c08f9db88f6389f2/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811", size = 6611, upload-time = "2026-03-01T06:31:27.526Z" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c53/691e495c8db60/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/73/d21edf5b204d1467e06500080a50f79d49ef2b997c79123a536d4a17d97c/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c", size = 6383, upload-time = "2026-03-01T06:31:26.257Z" }, + { url = "https://pypi.pluv27.top/root/pypi/+f/360/3a3859af53e5a/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c" }, ] [[package]] name = "zmq" version = "0.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } dependencies = [ { name = "pyzmq" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/78/833b2808793c1619835edb1a4e17a023d5d625f4f97ff25ffff986d1f472/zmq-0.0.0.tar.gz", hash = "sha256:6b1a1de53338646e8c8405803cffb659e8eb7bb02fff4c9be62a7acfac8370c9", size = 966, upload-time = "2015-05-21T17:34:26.603Z" } +sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/6b1/a1de53338646e/zmq-0.0.0.tar.gz", hash = "sha256:6b1a1de53338646e8c8405803cffb659e8eb7bb02fff4c9be62a7acfac8370c9" } From a95ac55f005069cf7f739c6a60c3a519abeb66ca Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 27 Apr 2026 02:26:32 +0800 Subject: [PATCH 58/79] =?UTF-8?q?chore:=20=E8=AF=B4=E6=98=8E=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ARCHITECTURE.md | 82 ++++++++++++++++++++++++------------------------- README.md | 65 ++++++++++++++++++++++++++++++++++----- 2 files changed, 98 insertions(+), 49 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 2b18c8c..51af20f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -74,10 +74,10 @@ graph TB Nucleon(ident, payload, common) ``` -- **只读**内容容器. 通过 `Evalizer` (基于 `eval()` 的模板系统)对 payload 和 common 进行编译展开. -- 包含 `puzzles` 字段, 定义该记忆单元支持哪些谜题类型. -- 从 `repo.payload` 和 `repo.typedef["common"]` 配对创建. -- 一旦创建, 内容不可修改 (`__setitem__` 抛出 `AttributeError`). +- **只读**内容容器. 通过 `Evalizer` (基于 `eval()` 的模板系统)对 payload 和 common 进行编译展开. +- 包含 `puzzles` 字段, 定义该记忆单元支持哪些谜题类型. +- 从 `repo.payload` 和 `repo.typedef["common"]` 配对创建. +- 一旦创建, 内容不可修改 (`__setitem__` 抛出 `AttributeError`). ### Electron (电子) — 状态层 @@ -85,9 +85,9 @@ Nucleon(ident, payload, common) Electron(ident, algodata, algo_name) ``` -- 算法状态数据的包装器. 每个 Electron 绑定一个算法 (`algorithms[algo_name]`). -- `algodata` 是到仓库 `algodata.lict` 中对应字典的**引用**, 修改即持久化. -- 核心方法:`activate()` (标记激活)、`revisor()` (评分迭代)、`is_due()` (到期判断). +- 算法状态数据的包装器. 每个 Electron 绑定一个算法 (`algorithms[algo_name]`). +- `algodata` 是到仓库 `algodata.lict` 中对应字典的**引用**, 修改即持久化. +- 核心方法:`activate()` (标记激活)、`revisor()` (评分迭代)、`is_due()` (到期判断). ### Orbital (轨道) — 策略层 @@ -101,8 +101,8 @@ orbital = { } ``` -- 定义复习阶段流程和各阶段内谜题选择策略的纯字典. -- 每个阶段对应一组 `(谜题类型, 概率系数)` 元组列表, 概率系数 >1 的部分表示强制重复次数. +- 定义复习阶段流程和各阶段内谜题选择策略的纯字典. +- 每个阶段对应一组 `(谜题类型, 概率系数)` 元组列表, 概率系数 >1 的部分表示强制重复次数. ### Atom (原子) — 运行时组装 @@ -110,9 +110,9 @@ orbital = { Atom(nucleon, electron, orbital) ``` -- 三者的运行时组合, 附带 `runtime` 运行时标志 (`locked`, `min_rate`, `new_activation`). -- 是 UI 和调度层操作的基本单位. -- `revise()` 方法在 `locked` 为真时调用 `electron.revisor(min_rate)`, 执行最终评分迭代. +- 三者的运行时组合, 附带 `runtime` 运行时标志 (`locked`, `min_rate`, `new_activation`). +- 是 UI 和调度层操作的基本单位. +- `revise()` 方法在 `locked` 为真时调用 `electron.revisor(min_rate)`, 执行最终评分迭代. **关系图**: @@ -137,11 +137,11 @@ graph LR Schedule --> Orbital ``` ---- +______________________________________________________________________ ## 调度反应器 (Reactor) -调度反应器是核心业务流程引擎, 采用三层嵌套的有限状态机设计 (基于 `transitions` 库). +调度反应器是核心业务流程引擎, 采用三层嵌套的有限状态机设计 (基于 `transitions` 库). ### 状态枚举定义 @@ -222,11 +222,11 @@ Router.__init__(atoms) └─ Algorithm.revisor(algodata, feedback) ``` ---- +______________________________________________________________________ ## 算法系统 -所有算法继承自 `BaseAlgorithm`, 以类方法的风格实现, 通过 `algorithms` 字典注册. +所有算法继承自 `BaseAlgorithm`, 以类方法的风格实现, 通过 `algorithms` 字典注册. | 算法 | 文件 | 状态 | 说明 | |------|------|------|------| @@ -260,11 +260,11 @@ Router.__init__(atoms) } ``` ---- +______________________________________________________________________ ## 仓库系统 (Repo) -仓库是 TOML/JSON 文件目录, 无数据库依赖. +仓库是 TOML/JSON 文件目录, 无数据库依赖. ### 目录结构 @@ -299,11 +299,11 @@ classDiagram } ``` -- `payload` 和 `algodata` 使用 `Lict` (列表+字典混合容器), 支持双模式访问. -- `_generate_particles_data()` 在初始化时自动将 payload 数据转换为 `Nucleon` 所需的格式. -- 默认保存列表 `default_save_list = ["algodata"]`, 仅持久化算法状态. +- `payload` 和 `algodata` 使用 `Lict` (列表+字典混合容器), 支持双模式访问. +- `_generate_particles_data()` 在初始化时自动将 payload 数据转换为 `Nucleon` 所需的格式. +- 默认保存列表 `default_save_list = ["algodata"]`, 仅持久化算法状态. ---- +______________________________________________________________________ ## Lict 集合 @@ -318,13 +318,13 @@ lict.keys() # 所有键 lict.dicted_data # 纯字典导出 ``` -脏同步机制:修改列表时自动同步字典, 修改字典时自动同步列表. 用于 `payload` 和 `algodata` 的双模式访问需求. +脏同步机制:修改列表时自动同步字典, 修改字典时自动同步列表. 用于 `payload` 和 `algodata` 的双模式访问需求. ---- +______________________________________________________________________ ## 配置系统 (ConfigDict) -`ConfigDict` 继承 `UserDict`, 是**单例模式**的 TOML 懒加载配置管理器. +`ConfigDict` 继承 `UserDict`, 是**单例模式**的 TOML 懒加载配置管理器. ### 配置目录约定 @@ -361,11 +361,11 @@ with ConfigContext(test_config): ... # 临时使用测试配置 ``` ---- +______________________________________________________________________ ## 提供者系统 (Providers) -可插拔的后端实现, 通过 `providers/__init__.py` 中的字典注册. +可插拔的后端实现, 通过 `providers/__init__.py` 中的字典注册. | 类别 | 提供者 | 说明 | |------|--------|------| @@ -375,9 +375,9 @@ with ConfigContext(test_config): | | `termux` | Android Termux 环境 | | **LLM** | `openai` | OpenAI 兼容 API (未完整实现) | -选择方式:`services/*.toml` 中的 `provider` 字段. +选择方式:`services/*.toml` 中的 `provider` 字段. ---- +______________________________________________________________________ ## 谜题系统 (Puzzles) @@ -391,9 +391,9 @@ with ConfigContext(test_config): | **Guess** | `guess.py` | 猜测词义 | | **Base** | `base.py` | 抽象基类 | -谜题通过轨道策略 (Orbital)在 `Expander` 中按概率展开, 每个原子可产生多个谜题, 每个谜题独立评分. +谜题通过轨道策略 (Orbital)在 `Expander` 中按概率展开, 每个原子可产生多个谜题, 每个谜题独立评分. ---- +______________________________________________________________________ ## 服务层 @@ -410,9 +410,9 @@ with ConfigContext(test_config): | **Epath** | `epath.py` | 点符号嵌套字典访问 (`epath(dct, "a.b.c")`) | | **TextProc** | `textproc.py` | `truncate()`, `domize()`, `undomize()` | -日志系统:每个模块通过 `get_logger(__name__)` 创建自己的日志器, 日志文件 10MB 轮转, 最多 5 个备份, 追加到 `heurams.log`. +日志系统:每个模块通过 `get_logger(__name__)` 创建自己的日志器, 日志文件 10MB 轮转, 最多 5 个备份, 追加到 `heurams.log`. ---- +______________________________________________________________________ ## 复习全流程 @@ -454,14 +454,14 @@ sequenceDiagram UI->>User: 显示总结 ``` ---- +______________________________________________________________________ ## 关键设计决策 -1. **无数据库** — 所有持久化基于 TOML/JSON 文件目录, 方便版本管理和手动编辑. -2. **Lict 双模式访问** — payload 和 algodata 同时支持列表迭代和字典查找, 兼顾批处理和随机访问. -3. **物理隐喻分离** — 内容 (Nucleon)、状态 (Electron)、策略 (Orbital) 三者正交, 可独立替换, 便于组合不同算法和内容类型. -4. **transitions 状态机** — 使用 `transitions` 库实现 Router → Procession → Expander 三层嵌套状态机, 每个层次职责明确. -5. **Evalizer eval 模板** — 使用 `eval()` 实现动态模板替换, 功能灵活但存在安全风险 (标记为待替换). -6. **配置单例** — `ConfigDict` 以规范化路径为键实现单例, 避免多实例导致的配置不一致问题. -7. **评分累积** — 原子在多谜题阶段的最终评分取所有谜题的最低评分 (`min_rate`), 确保严格评估. +1. **无数据库** — 所有持久化基于 TOML/JSON 文件目录, 方便版本管理和手动编辑. +2. **Lict 双模式访问** — payload 和 algodata 同时支持列表迭代和字典查找, 兼顾批处理和随机访问. +3. **物理隐喻分离** — 内容 (Nucleon)、状态 (Electron)、策略 (Orbital) 三者正交, 可独立替换, 便于组合不同算法和内容类型. +4. **transitions 状态机** — 使用 `transitions` 库实现 Router → Procession → Expander 三层嵌套状态机, 每个层次职责明确. +5. **Evalizer eval 模板** — 使用 `eval()` 实现动态模板替换, 功能灵活但存在安全风险 (标记为待替换). +6. **配置单例** — `ConfigDict` 以规范化路径为键实现单例, 避免多实例导致的配置不一致问题. +7. **评分累积** — 原子在多谜题阶段的最终评分取所有谜题的最低评分 (`min_rate`), 确保严格评估. diff --git a/README.md b/README.md index 844c6e4..fabddb9 100644 --- a/README.md +++ b/README.md @@ -49,19 +49,68 @@ ### 从包管理器安装 -潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本 +潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本. + +> [!CAUTION] +> 对于部分 Linux 发行版和 Android Termux 用户:\ +> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖\ +> 例如在 termux 上先运行 `pkg install cmake clang libzmq`\ +> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器 + +#### 稳定版本 ``` -# 稳定版 -python -m pip install heurams -i https://pypi.pluv27.top/root/stable/+simple/ -# 开发版 -python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ +python -m pip install heurams[all] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装全部可选依赖(推荐) ``` +#### 开发版本 + +``` +python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ # 安装全部可选依赖(推荐) +``` + +#### 依赖组说明 + +由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面的命令会安装所有可选依赖, 以下是依赖组列表 + +- 基础依赖: (只能驱动程序库) + - tabulate: 终端表格 + - toml: TOML 文件加载 + - transitions: 状态机依赖 +- `interface` 依赖组: (基本用户界面依赖) + - textual: 终端用户界面 + - psutil: 获取系统信息 +- `algo-fsrs` 依赖组: + - py-fsrs: FSRS 算法模块需要 +- `tts-edgetts` 依赖组: + - edge-tts:微软文本转语音 +- `misc-jieba` 依赖组: + - jieba: 中文智能分词所需 +- `llm-openai` 依赖组: + - openai: OpenAI API 所需 +- `audio-playsound` 依赖组: + - playsound: 通用音频播放 + - pygobject: playsound 依赖 +- `dev` 依赖组: + - zmq: 远程调试服务器所需 + - pytest: 测试所需 + - pytest-cov: 测试所需 +- `all` 依赖组: + - 包含以上所有依赖 + +llm-openai:OpenAI API 支持 + +audio-playsound:播放声音(注意 playsound==1.2.2 固定版本,pygobject 是 Linux 下的依赖) + +dev:开发调试工具(ZMQ 远程调试、pytest 单元测试等) + +全量安装组 +all:包含以上所有可选组 + ### 从源码安装 -我们提供原生 python 和 uv 两种安装方式\ -详见[贡献指南](CONTRIBUTING.md) +我们提供原生 python 和 uv 两种安装方式.\ +详见[贡献指南](CONTRIBUTING.md). ## 项目结构 @@ -99,4 +148,4 @@ python -m pip install heurams -i https://pypi.pluv27.top/root/dev/+simple/ - 原版权: Copyright (c) 2014 Kazuaki Tanida - 原许可证: MIT License -本项目受益于他们无私且优秀的工作 +本项目受益于他们无私且优秀的工作. From 22b0607273df820df40a0200da70e926c2a32f3c Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 27 Apr 2026 02:27:29 +0800 Subject: [PATCH 59/79] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=B8=80?= =?UTF-8?q?=E5=A4=84=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index fabddb9..5a31b0d 100644 --- a/README.md +++ b/README.md @@ -98,15 +98,6 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ - `all` 依赖组: - 包含以上所有依赖 -llm-openai:OpenAI API 支持 - -audio-playsound:播放声音(注意 playsound==1.2.2 固定版本,pygobject 是 Linux 下的依赖) - -dev:开发调试工具(ZMQ 远程调试、pytest 单元测试等) - -全量安装组 -all:包含以上所有可选组 - ### 从源码安装 我们提供原生 python 和 uv 两种安装方式.\ From a1c1c93c5725a128329f80543e7e8f3f690c2853 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 30 Apr 2026 04:45:05 +0800 Subject: [PATCH 60/79] =?UTF-8?q?fix(interface):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ARCHITECTURE.md | 45 +- CONTRIBUTING.md | 3 +- README.md | 20 +- data/repo/chmgk/algodata.json | 14 + data/repo/chmgk/draft.txt | 22 + data/repo/chmgk/manifest.toml | 4 + data/repo/chmgk/payload.toml | 5 + data/repo/chmgk/schedule.toml | 11 + data/repo/chmgk/typedef.toml | 17 + src/heurams/interface/screens/memoqueue.py | 5 +- uv.lock | 1556 ++++++++++++++------ 11 files changed, 1239 insertions(+), 463 deletions(-) create mode 100644 data/repo/chmgk/algodata.json create mode 100644 data/repo/chmgk/draft.txt create mode 100644 data/repo/chmgk/manifest.toml create mode 100644 data/repo/chmgk/payload.toml create mode 100644 data/repo/chmgk/schedule.toml create mode 100644 data/repo/chmgk/typedef.toml diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 51af20f..6320c65 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -124,21 +124,18 @@ graph LR Algodata[(algodata.json)] Schedule[(schedule.toml)] end - subgraph "运行时组装" Nucleon -->|内容| Atom Electron -->|状态| Atom Orbital -->|策略| Atom end - Payload --> Nucleon - Common --> Nucleon - Algodata --> Electron - Schedule --> Orbital + Payload -->|Repo| Nucleon + Common -->|Repo| Nucleon + Algodata -->|Repo| Electron + Schedule -->|Repo| Orbital ``` -______________________________________________________________________ - ## 调度反应器 (Reactor) 调度反应器是核心业务流程引擎, 采用三层嵌套的有限状态机设计 (基于 `transitions` 库). @@ -157,12 +154,12 @@ ______________________________________________________________________ | **ExpanderState** | `exammode` | 考试模式 (正面答题) | | | `retronly` | 回溯模式 (仅识别) | -### 三层嵌套结构 +### 状态机嵌套结构 ```mermaid graph TB subgraph "Router (全局路由器)" - R[Router
状态: unsure→quick_review→recognition→final_review→finished] + R[Router
状态: unsure→quick_review
→recognition→final_review
→finished] P1[Procession 队列1: 快速复习] P2[Procession 队列2: 新记忆] P3[Procession 队列3: 总复习] @@ -222,7 +219,7 @@ Router.__init__(atoms) └─ Algorithm.revisor(algodata, feedback) ``` -______________________________________________________________________ +评分累积机制: 原子在多谜题阶段的最终评分取所有谜题的最低评分 (`min_rate`), 确保严格评估. ## 算法系统 @@ -260,11 +257,9 @@ ______________________________________________________________________ } ``` -______________________________________________________________________ - ## 仓库系统 (Repo) -仓库是 TOML/JSON 文件目录, 无数据库依赖. +仓库为 TOML/JSON 文件目录, 无数据库依赖. ### 目录结构 @@ -303,8 +298,6 @@ classDiagram - `_generate_particles_data()` 在初始化时自动将 payload 数据转换为 `Nucleon` 所需的格式. - 默认保存列表 `default_save_list = ["algodata"]`, 仅持久化算法状态. -______________________________________________________________________ - ## Lict 集合 `Lict` 继承 `MutableSequence`, 同时维护列表和字典访问: @@ -320,8 +313,6 @@ lict.dicted_data # 纯字典导出 脏同步机制:修改列表时自动同步字典, 修改字典时自动同步列表. 用于 `payload` 和 `algodata` 的双模式访问需求. -______________________________________________________________________ - ## 配置系统 (ConfigDict) `ConfigDict` 继承 `UserDict`, 是**单例模式**的 TOML 懒加载配置管理器. @@ -361,8 +352,6 @@ with ConfigContext(test_config): ... # 临时使用测试配置 ``` -______________________________________________________________________ - ## 提供者系统 (Providers) 可插拔的后端实现, 通过 `providers/__init__.py` 中的字典注册. @@ -377,8 +366,6 @@ ______________________________________________________________________ 选择方式:`services/*.toml` 中的 `provider` 字段. -______________________________________________________________________ - ## 谜题系统 (Puzzles) 谜题引擎用于在复习阶段生成评估视图: @@ -393,8 +380,6 @@ ______________________________________________________________________ 谜题通过轨道策略 (Orbital)在 `Expander` 中按概率展开, 每个原子可产生多个谜题, 每个谜题独立评分. -______________________________________________________________________ - ## 服务层 | 服务 | 文件 | 说明 | @@ -412,8 +397,6 @@ ______________________________________________________________________ 日志系统:每个模块通过 `get_logger(__name__)` 创建自己的日志器, 日志文件 10MB 轮转, 最多 5 个备份, 追加到 `heurams.log`. -______________________________________________________________________ - ## 复习全流程 ```mermaid @@ -453,15 +436,3 @@ sequenceDiagram Router-->>UI: 完成 (finished) UI->>User: 显示总结 ``` - -______________________________________________________________________ - -## 关键设计决策 - -1. **无数据库** — 所有持久化基于 TOML/JSON 文件目录, 方便版本管理和手动编辑. -2. **Lict 双模式访问** — payload 和 algodata 同时支持列表迭代和字典查找, 兼顾批处理和随机访问. -3. **物理隐喻分离** — 内容 (Nucleon)、状态 (Electron)、策略 (Orbital) 三者正交, 可独立替换, 便于组合不同算法和内容类型. -4. **transitions 状态机** — 使用 `transitions` 库实现 Router → Procession → Expander 三层嵌套状态机, 每个层次职责明确. -5. **Evalizer eval 模板** — 使用 `eval()` 实现动态模板替换, 功能灵活但存在安全风险 (标记为待替换). -6. **配置单例** — `ConfigDict` 以规范化路径为键实现单例, 避免多实例导致的配置不一致问题. -7. **评分累积** — 原子在多谜题阶段的最终评分取所有谜题的最低评分 (`min_rate`), 确保严格评估. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5be4631..fd8dd72 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,7 @@ ```bash # 克隆仓库 git clone https://git.pluv27.top/pluv/HeurAMS + cd HeurAMS # 可能需要切换到 dev 分支 @@ -60,7 +61,7 @@ git checkout dev ## 首先要安装uv, 例如通过 pip 或者其他包管理器 python3 -m pip install uv -uv sync # 同步开发运行环境 +uv sync --all-extras # 同步开发运行环境 uv run heurams # 验证包安装 diff --git a/README.md b/README.md index 5a31b0d..38fa12e 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,14 @@ ## 概述 -"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划, 也是一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. +"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一种基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划, +也是一种开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. ## 项目结构 这个仓库是 "潜进" 的核心程序库在 python 语言下的实现\ 包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块)\ -除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库, 使用框架构建其他辅助记忆功能前端或其他应用程序 +除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 ## 特性 @@ -19,24 +20,24 @@ - 软件开箱即用, 无需多加配置即可使用默认的 `SM-2` 算法进行学习 - 此外, 算法模块是 "潜进" 内核 (heurams.kernel) 中的一等公民, 内核天然支持插拔各型算法 - 无需安装繁杂的插件即可分单元集完成算法快速切换与调优, 研究者可以方便地修改算法模块以便捷地进行研究与测试 -- 内置 `SM-2` 简单间隔重复算法, 此算法亦用作 `Anki` 闪卡记忆软件的默认闪卡调度器 +- 默认使用 `SM-2` 简单间隔重复算法, 此算法亦用作 `Anki` 闪卡记忆软件的默认闪卡调度器 - 还内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M (移植自 sm.js 项目)` 复杂间隔重复算法(逆向工程) - 算法模块可以标记记忆项目, 也可以动态规划每个记忆单元的记忆间隔时间表, 动态跟踪记忆反馈数据, 以优化长期记忆保留率与稳定性 - 得益于项目的模块化架构与单元集结构设计, 一个项目甚至可以与任意种算法共存并互通, 这对研究者及想探索/实验高效率方法的用户极其友好 ### 多模态学习进程 -与 `Anki` 的 SQLite `apkg` 包不同, 潜进项目坚持使用人类可读的文件夹组织单元集, 这带来了若干好处, 包括: +与 Anki 的 SQLite `.apkg` 包不同, 我们坚持使用人类可读的文件夹组织单元集, 这带来了若干好处, 包括: - 人类可读: 您可以用任意工具, 乃至一个记事本自由修改记忆载荷数据而无需打开软件 - 元数据配置: 配置自由度极高, 可以任意组合, 重造, 乃至创造新内容 -- 测验, 算法与知识互相隔离: 您的记忆项目不再是单一的闪卡, 而是 `载荷(payload)` 和 `谜题(puzzle)` 通过 `元数据(typedef)` 抽象成的 `核子(nucleon)` 对象, 在程序内部和 `算法数据(algodata)` 抽象成的 `电子`, `调度设置(schedule)` 定义的 `轨道(orbital)` 共同有机组合成的运行时对象 `原子(atom)`! 这意味着一条知识不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧这些概念复杂--仅需从云端下载单元集即可开箱即用上述特性! +- 测验, 算法与知识互相隔离: 一条知识不再是单一的闪卡, 不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧概念复杂--仅需从云端下载单元集即可开箱即用上述特性! - 多模态学习 - 软件自身集成了文本转语音 (TTS) , 音频与语言模型 (LLM) 模块, 这些功能乃至功能本身都是可插拔, 可扩展, 可切换驱动的, 这为内容创建了极大的丰富度 - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择启用 - 软件天然支持动态内容生成, 支持宏驱动的模板系统, 根据上下文乃至语言模型动态生成知识点的解析 - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 -- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持 .zip/.tar.gz/.tar.xz 导入与导出 +- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持导出为压缩包或合并单文本文件以通过纯文本文件形式在 pastebin 等平台分享 - 性能提升: 得益于现代且支持分块的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 ### 实用用户界面 @@ -71,10 +72,10 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ #### 依赖组说明 -由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面的命令会安装所有可选依赖, 以下是依赖组列表 +由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面提供的命令会安装所有可选依赖, 以下是依赖组列表 - 基础依赖: (只能驱动程序库) - - tabulate: 终端表格 + - tabulate: 终端表格生成 - toml: TOML 文件加载 - transitions: 状态机依赖 - `interface` 依赖组: (基本用户界面依赖) @@ -115,7 +116,8 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ### 项目本身 -本项目基于 AGPL-3.0 许可证开源. 详见根目录下 [LICENSE](LICENSE) 文件. +本项目基于 AGPL-3.0 许可证开放源代码. +详见根目录下 [LICENSE](LICENSE) 文件. ### 第三方代码 diff --git a/data/repo/chmgk/algodata.json b/data/repo/chmgk/algodata.json new file mode 100644 index 0000000..b024ded --- /dev/null +++ b/data/repo/chmgk/algodata.json @@ -0,0 +1,14 @@ +{ + "临安春雨初霁": { + "SM-2": { + "efactor": 2.5, + "real_rept": 2, + "rept": 0, + "interval": 1, + "last_date": 20573, + "next_date": 20574, + "is_activated": 1, + "last_modify": 1777521623.7446923 + } + } +} \ No newline at end of file diff --git a/data/repo/chmgk/draft.txt b/data/repo/chmgk/draft.txt new file mode 100644 index 0000000..2f25553 --- /dev/null +++ b/data/repo/chmgk/draft.txt @@ -0,0 +1,22 @@ +使用仪器分析分子: +质谱仪 -> 质量特征, 测分子质量(最大质荷比) +红外光谱 -> 化学键和官能团 +核磁共振氢谱 -> 氢原子的种类和数目 +X射线衍射 -> 复杂分子, 分析键长键角 +元素分析仪 -> 确定元素种类及比例, 写出实验式 +元素转换: + C -> CO2 + S -> SO2 + H -> H2O + N -> N2 (注意) + Cl -> HCl + +烷烃: +可以燃烧, 火焰较明亮 +可以在光照下和卤素单质发生取代(卤素单质光照下生成自由基 发生自由基取代反应) +可以高温分解为小的烷烃和烯烃 +不和酸性高锰酸钾, 酸碱反应, 不和Br2(CCl4)反应 +除 CH3Br 为气体外,多溴代物为液体("油状液滴"), CBr4是固体 +光照用紫外灯或强日光(太阳光直射),不能用普通白炽灯 uv含量低 + + diff --git a/data/repo/chmgk/manifest.toml b/data/repo/chmgk/manifest.toml new file mode 100644 index 0000000..f2d7ff7 --- /dev/null +++ b/data/repo/chmgk/manifest.toml @@ -0,0 +1,4 @@ +title = "高考化学" +package = "chmgk" +author = "__heurams__" +desc = "高考古诗文 60 篇" diff --git a/data/repo/chmgk/payload.toml b/data/repo/chmgk/payload.toml new file mode 100644 index 0000000..a25f580 --- /dev/null +++ b/data/repo/chmgk/payload.toml @@ -0,0 +1,5 @@ +["临安春雨初霁"] +note = ['陆游〔宋代〕'] +content = "临安/春雨/初霁/" +translation = "临安春雨初霁" +keyword_note = { "临安" = "南宋都城, 今杭州", "霁" = "雨后或雪后转晴" } diff --git a/data/repo/chmgk/schedule.toml b/data/repo/chmgk/schedule.toml new file mode 100644 index 0000000..aff087d --- /dev/null +++ b/data/repo/chmgk/schedule.toml @@ -0,0 +1,11 @@ +schedule = ["quick_review", "recognition", "final_review"] + +[routes] +quick_review = [["SelectMeaning", "1.0"], ["Recognition", "1.0"]] +recognition = [["Recognition", "1.0"]] +final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] + +[annotation] +"quick_review" = "复习旧知" +"recognition" = "新知识" +"final_review" = "总复习" diff --git a/data/repo/chmgk/typedef.toml b/data/repo/chmgk/typedef.toml new file mode 100644 index 0000000..1d06672 --- /dev/null +++ b/data/repo/chmgk/typedef.toml @@ -0,0 +1,17 @@ +[annotation] +note = "笔记" +keyword_note = "关键词翻译" +translation = "语句翻译" +delimiter = "分隔符" +content = "内容" +tts_text = "文本转语音文本" + +[common] +delimiter = "/" +tts_text = "eval:payload['content'].replace('/', '')" + +[common.puzzles] # 谜题定义 +# 我们称 "Recognition" 为 recognition 谜题的 alia +"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } +"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } +"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 1275093..b821834 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -15,6 +15,7 @@ from heurams.context import config_var, rootdir from heurams.kernel.reactor import * from heurams.services.favorite_service import favorite_manager from heurams.services.logger import get_logger +from heurams.services.attic import Attic from .. import shim @@ -136,8 +137,8 @@ class MemScreen(Screen): from heurams.interface.widgets.finished import Finished if config_var.get()["interface"]["global"]["persist_to_file"]: - self.save_func() - container.mount(Finished(is_saved=["interface"]["global"]["persist_to_file"])) + self.repo.persist_to_repodir() + container.mount(Finished(is_saved=config_var.get()["interface"]["global"]["persist_to_file"])) def on_button_pressed(self, event): event.stop() diff --git a/uv.lock b/uv.lock index 20a88e8..3c80a4d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,238 +1,436 @@ version = 1 revision = 3 -requires-python = ">=3.10" +requires-python = ">=3.12" + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.5" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/1b/428a7c64687b3b2e9cd293186695affc0e1e54a445d0361743b231f11066/aiohttp-3.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15c933ad7920b7d9a20de151efcd05a6e38302cbf0e10c9b2acb9a42210a2416", size = 499557, upload-time = "2026-03-31T21:57:38.236Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f0/d3/3c6d610e66b495657622edb6ae7c7fd31b2e9086b4ec50b47897ad6042a9/aiohttp-3.13.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55b3bdd3292283295774ab585160c4004f4f2f203946997f49aac032c84649e9", size = 1721013, upload-time = "2026-03-31T21:57:43.904Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/49/a0/24409c12217456df0bae7babe3b014e460b0b38a8e60753d6cb339f6556d/aiohttp-3.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2b2355dc094e5f7d45a7bb262fe7207aa0460b37a0d87027dcf21b5d890e7d5", size = 1781501, upload-time = "2026-03-31T21:57:46.285Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/98/9d/b65ec649adc5bccc008b0957a9a9c691070aeac4e41cea18559fef49958b/aiohttp-3.13.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b38765950832f7d728297689ad78f5f2cf79ff82487131c4d26fe6ceecdc5f8e", size = 1878981, upload-time = "2026-03-31T21:57:48.734Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/31/04/d3f8211f273356f158e3464e9e45484d3fb8c4ce5eb2f6fe9405c3273983/aiohttp-3.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33add2463dde55c4f2d9635c6ab33ce154e5ecf322bd26d09af95c5f81cfa286", size = 1566671, upload-time = "2026-03-31T21:57:53.326Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/45/7dfba71a2f9fd97b15c95c06819de7eb38113d2cdb6319669195a7d64270/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7c35b0bf0b48a70b4cb4fc5d7bed9b932532728e124874355de1a0af8ec4bc88", size = 1743049, upload-time = "2026-03-31T21:57:57.341Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/71/901db0061e0f717d226386a7f471bb59b19566f2cae5f0d93874b017271f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:df23d57718f24badef8656c49743e11a89fd6f5358fa8a7b96e728fda2abf7d3", size = 1749557, upload-time = "2026-03-31T21:57:59.626Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/08/d5/41eebd16066e59cd43728fe74bce953d7402f2b4ddfdfef2c0e9f17ca274/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:02e048037a6501a5ec1f6fc9736135aec6eb8a004ce48838cb951c515f32c80b", size = 1558931, upload-time = "2026-03-31T21:58:01.972Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/30/e6/4a799798bf05740e66c3a1161079bda7a3dd8e22ca392481d7a7f9af82a6/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31cebae8b26f8a615d2b546fee45d5ffb76852ae6450e2a03f42c9102260d6fe", size = 1774125, upload-time = "2026-03-31T21:58:04.007Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/98/de/cf2f44ff98d307e72fb97d5f5bbae3bfcb442f0ea9790c0bf5c5c2331404/aiohttp-3.13.5-cp312-cp312-win32.whl", hash = "sha256:8bd3ec6376e68a41f9f95f5ed170e2fcf22d4eb27a1f8cb361d0508f6e0557f3", size = 433534, upload-time = "2026-03-31T21:58:08.712Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/ca/eadf6f9c8fa5e31d40993e3db153fb5ed0b11008ad5d9de98a95045bed84/aiohttp-3.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:110e448e02c729bcebb18c60b9214a87ba33bac4a9fa5e9a5f139938b56c6cb1", size = 460446, upload-time = "2026-03-31T21:58:10.945Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/00/4b7b70223deaebd9bb85984d01a764b0d7bd6526fcdc73cca83bcbe7243e/aiohttp-3.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bb6bf5811620003614076bdc807ef3b5e38244f9d25ca5fe888eaccea2a9832", size = 496927, upload-time = "2026-03-31T21:58:15.073Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b5/e5/4e161f84f98d80c03a238671b4136e6530453d65262867d989bbe78244d0/aiohttp-3.13.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5e5f7debc7a57af53fdf5c5009f9391d9f4c12867049d509bf7bb164a6e295b", size = 1706507, upload-time = "2026-03-31T21:58:21.094Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d4/56/ea11a9f01518bd5a2a2fcee869d248c4b8a0cfa0bb13401574fa31adf4d4/aiohttp-3.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c719f65bebcdf6716f10e9eff80d27567f7892d8988c06de12bbbd39307c6e3a", size = 1773465, upload-time = "2026-03-31T21:58:23.159Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/40/333ca27fb74b0383f17c90570c748f7582501507307350a79d9f9f3c6eb1/aiohttp-3.13.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d97f93fdae594d886c5a866636397e2bcab146fd7a132fd6bb9ce182224452f8", size = 1873523, upload-time = "2026-03-31T21:58:25.59Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fb/56/3f653d7f53c89669301ec9e42c95233e2a0c0a6dd051269e6e678db4fdb0/aiohttp-3.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe6970addfea9e5e081401bcbadf865d2b6da045472f58af08427e108d618540", size = 1562351, upload-time = "2026-03-31T21:58:29.918Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/98/fc/bfb437a99a2fcebd6b6eaec609571954de2ed424f01c352f4b5504371dd3/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:676e5651705ad5d8a70aeb8eb6936c436d8ebbd56e63436cb7dd9bb36d2a9a46", size = 1730618, upload-time = "2026-03-31T21:58:34.728Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e4/b6/c8534862126191a034f68153194c389addc285a0f1347d85096d349bbc15/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9b16c653d38eb1a611cc898c41e76859ca27f119d25b53c12875fd0474ae31a8", size = 1745185, upload-time = "2026-03-31T21:58:36.909Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/93/4ca8ee2ef5236e2707e0fd5fecb10ce214aee1ff4ab307af9c558bda3b37/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:999802d5fa0389f58decd24b537c54aa63c01c3219ce17d1214cbda3c2b22d2d", size = 1557311, upload-time = "2026-03-31T21:58:39.38Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/ae/76177b15f18c5f5d094f19901d284025db28eccc5ae374d1d254181d33f4/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ec707059ee75732b1ba130ed5f9580fe10ff75180c812bc267ded039db5128c6", size = 1773147, upload-time = "2026-03-31T21:58:41.476Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e4/85/fc8601f59dfa8c9523808281f2da571f8b4699685f9809a228adcc90838d/aiohttp-3.13.5-cp313-cp313-win32.whl", hash = "sha256:329f292ed14d38a6c4c435e465f48bebb47479fd676a0411936cc371643225cc", size = 432637, upload-time = "2026-03-31T21:58:46.167Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/1b/ac685a8882896acf0f6b31d689e3792199cfe7aba37969fa91da63a7fa27/aiohttp-3.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:69f571de7500e0557801c0b51f4780482c0ec5fe2ac851af5a92cfce1af1cb83", size = 458896, upload-time = "2026-03-31T21:58:48.119Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "certifi" +version = "2026.4.22" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, +] [[package]] name = "cffi" version = "2.0.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/44d/1b5909021139f/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/0cf/2d91ecc3fcc06/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f73/b96c41e3b2ade/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/53f/77cbe57044e88/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3e8/37e3695668847/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5ed/a85d6d1879e69/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/933/2088d75dc3241/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fc7/de24befaeae77/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/cf3/64028c016c030/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e11/e82b744887154/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8ea/985900c5c95ce/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1f7/2fb8906754ac8/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b18/a3ed7d5b3bd8d/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b4c/854ef3adc1779/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/2de/9a304e27f7596/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/baf/5215e0ab74c16/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/730/cacb21e1bdff3/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/682/4f87845e33960/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9de/40a7b0323d889/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/894/1aaadaf672462/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/a05/d0c237b334909/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/946/98a9c5f91f9d1/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5fe/d36fccc0612a5/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c64/9e3a33450ec82/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/66f/011380d0e49ed/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c66/38687455baf64/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6d0/2d6655b0e54f5/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8ec/a2a813c1cb7ad/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/21d/1152871b01940/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b21/e08af67b8a103/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1e3/a615586f05fc4/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/81a/fed14892743bb/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3e1/7ed538242334b/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/392/5dd22fa2b7699/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/2c8/f814d84194c9e/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/da9/02562c3e9c550/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/da6/8248800ad6320/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/467/1d9dd5ec934cb/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/00b/df7acc5f79515/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/45d/5e886156860dc/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/07b/271772c100085/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d48/a880098c96020/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f93/fd8e5c8c0a4aa/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/dd4/f05f54a52fb55/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c8d/3b5532fc71b7a/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d9b/29c1f0ae438d5/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6d5/0360be4546678/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/74a/03b9698e198d4/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/19f/705ada2530c11/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/256/f80b80ca3853f/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fc3/3c5141b55ed36/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c65/4de545946e0db/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/24b/6f81f1983e6df/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/128/73ca6cb9b0f0d/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d9b/97165e8aed927/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/afb/8db5439b81cf9/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/737/fe7d37e1a1bff/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/381/00abb9d1b1435/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/087/067fa8953339c/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/203/a48d1fb583fc7/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/dbd/5c7a25a7cb98f/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9a6/7fc9e8eb39039/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7a6/6c7204d886929/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7cc/09976e8b56f8c/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/92b/68146a71df785/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b1e/74d11748e7e98/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/28a/3a209b96630bc/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/755/3fb2090d71822/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6c6/c373cfc5c83a9/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1fc/9ea04857caf66/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d68/b6cef7827e864/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0a1/527a803f0a659/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/086/95f5cb7ed6e05/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/4f1/d9991f5acc0ca/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "coverage" version = "7.13.5" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c81/f6515c4c40141/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/e07/23d2c96324561/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/52f/444e864759925/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/704/de6328e3d612a/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/a1a/6d79a14e1ec18/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/790/60214983769c7/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/356/e76b46783a98c/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0ce/f0cdec915d112/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/dc0/22073d063b25a/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9b7/4db26dfea4f4e/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ad1/46744ca4fd09b/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c55/5b48be1853fe3/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/703/4b5c56a58ae5e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eb7/fdf1ef130660e/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3e1/bb5f6c78feeb1/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/66a/80c616f80181f/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/145/ede53ccbafb29/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/067/2854dc733c342/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ec1/0e2a42b41c923/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/be3/d4bbad9d4b037/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/4d2/afbc5cc54d286/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3ad/050321264c49c/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/730/0c8a6d13335b2/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eb0/7647a5738b89b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9ad/b6688e3b53adf/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7c8/d4bc913dd70b9/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0e3/c426ffc4cd952/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/259/b69bb83ad9894/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/258/354455f4e86e3/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/bff/95879c33ec8da/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/460/cf0114c5016fa/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0e2/23ce4b4ed47f0/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6e3/370441f4513c6/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/03c/cc709a17a1de0/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3f4/818d065964db3/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/012/d5319e66e9d5a/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8dd/02af98971bdb9/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f08/fd75c50a760c7/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/843/ea8643cf967d1/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9d4/4d7aa963820b1/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/713/2bed4bd7b8362/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/a69/8e363641b9884/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/bdb/a0a6b8812e8c7/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d2c/87e0c473a10bf/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/bf6/9236a9a81bdca/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5ec/4af212df513e3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/941/617e518602e2d/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/da3/05e9937617ee9/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/78e/696e1cc714e57/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/02c/a0eed225b2ff3/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/046/90832cbea4e46/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/059/0e44dd2745c69/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d7c/fad2d6d81dd29/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e09/2b9499de38ae0/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/48c/39bc4a04d983a/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/2d3/807015f138ffe/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ee2/aa19e03161671/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ce1/998c048300760/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/631/efb83f0156967/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f4c/d16206ad171cb/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/042/8cbef5783ad91/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e0b/216a19534b242/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/972/a9cd27894afe4/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/4b5/9148601efcd2b/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/505/d7083c8b0c87a/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/603/65289c3741e4d/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1b8/8c69c8ef5d4b6/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5b1/3955d31d1633c/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f70/c9ab2595c56f8/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/084/b84a8c63e8d6f/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ad1/4385487393e38/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7f2/c47b36fe7709a/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/67e/9bc5449801fad/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/da8/6cdcf10d2519e/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0ec/f12ecb326fe2c/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fba/bfaceaeb587e1/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9bb/2a28101a44366/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/bd3/a2fbc1c6cccb3/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6c3/6ddb64ed9d7e4/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/380/e8e9084d8eb38/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e80/8af52a0513762/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e30/1d30dd7e95ae0/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/800/bc829053c80d2/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0b6/7af5492adb319/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c91/36ff29c3a91e2/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/cff/784eef7f0b8f6/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/68a/4953be99b17ac/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/35a/31f2b1578185f/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/2aa/055ae1857258f/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1b1/1eef33edeae9d/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/10a/0c37f0b646eaf/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b5d/b73ba3c41c700/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/750/db93a81e3e5a9/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9dd/b4f4a5479f253/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d8a/7a2049c14f413/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e1c/85e0b6c05c592/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/777/c4d1eff1b6787/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/669/7e29b93707167/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8fd/f453a942c3e4d/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/32c/a0c0114c9834a/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/876/9751c10f33902/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/cec/2d83125531bd1/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0cd/9ed7a8b181775/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/301/e3b7dfefecaca/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9da/cc2ad679b2927/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/34b/02417cf070e17/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] [[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/8b4/12432c6055b0b/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219" } +name = "distro" +version = "1.9.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/a7a/39a3bd276781e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "edge-tts" +version = "7.2.8" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "certifi" }, + { name = "tabulate" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/3f/60/afbf548b43c78355e03926c6b1fff7500303a2da4d84db9e1324119e21ae/edge_tts-7.2.8.tar.gz", hash = "sha256:fcf185a0d527a0d2d003f9d5841facc1d5e0e7b3b88d5df9c32990402c6b8cd0", size = 27875, upload-time = "2026-03-22T19:57:50.962Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/2b/a8cb687b92a2690d2ad171f0c2fd1c8f18690363cca7618bab2bbe4cdf2b/edge_tts-7.2.8-py3-none-any.whl", hash = "sha256:361fe48ce7ef613adbe30f664e3765dd71029c6cb57427279eff8ad6df2eb211", size = 31026, upload-time = "2026-03-22T19:57:49.672Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] [[package]] name = "fsrs" version = "6.3.1" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/43c/5c6056b97266b/fsrs-6.3.1.tar.gz", hash = "sha256:43c5c6056b97266baf6ebfef9e4cadeb9ac5a4e1b29ffdfb300f445b6e6b15ca" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/00/337de60fd5497ea4fed046192d17fa79809ca2aad7326da2e464d9d8950b/fsrs-6.3.1.tar.gz", hash = "sha256:43c5c6056b97266baf6ebfef9e4cadeb9ac5a4e1b29ffdfb300f445b6e6b15ca", size = 32645, upload-time = "2026-03-10T14:01:03.734Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/ac1/bf9939573592d/fsrs-6.3.1-py3-none-any.whl", hash = "sha256:ac1bf9939573592d8c9bc1e11a00bd17e04146dc9f2c913127e2bcc431b9040b" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/67/3c/e7e140f8cdb95b042cb125ee142e7630187e8e78d21847ca81e9d1e99bb8/fsrs-6.3.1-py3-none-any.whl", hash = "sha256:ac1bf9939573592d8c9bc1e11a00bd17e04146dc9f2c913127e2bcc431b9040b", size = 22840, upload-time = "2026-03-10T14:01:01.084Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[package]] @@ -240,69 +438,220 @@ name = "heurams" version = "0.5.0" source = { editable = "." } dependencies = [ - { name = "fsrs" }, - { name = "psutil" }, { name = "tabulate" }, - { name = "textual" }, { name = "toml" }, { name = "transitions" }, - { name = "zmq" }, ] -[package.dev-dependencies] +[package.optional-dependencies] +algo-fsrs = [ + { name = "fsrs" }, +] +all = [ + { name = "edge-tts" }, + { name = "fsrs" }, + { name = "jieba" }, + { name = "openai" }, + { name = "playsound" }, + { name = "pygobject" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "zmq" }, +] +audio-playsound = [ + { name = "playsound" }, + { name = "pygobject" }, +] dev = [ { name = "pytest" }, { name = "pytest-cov" }, + { name = "zmq" }, +] +interface = [ + { name = "psutil" }, + { name = "textual" }, +] +llm-openai = [ + { name = "openai" }, +] +misc-jieba = [ + { name = "jieba" }, +] +tts-edgetts = [ + { name = "edge-tts" }, ] [package.metadata] requires-dist = [ - { name = "fsrs", specifier = ">=6.3.1" }, - { name = "psutil", specifier = ">=7.2.2" }, + { name = "edge-tts", marker = "extra == 'tts-edgetts'", specifier = ">=7.2.8" }, + { name = "fsrs", marker = "extra == 'algo-fsrs'", specifier = ">=6.3.1" }, + { name = "heurams", extras = ["algo-fsrs"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["audio-playsound"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["dev"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["llm-openai"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["misc-jieba"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["tts-edgetts"], marker = "extra == 'all'" }, + { name = "jieba", marker = "extra == 'misc-jieba'", specifier = ">=0.42.1" }, + { name = "openai", marker = "extra == 'llm-openai'", specifier = ">=2.32.0" }, + { name = "playsound", marker = "extra == 'audio-playsound'", specifier = "==1.2.2" }, + { name = "psutil", marker = "extra == 'interface'", specifier = ">=7.2.2" }, + { name = "pygobject", marker = "extra == 'audio-playsound'", specifier = ">=3.56.2" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "tabulate", specifier = ">=0.10.0" }, - { name = "textual", specifier = ">=8.2.3" }, + { name = "textual", marker = "extra == 'interface'", specifier = ">=8.2.3" }, { name = "toml", specifier = ">=0.10.2" }, { name = "transitions", specifier = ">=0.9.3" }, - { name = "zmq", specifier = ">=0.0.0" }, + { name = "zmq", marker = "extra == 'dev'", specifier = ">=0.0.0" }, +] +provides-extras = ["interface", "algo-fsrs", "tts-edgetts", "misc-jieba", "llm-openai", "audio-playsound", "dev", "all"] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] -[package.metadata.requires-dev] -dev = [ - { name = "pytest", specifier = ">=8.0.0" }, - { name = "pytest-cov", specifier = ">=6.0.0" }, +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.13" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c76/315c77db06865/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/f63/1c04d2c48c52b/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jieba" +version = "0.42.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/cb/18eeb235f833b726522d7ebed54f2278ce28ba9438e3135ab0278d9792a2/jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2", size = 19214172, upload-time = "2020-01-20T14:27:23.5Z" } + +[[package]] +name = "jiter" +version = "0.14.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, ] [[package]] name = "linkify-it-py" version = "2.1.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "uc-micro-py" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/433/60231720999c1/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/2e/c9/06ea13676ef354f0af6169587ae292d3e2406e212876a413bf9eece4eb23/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b", size = 29158, upload-time = "2026-03-01T07:48:47.683Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/0d2/52c1594ecba2e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" }, ] [[package]] name = "markdown-it-py" version = "4.0.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/cb0/a2b4aa34f932c/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/873/27c59b172c501/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [package.optional-dependencies] @@ -313,237 +662,542 @@ linkify = [ [[package]] name = "mdit-py-plugins" version = "0.5.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/f49/18cb50119f504/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/07a/08422fc1936a5/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/bb4/13d29f5eea38f/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/840/08a41e51615a4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "openai" +version = "2.32.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, ] [[package]] name = "packaging" version = "26.1" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/f04/2152b681c4bfa/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/5d9/c0669c6285e49/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, ] [[package]] name = "platformdirs" version = "4.9.6" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/3bf/a75b0ad0db840/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/e61/adb1d5e5cb344/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + +[[package]] +name = "playsound" +version = "1.2.2" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/16/10d897b0a83fb4b05b03a63d7a2667ab75f857f67f7062fd447dd3f49bf7/playsound-1.2.2-py2.py3-none-any.whl", hash = "sha256:1e83750a5325cbccee03d6e751ba3e78c037ac95b95a3ba1f38d0c5aca9e1a34", size = 5960, upload-time = "2017-06-29T14:08:29.207Z" }, ] [[package]] name = "pluggy" version = "1.6.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/7dc/c130b76258d33/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/e92/0276dd6813095/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] [[package]] name = "psutil" version = "7.2.2" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/074/6f5f8d406af34/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/2ed/ccc433cbfa046/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e78/c8603dcd9a04c/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1a5/71f2330c966c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/917/e891983ca3c18/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ab4/86563df44c17f/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ae0/aefdd8796a773/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eed/63d3b4d624495/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7b6/d09433a10592c/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1fa/4ecf83bcdf6e6/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e45/2c464a02e7dc7/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c76/63d4e37f13e88/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/11f/e5a4f61375976/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ed0/cace939114f62/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1a7/b04c10f32cc88/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/076/a2d2f923fd482/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b07/26cecd84f9474/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fd0/4ef36b4a6d599/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b58/fabe35e80b264/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eb7/e81434c8d223e/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8c2/33660f575a5a8/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pycairo" +version = "1.29.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/28/6363087b9e60af031398a6ee5c248639eefc6cc742884fa2789411b1f73b/pycairo-1.29.0-cp312-cp312-win32.whl", hash = "sha256:91bcd7b5835764c616a615d9948a9afea29237b34d2ed013526807c3d79bb1d0", size = 751486, upload-time = "2025-11-11T19:11:54.451Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3a/d2/d146f1dd4ef81007686ac52231dd8f15ad54cf0aa432adaefc825475f286/pycairo-1.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f01c3b5e49ef9411fff6bc7db1e765f542dc1c9cfed4542958a5afa3a8b8e76", size = 845383, upload-time = "2025-11-11T19:12:01.551Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/16/6e6f33bb79ec4a527c9e633915c16dc55a60be26b31118dbd0d5859e8c51/pycairo-1.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:eafe3d2076f3533535ad4a361fa0754e0ee66b90e548a3a0f558fed00b1248f2", size = 694518, upload-time = "2025-11-11T19:12:06.561Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f0/21/3f477dc318dd4e84a5ae6301e67284199d7e5a2384f3063714041086b65d/pycairo-1.29.0-cp313-cp313-win32.whl", hash = "sha256:3eb382a4141591807073274522f7aecab9e8fa2f14feafd11ac03a13a58141d7", size = 750949, upload-time = "2025-11-11T19:12:12.198Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/43/34/7d27a333c558d6ac16dbc12a35061d389735e99e494ee4effa4ec6d99bed/pycairo-1.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:91114e4b3fbf4287c2b0788f83e1f566ce031bda49cf1c3c3c19c3e986e95c38", size = 844149, upload-time = "2025-11-11T19:12:19.171Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/15/43/e782131e23df69e5c8e631a016ed84f94bbc4981bf6411079f57af730a23/pycairo-1.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:09b7f69a5ff6881e151354ea092137b97b0b1f0b2ab4eb81c92a02cc4a08e335", size = 693595, upload-time = "2025-11-11T19:12:23.445Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, ] [[package]] name = "pycparser" version = "3.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/600/f49d217304a59/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/b72/7414169a36b7d/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.3" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.3" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, ] [[package]] name = "pygments" version = "2.20.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/675/7cd03768053ff/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/81a/9e26dd42fd28a/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] +[[package]] +name = "pygobject" +version = "3.56.2" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "pycairo" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/80/09247a2be28af2c2240132a0af6c1005a2b1d089242b13a2cd782d2de8d7/pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313", size = 1409059, upload-time = "2026-03-25T16:14:04.008Z" } + [[package]] name = "pytest" version = "9.0.3" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/b86/ada508af81d19/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/2c5/efc453d45394f/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] name = "pytest-cov" version = "7.1.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, + { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/306/74f2b5f6351aa/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/a04/61110b7865f9a/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] [[package]] name = "pyzmq" version = "27.1.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/ac0/765e3d44455ad/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/508/e23ec9bc44c00/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/507/b6f430bdcf0ee/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/bf7/b38f9fd7b81cb/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/03f/f0b279b40d687/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/677/e744fee605753/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/dd2/fec2b13137416/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/08e/90bb4b57603b8/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/a5b/42d7a0658b515/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c0b/b87227430ee3a/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9a9/16f76c2ab8d04/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/226/b091818d461a3/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/079/0a0161c281ca9/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c89/5a6f35476b0c3/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5bb/f8d3630bf9655/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/15c/8bd0fe0dabf80/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/baf/cb3dd171b4ae9/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e82/9529fcaa09937/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6df/079c47d5902af/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/190/cbf120fbc0fc4/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eca/6b47df11a132d/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/452/631b640340c92/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1c1/79799b118e554/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/383/7439b7f99e603/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/43a/d9a73e3da1fab/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0de/3028d69d4cdc4/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/cf4/4a7763aea9298/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f30/f395a9e6fbca1/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/250/e5436a4ba1388/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9ce/490cf1d2ca2ad/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/75a/2f36223f0d535/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/93a/d4b0855a66422/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fbb/4f2400bfda24f/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/e34/3d067f7b151cf/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/083/63b2011dec81c/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d54/530c8c8b5b8dd/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6f3/afa12c392f0a4/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c65/047adafe573ff/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/90e/6e9441c946a8b/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/add/071b2d25f84e8/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7cc/c0700cfdf7bd4/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/808/5a9fba668216b/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/6bb/54ca21bcfe361/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ce9/80af330231615/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/177/9be8c549e54a1/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/720/0bb0f03345515/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/01c/0e07d558b06a6/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/80d/834abee71f652/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/544/b4e3b7198dde4/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ced/c4c68178e59a4/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1f0/b2a577fd770aa/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/19c/9468ae0437f80/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/dc5/dbf68a7857b59/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c17/e03cbc9312bee/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f32/8d01128373cb6/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/9c1/790386614232e/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/448/f9cb54eb0cee4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/05b/12f2d32112bf8/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/187/70c8d35637153/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ac2/5465d42f92e99/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/53b/40f8ae006f273/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f60/5d884e7c8be8f/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c9f/7f6e13dff2e44/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, ] [[package]] name = "rich" version = "15.0.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/edd/07a4824c6b401/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/33b/d4ef74232fb73/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] name = "six" version = "1.17.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/ff7/0335d468e7eb6/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/472/1f391ed90541f/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "tabulate" version = "0.10.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/e2c/fde8f79420f6d/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/f0b/0622e567335c8/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, ] [[package]] name = "textual" version = "8.2.4" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "markdown-it-py", extra = ["linkify"] }, { name = "mdit-py-plugins" }, @@ -552,109 +1206,183 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/d4e/2b2ddd7157191/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/89/bec5709fb759f9c784bbcb30b2e3497df3f901691d13c2b864dbf6694a17/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4", size = 1848933, upload-time = "2026-04-19T04:20:45.845Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/a83/bd3f0cc7125ca/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5c/32/02932f0d597cdbb34e34bf24266ff0f2cf292ccb3aafc37dd9efcb0cc416/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba", size = 724390, upload-time = "2026-04-19T04:20:49.968Z" }, ] [[package]] name = "toml" version = "0.10.2" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/b3b/da1d108d5dd99/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/806/143ae5bfb6a3c/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, ] [[package]] -name = "tomli" -version = "2.4.1" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/7c7/e1a961a0b2f24/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f" } +name = "tqdm" +version = "4.67.3" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/f8f/0fc26ec2cc2b9/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/4ab/97e64ccda8756/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/964/81a5786729fd4/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5a8/81ab208c0baf6/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/471/49d5bd38761ac/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ec9/bfaf3ad2df51a/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ff2/983983d34813c/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5ee/18d9ebdb417e3/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c25/41745709bad02/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c74/2f741d58a2894/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7f8/6fd587c4ed9dd/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ff1/8e6a727ee0ab0/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/136/443dbd7e1dee4/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5e2/62d41726bc187/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/5cb/41aa38891e073/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/da2/5dc3563bff596/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/52c/8ef851d9a240f/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f75/8f1b9299d059c/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/36d/2bd2ad5fb9ead/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eb0/dc4e38e6a1fd5/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/c7f/2c7f2b9ca6bde/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/f3c/6818a1a86dd6d/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d31/2ef37c91508b0/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/515/29d40e3ca5004/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/219/0f2e9dd7508d2/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8d6/5a2fbf9d2f835/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/4b6/05484e43cdc43/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/fd0/409a3653af6c1/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/a12/0733b01c45e9a/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/559/db847dc486944/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/01f/520d4f53ef979/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/7f9/4b27a62cfad84/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/ede/3e6487c5ef5d2/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/3d4/8a93ee1c9b79c/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/88d/ceee75c2c63af/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b8c/198f8c1805dc4/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/d4d/8fe59808a5465/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/700/8df2e7655c495/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/1d8/591993e228b0c/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/734/e20b57ba95624/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/8a6/50c2dbafa08d4/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/504/aa796fe0569bb/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/b1d/22e6e9387bf47/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/2c1/c351919aca028/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/eab/21f45c7f66c13/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396" }, - { url = "https://pypi.pluv27.top/root/pypi/+f/0d8/5819802132122/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] [[package]] name = "transitions" version = "0.9.3" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/881/fb75bb1654ed5/transitions-0.9.3.tar.gz", hash = "sha256:881fb75bb1654ed55d86060bb067f2c716f8e155f57bb73fd444e53713aafec8" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/4f/83/9e90f3494057d73c9e6bd8de8488af7c9fa714666ccc2db30fe07d147818/transitions-0.9.3.tar.gz", hash = "sha256:881fb75bb1654ed55d86060bb067f2c716f8e155f57bb73fd444e53713aafec8", size = 1191029, upload-time = "2025-07-02T10:49:03.153Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/024/63248f2b668d8/transitions-0.9.3-py2.py3-none-any.whl", hash = "sha256:02463248f2b668d86f66636b1e3c9e8de84d93e22915247f4e1aa9ee1cae28aa" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f4/05/fea3020e90aa378941ff10de8860fb3b1288313c27efd10fa0c476498f7e/transitions-0.9.3-py2.py3-none-any.whl", hash = "sha256:02463248f2b668d86f66636b1e3c9e8de84d93e22915247f4e1aa9ee1cae28aa", size = 112792, upload-time = "2025-07-02T10:49:01.415Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/0ce/a48d173cc12fa/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/f0f/a19c6845758ab/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[package]] name = "uc-micro-py" version = "2.0.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/c53/691e495c8db60/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/78/67/9a363818028526e2d4579334460df777115bdec1bb77c08f9db88f6389f2/uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811", size = 6611, upload-time = "2026-03-01T06:31:27.526Z" } wheels = [ - { url = "https://pypi.pluv27.top/root/pypi/+f/360/3a3859af53e5a/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/61/73/d21edf5b204d1467e06500080a50f79d49ef2b997c79123a536d4a17d97c/uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c", size = 6383, upload-time = "2026-03-01T06:31:26.257Z" }, +] + +[[package]] +name = "yarl" +version = "1.23.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] [[package]] name = "zmq" version = "0.0.0" -source = { registry = "https://pypi.pluv27.top/root/stable/+simple/" } +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "pyzmq" }, ] -sdist = { url = "https://pypi.pluv27.top/root/pypi/+f/6b1/a1de53338646e/zmq-0.0.0.tar.gz", hash = "sha256:6b1a1de53338646e8c8405803cffb659e8eb7bb02fff4c9be62a7acfac8370c9" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/6e/78/833b2808793c1619835edb1a4e17a023d5d625f4f97ff25ffff986d1f472/zmq-0.0.0.tar.gz", hash = "sha256:6b1a1de53338646e8c8405803cffb659e8eb7bb02fff4c9be62a7acfac8370c9", size = 966, upload-time = "2015-05-21T17:34:26.603Z" } From 5182572cc78432c7e2c10be14b6c334a183c5c78 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 30 Apr 2026 04:52:17 +0800 Subject: [PATCH 61/79] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/screens/dashboard.py | 2 +- src/heurams/services/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 4b90412..16be393 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -80,7 +80,7 @@ class DashboardScreen(Screen): from heurams.services.attic import Attic a = Attic("ana", {"totaltime": 0, "openpuzzles": 0, "puzzles_err": 0}) - yield Label(f"版本 {version.ver} {version.stage.capitalize()}") # 版本信息 + yield Label(f"版本 {version.ver}-{version.stage}") # 版本信息 yield Label( f"在 {round(a.data['totaltime'], 2)} 秒内处理了 {a.data['openpuzzles']} 个谜题, 正确率{'无法求解' if not a.data['openpuzzles'] else ' ' + str(round(100 * (1 - a.data['puzzles_err']/a.data['openpuzzles']), 2)) + '%'}, 平均速度{'无法求解' if not a.data['totaltime'] else ' ' + str(round(a.data['openpuzzles']/a.data['totaltime'], 2)) + ' 个每秒'}", id="analysis", diff --git a/src/heurams/services/version.py b/src/heurams/services/version.py index 0a30daf..9d05552 100644 --- a/src/heurams/services/version.py +++ b/src/heurams/services/version.py @@ -4,7 +4,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) ver = "0.5.0" -stage = "prototype" +stage = "rc.1" codename = "fulcrum" codename_cn = "支点" From 520c78dbc5ce0181ef6d746c1220fbea858b5479 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 2 May 2026 02:36:14 +0800 Subject: [PATCH 62/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 7 ++++++- README.md | 15 ++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd8dd72..c676379 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,11 @@ 欢迎为此项目做出贡献! +> [!NOTE] +> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 +> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 + ## 开发规范 分支划分: @@ -93,7 +98,7 @@ HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: - 我们的内置 Textual TUI 前端不是唯一可用的前端 -- 您可以在自己的项目中以独立进程/服务调用 HeurAMS (但不能在代码中链接), 而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. +- 您可以在自己的项目中以独立进程/服务调用 HeurAMS, 而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. - 如果您有一个自己开发的且可用的 HeurAMS 前端 (例如我们暂未实现的 flutter 前端), 并且以 AGPL-3.0/GPL-3.0 开放源代码, 可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) diff --git a/README.md b/README.md index 38fa12e..b83f28b 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,15 @@ ## 项目结构 -这个仓库是 "潜进" 的核心程序库在 python 语言下的实现\ -包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块)\ +这个仓库是 "潜进" 的核心程序库在 python 语言下的实现 +包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) 除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 +> [!NOTE] +> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台应用程序前端开发, 称作 "潜进K型 (HeurAMS-K)" +> 它通过 `PyOtherSide` 直接复用 python 内核, 现代化的 UI 支持 Windows, Linux, macOS, Android 和 Plasma Mobile +> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 HeurAMS-K 项目的开发 + ## 特性 ### 间隔重复调度器 @@ -53,9 +58,9 @@ 潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本. > [!CAUTION] -> 对于部分 Linux 发行版和 Android Termux 用户:\ -> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖\ -> 例如在 termux 上先运行 `pkg install cmake clang libzmq`\ +> 对于部分 Linux 发行版和 Android Termux 用户: +> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖 +> 例如在 termux 上先运行 `pkg install cmake clang libzmq` > 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器 #### 稳定版本 From 40f4d6c6e38820385e4e18011cd21d196b14cdee Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Sat, 2 May 2026 02:38:33 +0800 Subject: [PATCH 63/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b83f28b..c263eff 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ 除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 > [!NOTE] -> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台应用程序前端开发, 称作 "潜进K型 (HeurAMS-K)" -> 它通过 `PyOtherSide` 直接复用 python 内核, 现代化的 UI 支持 Windows, Linux, macOS, Android 和 Plasma Mobile -> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 HeurAMS-K 项目的开发 +> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 +> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 ## 特性 From e2b9fb94f3513a65298041d452ddeddad2085035 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 4 May 2026 13:13:05 +0800 Subject: [PATCH 64/79] =?UTF-8?q?fix:=20=E7=A8=B3=E5=AE=9A=E6=80=A7?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/global.toml | 2 +- data/config/interface/puzzles/cloze.toml | 2 +- data/config/repo/cngk-t.toml | 2 +- data/misc/favorites.json5 | 165 +- data/repo/cngk-t/algodata.json | 11403 +++++++++++++++- src/heurams/__main__.py | 2 +- src/heurams/interface/css/main.tcss | 10 + .../interface/css/screens/memoqueue.tcss | 4 + src/heurams/interface/screens/about.py | 8 +- src/heurams/interface/screens/favmgr.py | 17 +- src/heurams/interface/screens/memoqueue.py | 5 +- src/heurams/interface/widgets/cloze_puzzle.py | 12 +- src/heurams/kernel/algorithms/nsp0.py | 7 +- 13 files changed, 11612 insertions(+), 27 deletions(-) diff --git a/data/config/global.toml b/data/config/global.toml index 707741e..9c0fd40 100644 --- a/data/config/global.toml +++ b/data/config/global.toml @@ -1,4 +1,4 @@ -zmq_debug = false +zmq_debug = true _zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 _zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" diff --git a/data/config/interface/puzzles/cloze.toml b/data/config/interface/puzzles/cloze.toml index f1437a6..1673c6e 100644 --- a/data/config/interface/puzzles/cloze.toml +++ b/data/config/interface/puzzles/cloze.toml @@ -1,2 +1,2 @@ -min_denominator = "2" +min_denominator = " 1" _min_denominator_desc = "设空比例系数的倒数" diff --git a/data/config/repo/cngk-t.toml b/data/config/repo/cngk-t.toml index 3cd8fc9..ea2bbef 100644 --- a/data/config/repo/cngk-t.toml +++ b/data/config/repo/cngk-t.toml @@ -1,6 +1,6 @@ algorithm = "NSP-0" _algorithm_desc = "记忆调度算法" -scheduled_num = 420 +scheduled_num = 35 _scheduled_num_desc = "单次记忆单元数量" [_algorithm_candidate] diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 index 0637a08..3f4db12 100644 --- a/data/misc/favorites.json5 +++ b/data/misc/favorites.json5 @@ -1 +1,164 @@ -[] \ No newline at end of file +[ + { + "repo_path": "cngk-t", + "ident": "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之", + "added": 1777679860, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!", + "added": 1777684719, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.", + "added": 1777748505, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.", + "added": 1777749120, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.", + "added": 1777749248, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.", + "added": 1777749385, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,", + "added": 1777749648, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "则胜负之数, 存亡之理, 当与秦相较, 或未易量.", + "added": 1777749737, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,", + "added": 1777749774, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.", + "added": 1777750294, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.", + "added": 1777750446, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.", + "added": 1777750594, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!", + "added": 1777750678, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.", + "added": 1777750884, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.", + "added": 1777750964, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "故不积跬步, 无以至千里; 不积小流, 无以成江海.", + "added": 1777751066, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.", + "added": 1777751570, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.", + "added": 1777846911, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "是故谋闭不兴, 盗窃乱贼而不作.", + "added": 1777846943, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "花径不曾缘客扫, 蓬门今始为君开.", + "added": 1777846974, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "盘飧市远无兼味, 樽酒家贫只旧醅.", + "added": 1777847000, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!", + "added": 1777847065, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.", + "added": 1777847121, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "夫天者, 人之始也; 父母者, 人之本也.", + "added": 1777847174, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.", + "added": 1777847195, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "信而见疑, 忠而被谤, 能无怨乎?", + "added": 1777847267, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.", + "added": 1777847825, + "tags": [] + } +] \ No newline at end of file diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json index 0967ef4..f809d0c 100644 --- a/data/repo/cngk-t/algodata.json +++ b/data/repo/cngk-t/algodata.json @@ -1 +1,11402 @@ -{} +{ + "临安春雨初霁": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4914656 + } + }, + "世味年来薄似纱, 谁令骑马客京华.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4924672 + } + }, + "小楼一夜听春雨, 深巷明朝卖杏花.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.493454 + } + }, + "矮纸斜行闲作草, 晴窗细乳戏分茶.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4944363 + } + }, + "素衣莫起风尘叹, 犹及清明可到家.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4954169 + } + }, + "书愤": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4964006 + } + }, + "早岁那知世事艰, 中原北望气如山": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.4973834 + } + }, + "楼船夜雪瓜洲渡, 铁马秋风大散关": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.498366 + } + }, + "塞上长城空自许, 镜中衰鬓已先斑": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.499353 + } + }, + "出师一表真名世, 千载谁堪伯仲间": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5003324 + } + }, + "五代史伶官传序": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5013266 + } + }, + "呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5023134 + } + }, + "原庄宗之所以得天下, 与其所以失之者, 可以知之矣": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5033157 + } + }, + "世言晋王之将终也, 以三矢赐庄宗而告之曰:": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.504301 + } + }, + "梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5052884 + } + }, + "此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5062537 + } + }, + "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5072265 + } + }, + "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5081902 + } + }, + "及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.509152 + } + }, + "至于誓天断发, 泣下沾襟, 何其衰也!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5101078 + } + }, + "岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5110755 + } + }, + "《书》曰: 满招损, 谦得益.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5120487 + } + }, + "忧劳可以兴国, 逸豫可以亡身, 自然之理也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5130248 + } + }, + "故方其盛也, 举天下之豪杰, 莫能与之争;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.513995 + } + }, + "及其衰也, 数十伶人困之, 而身死国灭, 为天下笑": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5150003 + } + }, + "夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5160367 + } + }, + "六国论": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5170627 + } + }, + "六国破灭, 非兵不利, 战不善, 弊在赂秦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5180395 + } + }, + "赂秦而力亏, 破灭之道也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5190074 + } + }, + "或曰: 六国互丧, 率赂秦耶?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5199776 + } + }, + "曰: 不赂者以赂者丧.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.520953 + } + }, + "盖失强援, 不能独完.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5219326 + } + }, + "故曰: 弊在赂秦也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5228999 + } + }, + "秦以攻取之外, 小则获邑, 大则得城.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5238662 + } + }, + "较秦之所得, 与战胜而得者, 其实百倍;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.524846 + } + }, + "诸侯之所亡, 与战败而亡者, 其实亦百倍.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5258238 + } + }, + "则秦之所大欲, 诸侯之所大患, 固不在战矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.526805 + } + }, + "思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.52777 + } + }, + "子孙视之不甚惜, 举以予人, 如弃草芥.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5287466 + } + }, + "今日割五城, 明日割十城, 然后得一夕安寝.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5297248 + } + }, + "起视四境, 而秦兵又至矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5306935 + } + }, + "然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5316658 + } + }, + "故不战而强弱胜负已判矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5326347 + } + }, + "至于颠覆, 理固宜然.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5336022 + } + }, + "古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.534574 + } + }, + "此言得之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5355504 + } + }, + "齐人未尝赂秦, 终继五国迁灭, 何哉?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5365207 + } + }, + "与嬴而不助五国也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5375 + } + }, + "五国既丧, 齐亦不免矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5385113 + } + }, + "燕赵之君, 始有远略, 能守其土, 义不赂秦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20575, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777687299.5395193 + } + }, + "是故燕虽小国而后亡, 斯用兵之效也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2494323 + } + }, + "至丹以荆卿为计, 始速祸焉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2503824 + } + }, + "赵尝五战于秦, 二败而三胜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2513177 + } + }, + "后秦击赵者再, 李牧连却之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2522445 + } + }, + "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2531524 + } + }, + "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2540634 + } + }, + "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2549765 + } + }, + "则胜负之数, 存亡之理, 当与秦相较, 或未易量.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2558837 + } + }, + "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2567906 + } + }, + "则吾恐秦人食之不得下咽也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.257705 + } + }, + "悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2586217 + } + }, + "为国者无使为积威之所劫哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2595222 + } + }, + "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2604313 + } + }, + "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.261338 + } + }, + "劝学": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2622435 + } + }, + "君子曰: 学不可以已.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.263148 + } + }, + "青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2640674 + } + }, + "木直中绳, 𫐓以为轮, 其曲中规.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2649877 + } + }, + "虽有槁暴, 不复挺者, 𫐓使之然也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2659097 + } + }, + "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.266835 + } + }, + "吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2677584 + } + }, + "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2686841 + } + }, + "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2696033 + } + }, + "君子生非异也, 善假于物也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2705297 + } + }, + "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2714655 + } + }, + "故不积跬步, 无以至千里; 不积小流, 无以成江海.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2723877 + } + }, + "骐骥一跃, 不能十步; 驽马十驾, 功在不舍.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2733133 + } + }, + "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2742264 + } + }, + "蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2751412 + } + }, + "蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2760553 + } + }, + "声声慢·寻寻觅觅": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2769687 + } + }, + "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2778819 + } + }, + "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2788045 + } + }, + "大道之行也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.2797318 + } + }, + "大道之行也, 天下为公.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20576, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777752121.280661 + } + }, + "选贤与能, 讲信修睦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3410826 + } + }, + "故人不独亲其亲, 不独子其子.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3419733 + } + }, + "使老有所终, 壮有所用, 幼有所长.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3428566 + } + }, + "矜寡孤独废疾者皆有所养.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.343717 + } + }, + "男有分, 女有归.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3445776 + } + }, + "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.345438 + } + }, + "是故谋闭不兴, 盗窃乱贼而不作.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.346368 + } + }, + "故外户而不闭, 是谓大同.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3472884 + } + }, + "客至": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3481581 + } + }, + "舍南舍北皆春水, 但见群鸥日日来.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3490245 + } + }, + "花径不曾缘客扫, 蓬门今始为君开.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3498929 + } + }, + "盘飧市远无兼味, 樽酒家贫只旧醅.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3507535 + } + }, + "肯与邻翁相对饮, 隔篱呼取尽余杯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3516183 + } + }, + "将进酒": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3524792 + } + }, + "君不见, 黄河之水天上来, 奔流到海不复回.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3533425 + } + }, + "君不见, 高堂明镜悲白发, 朝如青丝暮成雪!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.354205 + } + }, + "人生得意须尽欢, 莫使金樽空对月.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3550696 + } + }, + "天生我材必有用, 千金散尽还复来.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3559296 + } + }, + "烹羊宰牛且为乐, 会须一饮三百杯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3570464 + } + }, + "岑夫子, 丹丘生, 将进酒, 杯莫停.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3579862 + } + }, + "与君歌一曲, 请君为我倾耳听.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3589103 + } + }, + "钟鼓馔玉不足贵, 但愿长醉不复醒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3598297 + } + }, + "古来圣贤皆寂寞, 惟有饮者留其名.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3607597 + } + }, + "陈王昔时宴平乐, 斗酒十千恣欢谑.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3616798 + } + }, + "主人何为言少钱, 径须沽取对君酌.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.362612 + } + }, + "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3635416 + } + }, + "屈原列传": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3644655 + } + }, + "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3653889 + } + }, + "离骚者, 犹离忧也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3663144 + } + }, + "夫天者, 人之始也; 父母者, 人之本也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3672378 + } + }, + "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3682392 + } + }, + "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3691041 + } + }, + "信而见疑, 忠而被谤, 能无怨乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3699749 + } + }, + "屈平之作《离骚》, 盖自怨生也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.370834 + } + }, + "《国风》好色而不淫, 《小雅》怨诽而不乱.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777847940.3725486 + } + }, + "若《离骚》者, 可谓兼之矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "明道德之广崇, 治乱之条贯, 靡不毕见.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其文约, 其辞微, 其志洁, 其行廉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其称文小而其指极大, 举类迩而见义远.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其志洁, 故其称物芳; 其行廉, 故死而不容.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "推此志也, 虽与日月争光可也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "山居秋暝": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "空山新雨后, 天气晚来秋.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "明月松间照, 清泉石上流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "竹喧归浣女, 莲动下渔舟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "随意春芳歇, 王孙自可留.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "师说": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "古之学者必有师.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "师者, 所以传道受业解惑也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人非生而知之者, 孰能无惑?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "惑而不从师, 其为惑也, 终不解矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "生乎吾前, 其闻道也固先乎吾, 吾从而师之;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "生乎吾后, 其闻道也亦先乎吾, 吾从而师之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾师道也, 夫庸知其年之先后生于吾乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是故无贵无贱, 无长无少, 道之所存, 师之所存也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "古之圣人, 其出人也远矣, 犹且从师而问焉;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今之众人, 其下圣人也亦远矣, 而耻学于师.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是故圣益圣, 愚益愚.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "巫医乐师百工之人, 不耻相师.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问之, 则曰: “彼与彼年相若也, 道相似也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "位卑则足羞, 官盛则近谀.”": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "呜呼! 师道之不复, 可知矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "郯子之徒, 其贤不及孔子.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "孔子曰: 三人行, 则必有我师.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余嘉其能行古道, 作《师说》以贻之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "归去来兮辞": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "归去来兮, 田园将芜胡不归?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "既自以心为形役, 奚惆怅而独悲?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "悟已往之不谏, 知来者之可追.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "实迷途其未远, 觉今是而昨非.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舟遥遥以轻飏, 风飘飘而吹衣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问征夫以前路, 恨晨光之熹微.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乃瞻衡宇, 载欣载奔.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "僮仆欢迎, 稚子候门.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "三径就荒, 松菊犹存.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "携幼入室, 有酒盈樽.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "引壶觞以自酌, 眄庭柯以怡颜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "倚南窗以寄傲, 审容膝之易安.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "园日涉以成趣, 门虽设而常关.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "策扶老以流憩, 时矫首而遐观.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "云无心以出岫, 鸟倦飞而知还.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "景翳翳以将入, 抚孤松而盘桓.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "归去来兮, 请息交以绝游.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "世与我而相违, 复驾言兮焉求?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "悦亲戚之情话, 乐琴书以消忧.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "农人告余以春及, 将有事于西畴.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "或命巾车, 或棹孤舟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "既窈窕以寻壑, 亦崎岖而经丘.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "木欣欣以向荣, 泉涓涓而始流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "善万物之得时, 感吾生之行休.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "已矣乎! 寓形宇内复几时?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曷不委心任去留?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "胡为乎遑遑欲何之?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "富贵非吾愿, 帝乡不可期.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "怀良辰以孤往, 或植杖而耘耔.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登东皋以舒啸, 临清流而赋诗.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "聊乘化以归尽, 乐夫天命复奚疑!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "归园田居·其一": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "少无适俗韵, 性本爱丘山": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "误落尘网中, 一去三十年": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "羁鸟恋旧林, 池鱼思故渊": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "开荒南野际, 守拙归园田": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "方宅十余亩, 草屋八九间": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "榆柳荫后檐, 桃李罗堂前": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "暧暧远人村, 依依墟里烟": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "狗吠深巷中, 鸡鸣桑树颠": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "户庭无尘杂, 虚室有余闲": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "久在樊笼里, 复得返自然": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "念奴娇·赤壁怀古": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "大江东去, 浪淘尽, 千古风流人物.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故垒西边, 人道是, 三国周郎赤壁.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乱石穿空, 惊涛拍岸, 卷起千堆雪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江山如画, 一时多少豪杰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "遥想公瑾当年, 小乔初嫁了, 雄姿英发.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "羽扇纶巾, 谈笑间, 樯橹灰飞烟灭.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故国神游, 多情应笑我, 早生华发.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人生如梦, 一尊还酹江月.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "念奴娇·过洞庭": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "洞庭青草, 近中秋, 更无一点风色.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "玉鉴琼田三万顷, 着我扁舟一叶.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "素月分辉, 明河共影, 表里俱澄澈.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "悠然心会, 妙处难与君说.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "应念岭海经年, 孤光自照, 肝肺皆冰雪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "短发萧骚襟袖冷, 稳泛沧浪空阔.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "尽挹西江, 细斟北斗, 万象为宾客.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "扣舷独啸, 不知今夕何夕!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "扬州慢": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "淮左名都, 竹西佳处, 解鞍少驻初程.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "过春风十里, 尽荠麦青青.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自胡马窥江去后, 废池乔木, 犹厌言兵.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "渐黄昏, 清角吹寒, 都在空城.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "杜郎俊赏, 算而今, 重到须惊.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "纵豆蔻词工, 青楼梦好, 难赋深情.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "二十四桥仍在, 波心荡, 冷月无声.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "念桥边红药, 年年知为谁生?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "报任安书": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "《诗》三百篇, 大底圣贤发愤之所为作也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此人皆意有所郁结, 不得通其道, 故述往事, 思来者.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "亦欲以究天人之际, 通古今之变, 成一家之言.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然此可为智者道, 难为俗人言也!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "拟行路难·其四": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "泻水置平地, 各自东西南北流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人生亦有命, 安能行叹复坐愁?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "酌酒以自宽, 举杯断绝歌路难.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "心非木石岂无感, 吞声踯躅不敢言.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "无衣": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "春江花月夜": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "春江潮水连海平, 海上明月共潮生.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "滟滟随波千万里, 何处春江无月明!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江流宛转绕芳甸, 月照花林皆似霰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "空里流霜不觉飞, 汀上白沙看不见.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江天一色无纤尘, 皎皎空中孤月轮.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江畔何人初见月? 江月何年初照人?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人生代代无穷已, 江月年年望相似.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不知江月待何人, 但见长江送流水.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "白云一片去悠悠, 青枫浦上不胜愁.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谁家今夜扁舟子? 何处相思明月楼?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "可怜楼上月徘徊, 应照离人妆镜台.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "玉户帘中卷不去, 捣衣砧上拂还来.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此时相望不相闻, 愿逐月华流照君.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鸿雁长飞光不度, 鱼龙潜跃水成文.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "昨夜闲潭梦落花, 可怜春半不还家.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江水流春去欲尽, 江潭落月复西斜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "斜月沉沉藏海雾, 碣石潇湘无限路.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不知乘月几人归, 落月摇情满江树.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "望海潮·东南形胜": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "东南形胜, 三吴都会, 钱塘自古繁华.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "烟柳画桥, 风帘翠幕, 参差十万人家.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "云树绕堤沙, 怒涛卷霜雪, 天堑无涯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "市列珠玑, 户盈罗绮, 竞豪奢.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "重湖叠𪩘清嘉, 有三秋桂子, 十里荷花.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "异日图将好景, 归去凤池夸.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "朝天子·咏喇叭": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "喇叭, 唢呐, 曲儿小腔儿大": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "官船来往乱如麻, 全仗你抬声价": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "军听了军愁, 民听了民怕": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "哪里去辨甚么真共假?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "眼见的吹翻了这家, 吹伤了那家,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "只吹的水尽鹅飞罢!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "李凭箜篌引": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吴丝蜀桐张高秋, 空山凝云颓不流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江娥啼竹素女愁, 李凭中国弹箜篌.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "昆山玉碎凤凰叫, 芙蓉泣露香兰笑.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "十二门前融冷光, 二十三丝动紫皇.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "女娲炼石补天处, 石破天惊逗秋雨.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "梦入神山教神妪, 老鱼跳波瘦蛟舞.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吴质不眠倚桂树, 露脚斜飞湿寒兔.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "桂枝香·金陵怀古": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登临送目, 正故国晚秋, 天气初肃.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千里澄江似练, 翠峰如簇.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "归帆去棹残阳里, 背西风, 酒旗斜矗.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "彩舟云淡, 星河鹭起, 画图难足.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "念往昔, 繁华竞逐.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "叹门外楼头, 悲恨相续.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千古凭高对此, 谩嗟荣辱.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "六朝旧事随流水, 但寒烟衰草凝绿.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "至今商女, 时时犹唱, 后庭遗曲.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "梦游天姥吟留别": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "天姥连天向天横, 势拔五岳掩赤城.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "天台四万八千丈, 对此欲倒东南倾.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "我欲因之梦吴越, 一夜飞度镜湖月.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "湖月照我影, 送我至剡溪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谢公宿处今尚在, 渌水荡漾清猿啼.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "脚著谢公屐, 身登青云梯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "半壁见海日, 空中闻天鸡.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千岩万转路不定, 迷花倚石忽已暝.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "熊咆龙吟殷岩泉, 栗深林兮惊层巅.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "云青青兮欲雨, 水澹澹兮生烟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "列缺霹雳, 丘峦崩摧.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "洞天石扉, 訇然中开.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "青冥浩荡不见底, 日月照耀金银台.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "霓为衣兮风为马, 云之君兮纷纷而来下.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虎鼓瑟兮鸾回车, 仙之人兮列如麻.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "忽魂悸以魄动, 恍惊起而长嗟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "惟觉时之枕席, 失向来之烟霞.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "世间行乐亦如此, 古来万事东流水.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "安能摧眉折腰事权贵, 使我不得开心颜?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "永遇乐·京口北固亭怀古": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千古江山, 英雄无觅, 孙仲谋处.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舞榭歌台, 风流总被, 雨打风吹去.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "斜阳草树, 寻常巷陌, 人道寄奴曾住.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "想当年, 金戈铁马, 气吞万里如虎.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "元嘉草草, 封狼居胥, 赢得仓皇北顾.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "四十三年, 望中犹记, 烽火扬州路.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "可堪回首, 佛狸祠下, 一片神鸦社鼓.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "凭谁问: 廉颇老矣, 尚能饭否?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江城子·乙卯正月二十日夜记梦": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "十年生死两茫茫, 不思量, 自难忘": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千里孤坟, 无处话凄凉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "纵使相逢应不识, 尘满面, 鬓如霜": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "夜来幽梦忽还乡, 小轩窗, 正梳妆": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "相顾无言, 惟有泪千行": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "料得年年肠断处, 明月夜, 短松冈": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "涉江采芙蓉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "涉江采芙蓉, 兰泽多芳草.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "采之欲遗谁? 所思在远道.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "还顾望旧乡, 长路漫浩浩.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "同心而离居, 忧伤以终老.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "燕歌行": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "汉家烟尘在东北, 汉将辞家破残贼.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "男儿本自重横行, 天子非常赐颜色.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "摐金伐鼓下榆关, 旌旆逶迤碣石间.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "校尉羽书飞瀚海, 单于猎火照狼山.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "山川萧条极边土, 胡骑凭陵杂风雨.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "战士军前半死生, 美人帐下犹歌舞!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "大漠穷秋塞草腓, 孤城落日斗兵稀.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "身当恩遇常轻敌, 力尽关山未解围.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "铁衣远戍辛勤久, 玉箸应啼别离后.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "少妇城南欲断肠, 征人蓟北空回首.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "边庭飘飖那可度, 绝域苍茫无所有.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "杀气三时作阵云, 寒声一夜传刁斗.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "相看白刃血纷纷, 死节从来岂顾勋!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君不见沙场征战苦, 至今犹忆李将军.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "琵琶行": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "浔阳江头夜送客, 枫叶荻花秋瑟瑟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "主人下马客在船, 举酒欲饮无管弦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "醉不成欢惨将别, 别时茫茫江浸月.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "忽闻水上琵琶声, 主人忘归客不发.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "寻声暗问弹者谁, 琵琶声停欲语迟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "移船相近邀相见, 添酒回灯重开宴.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "千呼万唤始出来, 犹抱琵琶半遮面.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "转轴拨弦三两声, 未成曲调先有情.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "弦弦掩抑声声思, 似诉平生不得志.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "低眉信手续续弹, 说尽心中无限事.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "轻拢慢捻抹复挑, 初为《霓裳》后《六幺》.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "大弦嘈嘈如急雨, 小弦切切如私语.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "嘈嘈切切错杂弹, 大珠小珠落玉盘.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "间关莺语花底滑, 幽咽泉流冰下难.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "冰泉冷涩弦凝绝, 凝绝不通声暂歇.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "别有幽愁暗恨生, 此时无声胜有声.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "银瓶乍破水浆迸, 铁骑突出刀枪鸣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曲终收拨当心画, 四弦一声如裂帛.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "东船西舫悄无言, 唯见江心秋月白.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "沉吟放拨插弦中, 整顿衣裳起敛容.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自言本是京城女, 家在虾蟆陵下住.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "十三学得琵琶成, 名属教坊第一部.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曲罢曾教善才服, 妆成每被秋娘妒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "五陵年少争缠头, 一曲红绡不知数.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "钿头银篦击节碎, 血色罗裙翻酒污.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今年欢笑复明年, 秋月春风等闲度.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "弟走从军阿姨死, 暮去朝来颜色故.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "门前冷落鞍马稀, 老大嫁作商人妇.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "商人重利轻别离, 前月浮梁买茶去.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "去来江口守空船, 绕船月明江水寒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "夜深忽梦少年事, 梦啼妆泪红阑干.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "我闻琵琶已叹息, 又闻此语重唧唧.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "同是天涯沦落人, 相逢何必曾相识!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "我从去年辞帝京, 谪居卧病浔阳城.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "浔阳地僻无音乐, 终岁不闻丝竹声.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "住近湓江地低湿, 黄芦苦竹绕宅生.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其间旦暮闻何物? 杜鹃啼血猿哀鸣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "春江花朝秋月夜, 往往取酒还独倾.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂无山歌与村笛, 呕哑嘲哳难为听.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今夜闻君琵琶语, 如听仙乐耳暂明.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "莫辞更坐弹一曲, 为君翻作《琵琶行》.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "感我此言良久立, 却坐促弦弦转急.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "凄凄不似向前声, 满座重闻皆掩泣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "座中泣下谁最多? 江州司马青衫湿.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登岳阳楼": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "昔闻洞庭水, 今上岳阳楼.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吴楚东南坼, 乾坤日夜浮.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "亲朋无一字, 老病有孤舟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "戎马关山北, 凭轩涕泗流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登快阁": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "痴儿了却公家事, 快阁东西倚晚晴.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "落木千山天远大, 澄江一道月分明.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "朱弦已为佳人绝, 青眼聊因美酒横.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "万里归船弄长笛, 此心吾与白鸥盟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登泰山记": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "泰山之阳, 汶水西流; 其阴, 济水东流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "阳谷皆入汶, 阴谷皆入济.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "当其南北分者, 古长城也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "最高日观峰, 在长城南十五里.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是月丁未, 与知府朱孝纯子颍由南麓登.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "四十五里, 道皆砌石为磴, 其级七千有余.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "泰山正南面有三谷.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "中谷绕泰安城下, 郦道元所谓环水也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "古时登山, 循东谷入, 道有天门.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "东谷者, 古谓之天门溪水, 余所不至也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今所经中岭及山巅, 崖限当道者, 世皆谓之天门云.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "道中迷雾冰滑, 磴几不可登.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "及既上, 苍山负雪, 明烛天南.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "戊申晦, 五鼓, 与子颍坐日观亭, 待日出.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "大风扬积雪击面.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "亭东自足下皆云漫.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "稍见云中白若樗蒱数十立者, 山也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "极天云一线异色, 须臾成五采.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "日上, 正赤如丹, 下有红光动摇承之.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "或曰, 此东海也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "亭西有岱祠, 又有碧霞元君祠.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "皇帝行宫在碧霞元君祠东.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "僻不当道者, 皆不及往.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "山多石, 少土.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "石苍黑色, 多平方, 少圜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "少杂树, 多松, 生石罅, 皆平顶.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "冰雪, 无瀑水, 无鸟兽音迹.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "至日观数里内无树, 而雪与人膝齐.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "桐城姚鼐记.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "登高": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "风急天高猿啸哀, 渚清沙白鸟飞回.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "无边落木萧萧下, 不尽长江滚滚来.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "万里悲秋常作客, 百年多病独登台.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "艰难苦恨繁霜鬓, 潦倒新停浊酒杯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "短歌行": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "对酒当歌, 人生几何!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "譬如朝露, 去日苦多.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "慨当以慷, 忧思难忘.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "何以解忧? 唯有杜康.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "青青子衿, 悠悠我心.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "但为君故, 沉吟至今.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "呦呦鹿鸣, 食野之苹.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "我有嘉宾, 鼓瑟吹笙.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "明明如月, 何时可掇?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "忧从中来, 不可断绝.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "越陌度阡, 枉用相存.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "契阔谈讌, 心念旧恩.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "月明星稀, 乌鹊南飞.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "绕树三匝, 何枝可依?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "山不厌高, 海不厌深.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "周公吐哺, 天下归心.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "石钟山记": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "《水经》云:\"彭蠡之口有石钟山焉\"": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是说也, 人常疑之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "至唐李渤始访其遗踪, 得双石于潭上": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自以为得之矣": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然是说也, 余尤疑之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "石之铿然有声者, 所在皆是也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而此独以钟名, 何哉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "元丰七年六月丁丑, 余自齐安舟行适临汝": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而长子迈将赴饶之德兴尉, 送之至湖口": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "因得观所谓石钟者": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余固笑而不信也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "至暮夜月明, 独与迈乘小舟, 至绝壁下": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "大石侧立千尺, 如猛兽奇鬼, 森然欲搏人": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而山上栖鹘, 闻人声亦惊起, 磔磔云霄间": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "又有若老人咳且笑于山谷中者, 或曰此鹳鹤也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余方心动欲还, 而大声发于水上": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "噌吰如钟鼓不绝": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舟人大恐": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "徐而察之, 则山下皆石穴罅": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不知其浅深, 微波入焉, 涵澹澎湃而为此也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舟回至两山间, 将入港口, 有大石当中流": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "可坐百人, 空中而多窍": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "与风水相吞吐, 有窾坎镗鞳之声": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "与向之噌吰者相应, 如乐作焉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "因笑谓迈曰:\"汝识之乎\"": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "噌吰者, 周景王之无射也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "窾坎镗鞳者, 魏庄子之歌钟也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "古之人不余欺也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "事不目见耳闻, 而臆断其有无, 可乎": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "郦元之所见闻殆与余同, 而言之不详": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "士大夫终不肯以小舟夜泊绝壁之下": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故莫能知": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而渔工水师虽知而不能言": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此世所以不传也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而陋者乃以斧斤考击而求之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自以为得其实": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余是以记之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盖叹郦元之简, 而笑李渤之陋也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "离骚": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "帝高阳之苗裔兮, 朕皇考曰伯庸.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "摄提贞于孟陬兮, 惟庚寅吾以降.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "皇览揆余初度兮, 肇锡余以嘉名.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "名余曰正则兮, 字余曰灵均.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "纷吾既有此内美兮, 又重之以修能.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "扈江离与辟芷兮, 纫秋兰以为佩.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "汩余若将不及兮, 恐年岁之不吾与.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "朝搴阰之木兰兮, 夕揽洲之宿莽.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "日月忽其不淹兮, 春与秋其代序.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "惟草木之零落兮, 恐美人之迟暮.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不抚壮而弃秽兮, 何不改此度?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乘骐骥以驰骋兮, 来吾道夫先路!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "长太息以掩涕兮, 哀民生之多艰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余虽好修姱以鞿羁兮, 謇朝谇而夕替.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "既替余以蕙纕兮, 又申之以揽茝.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "亦余心之所善兮, 虽九死其犹未悔.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "怨灵修之浩荡兮, 终不察夫民心.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "众女嫉余之蛾眉兮, 谣诼谓余以善淫.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "固时俗之工巧兮, 偭规矩而改错.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "背绳墨以追曲兮, 竞周容以为度.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "忳郁邑余侘傺兮, 吾独穷困乎此时也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "宁溘死以流亡兮, 余不忍为此态也!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鸷鸟之不群兮, 自前世而固然.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "何方圜之能周兮, 夫孰异道而相安?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "屈心而抑志兮, 忍尤而攘诟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "伏清白以死直兮, 固前圣之所厚.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "悔相道之不察兮, 延伫乎吾将反.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "回朕车以复路兮, 及行迷之未远.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "步余马于兰皋兮, 驰椒丘且焉止息.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "进不入以离尤兮, 退将复修吾初服.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "制芰荷以为衣兮, 集芙蓉以为裳.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不吾知其亦已兮, 苟余情其信芳.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "高余冠之岌岌兮, 长余佩之陆离.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "芳与泽其杂糅兮, 唯昭质其犹亏.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "忽反顾以游目兮, 将往观乎四荒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "佩缤纷其繁饰兮, 芳菲菲其弥章.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "民生各有所乐兮, 余独好修以为常.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虽体解吾犹未变兮, 岂余心之可惩?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "种树郭橐驼传": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "郭橐驼, 不知始何名.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "驼闻之, 曰:'甚善.名我固当.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "因舍其名, 亦自谓橐驼云.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其乡曰丰乐乡, 在长安西.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "他植者虽窥伺效慕, 莫能如也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "既然已, 勿动勿虑, 去不复顾.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其莳也若子, 其置也若弃, 则其天者全而其性得矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾又何能为哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问者曰:'以子之道, 移之官理, 可乎?'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "驼曰:'我知种树而已, 官理, 非吾业也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "'鸣鼓而聚之, 击木而召之.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故病且怠.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "若是, 则与吾业者其亦有类乎?'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "传其事以为官戒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "答司马谏议书": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "辟邪说, 难壬人, 不为拒谏.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "至于怨诽之多, 则固前知其如此也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "如曰今日当一切不事事, 守前所为而已, 则非某之所敢知.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "无由会晤, 不任区区向往之至!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "苏幕遮·燎沉香": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "燎沉香, 消溽暑": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鸟雀呼晴, 侵晓窥檐语": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "叶上初阳干宿雨, 水面清圆, 一一风荷举": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "故乡遥, 何日去?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "家住吴门, 久作长安旅": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "五月渔郎相忆否?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "小楫轻舟, 梦入芙蓉浦": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "菩萨蛮·书江西造口壁": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "郁孤台下清江水, 中间多少行人泪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "西北望长安, 可怜无数山.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "青山遮不住, 毕竟东流去.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "江晚正愁余, 山深闻鹧鸪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "菩萨蛮·小山重叠金明灭": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鬓云欲度香腮雪": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "懒起画蛾眉, 弄妆梳洗迟": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "照花前后镜, 花面交相映": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "新帖绣罗襦, 双双金鹧鸪": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虞美人": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "春花秋月何时了, 往事知多少.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "小楼昨夜又东风, 故国不堪回首月明中.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "雕阑玉砌应犹在, 只是朱颜改.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问君能有几多愁, 恰是一江春水向东流.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蜀相": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "丞相祠堂何处寻? 锦官城外柏森森.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "映阶碧草自春色, 隔叶黄鹂空好音.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "三顾频烦天下计, 两朝开济老臣心.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "出师未捷身先死, 长使英雄泪满襟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蜀道难": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "噫吁嚱, 危乎高哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蜀道之难, 难于上青天!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蚕丛及鱼凫, 开国何茫然!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "尔来四万八千岁, 不与秦塞通人烟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "西当太白有鸟道, 可以横绝峨眉巅.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "地崩山摧壮士死, 然后天梯石栈相钩连.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "上有六龙回日之高标, 下有冲波逆折之回川.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "黄鹤之飞尚不得过, 猿猱欲度愁攀援.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "青泥何盘盘, 百步九折萦岩峦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "扪参历井仰胁息, 以手抚膺坐长叹.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问君西游何时还? 畏途巉岩不可攀.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "但见悲鸟号古木, 雄飞雌从绕林间.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "又闻子规啼夜月, 愁空山.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蜀道之难, 难于上青天, 使人听此凋朱颜!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "连峰去天不盈尺, 枯松倒挂倚绝壁.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "飞湍瀑流争喧豗, 砯崖转石万壑雷.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其险也如此, 嗟尔远道之人胡为乎来哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "所守或匪亲, 化为狼与豺.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "锦城虽云乐, 不如早还家.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蜀道之难, 难于上青天, 侧身西望长咨嗟!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "论语·侍坐": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "子路、曾皙、冉有、公西华侍坐": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "夫子哂之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "求! 尔何如?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "赤! 尔何如?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "点! 尔何如?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "子曰: 何伤乎? 亦各言其志也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "夫子喟然叹曰: 吾与点也!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "子曰: 亦各言其志也已矣": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曰: 夫子何哂由也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "曰: 为国以礼, 其言不让, 是故哂之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "唯求则非邦也与?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "安见方六七十如五六十而非邦也者?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "唯赤则非邦也与?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "论语·学而八佾": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人而不仁, 如礼何? 人而不仁, 如乐何?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "朝闻道, 夕死可矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君子喻于义, 小人喻于利.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "见贤思齐焉, 见不贤而内自省也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "质胜文则野, 文胜质则史. 文质彬彬, 然后君子.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "知者不惑, 仁者不忧, 勇者不惧.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "有一言而可以终身行之者乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其'恕'乎! 己所不欲, 勿施于人.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谏太宗十思疏": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "有善始者实繁, 能克终者盖寡.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "竭诚则胡越为一体, 傲物则骨肉为行路.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "贺新郎·国脉微如缕": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "国脉微如缕": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "问长缨何时入手, 缚将戎主?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "未必人间无好汉, 谁与宽些尺度?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "试看取当年韩五": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "岂有谷城公付授, 也不干曾遇骊山母": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谈笑起, 两河路": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "少时棋柝曾联句": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "叹而今登楼揽镜, 事机频误": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "闻说北风吹面急, 边上冲梯屡舞": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君莫道投鞭虚语": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自古一贤能制难, 有金汤便可无张许?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "快投笔, 莫题柱": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "赤壁赋": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "清风徐来, 水波不兴": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "举酒属客, 诵明月之诗, 歌窈窕之章": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "少焉, 月出于东山之上, 徘徊于斗牛之间": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "白露横江, 水光接天": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "纵一苇之所如, 凌万顷之茫然": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "浩浩乎如冯虚御风, 而不知其所止": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "飘飘乎如遗世独立, 羽化而登仙": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "于是饮酒乐甚, 扣舷而歌之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "歌曰: '桂棹兮兰桨, 击空明兮溯流光'": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "渺渺兮予怀, 望美人兮天一方": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "客有吹洞箫者, 倚歌而和之": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其声呜呜然, 如怨如慕, 如泣如诉": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余音袅袅, 不绝如缕": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舞幽壑之潜蛟, 泣孤舟之嫠妇": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "苏子愀然, 正襟危坐而问客曰": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "何为其然也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "西望夏口, 东望武昌, 山川相缪, 郁乎苍苍": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此非孟德之困于周郎者乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "方其破荆州, 下江陵, 顺流而东也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "舳舻千里, 旌旗蔽空": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "酾酒临江, 横槊赋诗": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "固一世之雄也, 而今安在哉?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "驾一叶之扁舟, 举匏樽以相属": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "寄蜉蝣于天地, 渺沧海之一粟": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "哀吾生之须臾, 羡长江之无穷": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "挟飞仙以遨游, 抱明月而长终": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "知不可乎骤得, 托遗响于悲风": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "苏子曰: '客亦知夫水与月乎?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "逝者如斯, 而未尝往也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盈虚者如彼, 而卒莫消长也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盖将自其变者而观之, 则天地曾不能以一瞬": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自其不变者而观之, 则物与我皆无尽也": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而又何羡乎!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "且夫天地之间, 物各有主": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "苟非吾之所有, 虽一毫而莫取": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "惟江上之清风, 与山间之明月": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "耳得之而为声, 目遇之而成色": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "取之无禁, 用之不竭": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "是造物者之无尽藏也, 而吾与子之所共适": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "客喜而笑, 洗盏更酌": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "肴核既尽, 杯盘狼籍": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "相与枕藉乎舟中, 不知东方之既白": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "过秦论": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "秦孝公据崤函之固, 拥雍州之地,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "君臣固守以窥周室,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "当是时也, 商君佐之,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "内立法度, 务耕织, 修守战之具,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "外连衡而斗诸侯.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "于是秦人拱手而取西河之外.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "孝公既没, 惠文、武、昭襄蒙故业, 因遗策,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "诸侯恐惧, 会盟而谋弱秦,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "不爱珍器重宝肥饶之地, 以致天下之士,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "合从缔交, 相与为一.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "尝以十倍之地, 百万之众, 叩关而攻秦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "秦人开关延敌, 九国之师, 逡巡而不敢进.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "秦无亡矢遗镞之费, 而天下诸侯已困矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "于是从散约败, 争割地而赂秦.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "因利乘便, 宰割天下, 分裂山河.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "强国请服, 弱国入朝.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "延及孝文王、庄襄王, 享国之日浅, 国家无事.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "及至始皇, 奋六世之余烈, 振长策而御宇内,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吞二周而亡诸侯, 履至尊而制六合,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "执敲扑而鞭笞天下, 威振四海.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "南取百越之地, 以为桂林、象郡; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "百越之君, 俯首系颈, 委命下吏.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "胡人不敢南下而牧马, 士不敢弯弓而报怨.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "于是废先王之道, 焚百家之言, 以愚黔首; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "隳名城, 杀豪杰; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然后践华为城, 因河为池,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "据亿丈之城, 临不测之渊, 以为固.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "良将劲弩守要害之处, 信臣精卒陈利兵而谁何.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "始皇既没, 余威震于殊俗.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蹑足行伍之间, 而倔起阡陌之中,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "率疲弊之卒, 将数百之众, 转而攻秦; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "斩木为兵, 揭竿为旗,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "天下云集响应, 赢粮而景从.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "山东豪俊遂并起而亡秦族矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "且夫天下非小弱也, 雍州之地, 崤函之固, 自若也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "锄櫌棘矜, 非铦于钩戟长铩也; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谪戍之众, 非抗于九国之师也; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "深谋远虑, 行军用兵之道, 非及乡时之士也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然而成败异变, 功业相反, 何也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "试使山东之国与陈涉度长絜大, 比权量力,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "则不可同年而语矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然后以六合为家, 崤函为宫; ": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "仁义不施而攻守之势异也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "锦瑟": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "锦瑟无端五十弦, 一弦一柱思华年.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "庄生晓梦迷蝴蝶, 望帝春心托杜鹃.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "沧海月明珠有泪, 蓝田日暖玉生烟.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此情可待成追忆, 只是当时已惘然.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "长亭送别": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "碧云天, 黄花地, 西风紧, 北雁南飞.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "晓来谁染霜林醉? 总是离人泪.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "阿房宫赋": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "六王毕, 四海一, 蜀山兀, 阿房出.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "覆压三百余里, 隔离天日.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "骊山北构而西折, 直走咸阳.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "二川溶溶, 流入宫墙.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "长桥卧波, 未云何龙?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "复道行空, 不霁何虹?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "高低冥迷, 不知西东.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "一日之内, 一宫之间, 而气候不齐.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "明星荧荧, 开妆镜也;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "绿云扰扰, 梳晓鬟也;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "渭流涨腻, 弃脂水也;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "烟斜雾横, 焚椒兰也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "一肌一容, 尽态极妍, 缦立远视, 而望幸焉.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "有不得见者, 三十六年.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "使负栋之柱, 多于南亩之农夫;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "架梁之椽, 多于机上之工女;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "钉头磷磷, 多于在庾之粟粒;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "瓦缝参差, 多于周身之帛缕;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "直栏横槛, 多于九土之城郭;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "管弦呕哑, 多于市人之言语.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "使天下之人, 不敢言而敢怒.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "独夫之心, 日益骄固.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "戍卒叫, 函谷举, 楚人一炬, 可怜焦土!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "灭六国者六国也, 非秦也; 族秦者秦也, 非天下也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "嗟乎! 使六国各爱其人, 则足以拒秦;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "使秦复爱六国之人, 则递三世可至万世而为君,": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "谁得而族灭也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "秦人不暇自哀, 而后人哀之;": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "后人哀之而不鉴之, 亦使后人而复哀后人也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "陈情表": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣密言: 臣以险衅, 夙遭闵凶.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "生孩六月, 慈父见背; 行年四岁, 舅夺母志.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "祖母刘愍臣孤弱, 躬亲抚养.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣少多疾病, 九岁不行, 零丁孤苦, 至于成立.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "逮奉圣朝, 沐浴清化.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣以供养无主, 辞不赴命.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "猥以微贱, 当侍东宫, 非臣陨首所能上报.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣具以表闻, 辞不就职.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣之进退, 实为狼狈.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣无祖母, 无以至今日, 祖母无臣, 无以终余年.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "母孙二人, 更相为命, 是以区区不能废远.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "乌鸟私情, 愿乞终养.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣生当陨首, 死当结草.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "臣不胜犬马怖惧之情, 谨拜表以闻.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "青玉案·元夕": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "东风夜放花千树, 更吹落、星如雨": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "宝马雕车香满路": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "凤箫声动, 玉壶光转, 一夜鱼龙舞": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蛾儿雪柳黄金缕, 笑语盈盈暗香去": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "众里寻他千百度": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "蓦然回首, 那人却在, 灯火阑珊处": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "静女": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "静女其娈, 贻我彤管. 彤管有炜, 说怿女美.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "自牧归荑, 洵美且异. 匪女之为美, 美人之贻.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "项脊轩志": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "项脊轩, 旧南阁子也.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "室仅方丈, 可容一人居.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "又北向, 不能得日, 日过午已昏.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余稍为修葺, 使不上漏.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "然余居于此, 多可喜, 亦多可悲.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "先是庭中通南北为一.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "迨诸父异爨, 内外多置小门墙, 往往而是.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "东犬西吠, 客逾庖而宴, 鸡栖于厅.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "庭中始为篱, 已为墙, 凡再变矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "家有老妪, 尝居于此.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "妪, 先大母婢也, 乳二世, 先妣抚之甚厚.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "室西连于中闺, 先妣尝一至.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余自束发读书轩中, 一日, 大母过余曰:": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "比去, 以手阖门, 自语曰:": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾家读书久不效, 儿之成, 则可待乎!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "顷之, 持一象笏至, 曰:": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "此吾祖太常公宣德间执此以朝, 他日汝当用之!": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "瞻顾遗迹, 如在昨日, 令人长号不自禁.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余扃牖而居, 久之, 能以足音辨人.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "轩凡四遭火, 得不焚, 殆有神护者.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "吾妻归宁, 述诸小妹语曰:": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "闻姊家有阁子, 且何谓阁子也?": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "其后六年, 吾妻死, 室坏不修.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "鹊桥仙": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "纤云弄巧, 飞星传恨, 银汉迢迢暗度.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "金风玉露一相逢, 便胜却人间无数.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "柔情似水, 佳期如梦, 忍顾鹊桥归路.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + }, + "两情若是久长时, 又岂在朝朝暮暮.": { + "NSP-0": { + "real_rept": 0, + "important": 0, + "rept": 0, + "interval": 0, + "last_date": 0, + "next_date": 0, + "is_activated": 0, + "last_modify": 1777751808.8809566 + } + } +} \ No newline at end of file diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index 942f389..a68b5e7 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -20,4 +20,4 @@ python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index daa983d..10bc1b8 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -13,3 +13,13 @@ NavigatorScreen { border: thick $background 80%; background: $surface; } + +.favorite-item { + height: auto; +} + +.favorite-item-btn { + dock: right; + width: 8; + padding: 0; +} \ No newline at end of file diff --git a/src/heurams/interface/css/screens/memoqueue.tcss b/src/heurams/interface/css/screens/memoqueue.tcss index 24d31ec..aeea0e0 100644 --- a/src/heurams/interface/css/screens/memoqueue.tcss +++ b/src/heurams/interface/css/screens/memoqueue.tcss @@ -1,4 +1,8 @@ #puzzle_container > * { height: auto; width: auto; +} + +.hori { + height: auto; } \ No newline at end of file diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index bb6fcbf..e201189 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -60,12 +60,12 @@ API 版本代号: `{version.codename.capitalize()}` 一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. 一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. -以 AGPL-3.0 开放源代码, 这直接意味着任何个体直接基于此代码对外或内部提供的应用和服务, 无论本地或网络, 必须向所有用户公开完整修改后的源代码, 且继续沿用 AGPL-3.0 协议. - -您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为第一个全功能前端实现与程序库测试套件, 位于程序库根目录中的 interface 文件夹. +您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为第一个全功能前端实现与程序库测试套件, 位于程序库下 interface 目录. 您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新. +以 GNU Affero 通用公共许可证 (第3版) 开放源代码. + 如果您觉得这个软件有用, 可以考虑参与贡献, 或在它的源代码仓库给它添加一个星标 :) 您的慷慨支持, 我们必当涌泉相报. @@ -90,7 +90,7 @@ Textual 框架版本: {textual_version} 操作系统版本: {os_version} 存储余量: {disk_usage} 内存大小: {memory_info} - + 报告问题时, 请复制这些信息到问题描述, 并上传软件日志 `heurams.log` 作为附件, 以协助开发者定位错误 """ yield Markdown(about_text, classes="about-markdown") diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index 55636a2..86e3733 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -7,7 +7,7 @@ from typing import List, Optional from textual import events, on from textual.app import ComposeResult -from textual.containers import ScrollableContainer +from textual.containers import ScrollableContainer, Horizontal from textual.screen import Screen from textual.widgets import ( Button, @@ -104,23 +104,20 @@ class FavoriteManagerScreen(Screen): # 尝试获取仓库信息 repo_info = self._get_repo_info(fav.repo_path, fav) title = repo_info.get("title", fav.repo_path) if repo_info else fav.repo_path - content_preview = repo_info.get("content_preview", "") if repo_info else "" added_time = self._format_time(fav.added) # 构建显示文本 - display_text = f"[b]{title}[/b] ({fav.ident})\n" - if content_preview: - display_text += f"{content_preview}\n" - display_text += f"添加于: {added_time}" + display_text = f"{fav.ident}\n" + display_text += f" [d]添加于: {added_time}\n 来自 {title}[/d]" if fav.tags: - display_text += f" 标签: {', '.join(fav.tags)}" + display_text += f"{', '.join(fav.tags)}" # 创建安全的按钮 ID button_key = self._encode_favorite_key(fav.repo_path, fav.ident) # 创建列表项,包含移除按钮 - container = ScrollableContainer( - Markdown(display_text, classes="favorite-content"), - Button("移除", id=f"remove-{button_key}", variant="error"), + container = Horizontal( + Label(display_text, classes="favorite-content"), + Button("移除", id=f"remove-{button_key}", variant="error", flat=True, classes="favorite-item-btn"), classes="favorite-item", ) return ListItem(container) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index b821834..c8fd983 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -24,12 +24,13 @@ logger = get_logger(__name__) class MemScreen(Screen): BINDINGS = [ - ("q", "go_back", "返回"), + ("q", "go_back_notif", "返回"), ("p", "prev", "查看上一个"), ("d", "toggle_dark", ""), ("v", "play_voice", "朗读"), ("*", "toggle_favorite", "收藏"), ("r", "resume_mark"), + ("Q", "go_back"), ("n", "block_prompt"), ("s", "block_prompt"), ("z", "block_prompt"), @@ -220,6 +221,8 @@ class MemScreen(Screen): self.update_state() # 刷新状态 self.expander = self.procession.get_expander() + def action_go_back_notif(self): + self.notify("确定吗? 按下大写 Q 以返回") def action_go_back(self): self.app.pop_screen() diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index 12a1f41..c75ad5b 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -2,7 +2,7 @@ import copy import random from typing import TypedDict -from textual.containers import ScrollableContainer +from textual.containers import ScrollableContainer, Horizontal from textual.widget import Widget from textual.widgets import Button, Label, Markdown from textual.events import Key @@ -71,6 +71,7 @@ class ClozePuzzle(BasePuzzleWidget): # 渲染当前问题的选项 with ScrollableContainer(id="btn-container") as s: c = 0 + btns = [] for i in self.ans: h = str(hash(i)) if hash(i) in self.hashmap.keys(): @@ -80,7 +81,12 @@ class ClozePuzzle(BasePuzzleWidget): btnid = f"sel000-{h}" logger.debug(f"建立按钮 {btnid}") self.btn_shortcuts[f"{c}"] = btnid - yield Button(f"[{c}] {i}", id=f"{btnid}") + btns.append(Button(f"{i}", id=f"{btnid}", classes='cloze-option-btn')) + for i in range((len(btns)+1)//2): + if 2 * i + 1 + 1 <= len(btns): + yield Horizontal(btns[i], btns[len(btns) - 1 - i], classes='hori') + else: + yield btns[i] s.focus() yield Button("退格", id="delete") @@ -130,7 +136,7 @@ class ClozePuzzle(BasePuzzleWidget): self.atom.minimize(rating) def on_key(self, event: Key) -> None: - self.notify(event.key) + #self.notify(event.key) if event.key in self.btn_shortcuts: btn_id = self.btn_shortcuts.get(event.key) btn_id = "#" + btn_id diff --git a/src/heurams/kernel/algorithms/nsp0.py b/src/heurams/kernel/algorithms/nsp0.py index 45557d2..cf8933a 100644 --- a/src/heurams/kernel/algorithms/nsp0.py +++ b/src/heurams/kernel/algorithms/nsp0.py @@ -54,9 +54,10 @@ class NSP0Algorithm(BaseAlgorithm): logger.debug("feedback 为 -1, 跳过更新") return algodata[cls.algo_name]["interval"] = 1 if feedback <= 3 else float("inf") - algodata[cls.algo_name]["important"] = ( - 1 if feedback <= 3 else algodata[cls.algo_name]["important"] - ) + if not algodata[cls.algo_name]["important"]: + algodata[cls.algo_name]["important"] = ( + 1 if feedback <= 3 else algodata[cls.algo_name]["important"] + ) algodata[cls.algo_name]["last_date"] = timer.get_daystamp() algodata[cls.algo_name]["next_date"] = ( timer.get_daystamp() + algodata[cls.algo_name]["interval"] From ca86b2d8e9c3f93ec6d84bd65ab19251ab21c6b1 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 4 May 2026 13:55:57 +0800 Subject: [PATCH 65/79] =?UTF-8?q?feat:=20=E4=BD=BF=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E8=83=BD=E8=A2=AB=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 4 +- README.md | 76 ++++++++----------- data/config/services/audio.toml | 2 +- pyproject.toml | 20 ++--- requirements.txt | 1 - src/heurams/__main__.py | 4 +- src/heurams/kernel/algorithms/__init__.py | 29 +++----- src/heurams/kernel/algorithms/base.py | 9 +++ src/heurams/kernel/algorithms/nsp0.py | 2 +- src/heurams/kernel/algorithms/sm2.py | 2 +- uv.lock | 91 ++++++++++------------- 11 files changed, 101 insertions(+), 139 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c676379..4477447 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,7 +70,7 @@ uv sync --all-extras # 同步开发运行环境 uv run heurams # 验证包安装 -uv run tui # 启动 TUI +uv run heurams-tui # 启动 TUI # 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不便支持 uv 与硬链接的环境和文件系统(例如 termux)运行 HeurAMS) @@ -79,7 +79,7 @@ python3 -m pip install -r requirements.txt python3 -m pip install -e . python3 -m heurams # 验证安装 -python3 -m heurams.__interface__ # 启动 TUI +python3 -m heurams.interface # 启动 TUI ``` ## 许可证与外部引用 diff --git a/README.md b/README.md index c263eff..1cd9925 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,14 @@ ## 项目结构 -这个仓库是 "潜进" 的核心程序库在 python 语言下的实现 +此仓库为 "潜进" 的核心程序库在 python 语言下的实现 包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) 除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 > [!NOTE] > 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 -> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 -> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 +> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 ## 特性 @@ -57,19 +57,22 @@ 潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本. +#### 稳定版本 + +``` +python -m pip install heurams[basic] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装适用于用户体验的可选依赖(推荐) +``` +``` +python -m pip install heurams[audio-playsound] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装适用于一般计算机的通用音频模块(不适用于 termux, termux 的音频支持是内建的) +``` + +#### 开发版本 + > [!CAUTION] > 对于部分 Linux 发行版和 Android Termux 用户: > 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖 > 例如在 termux 上先运行 `pkg install cmake clang libzmq` -> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器 - -#### 稳定版本 - -``` -python -m pip install heurams[all] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装全部可选依赖(推荐) -``` - -#### 开发版本 +> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器 ``` python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ # 安装全部可选依赖(推荐) @@ -79,34 +82,21 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ 由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面提供的命令会安装所有可选依赖, 以下是依赖组列表 -- 基础依赖: (只能驱动程序库) - - tabulate: 终端表格生成 - - toml: TOML 文件加载 - - transitions: 状态机依赖 -- `interface` 依赖组: (基本用户界面依赖) - - textual: 终端用户界面 - - psutil: 获取系统信息 -- `algo-fsrs` 依赖组: - - py-fsrs: FSRS 算法模块需要 -- `tts-edgetts` 依赖组: - - edge-tts:微软文本转语音 -- `misc-jieba` 依赖组: - - jieba: 中文智能分词所需 -- `llm-openai` 依赖组: - - openai: OpenAI API 所需 -- `audio-playsound` 依赖组: - - playsound: 通用音频播放 - - pygobject: playsound 依赖 -- `dev` 依赖组: - - zmq: 远程调试服务器所需 - - pytest: 测试所需 - - pytest-cov: 测试所需 -- `all` 依赖组: - - 包含以上所有依赖 +| 依赖组 | 包含模块 | 说明 | +|--------|----------|------| +| 最小化安装 | tabulate, toml, transitions | 核心驱动程序库,始终必需 | +| interface | textual, psutil | 基本用户界面依赖 | +| algo-fsrs | py-fsrs | FSRS 算法模块 | +| tts-edgetts | edge-tts | 微软文本转语音 | +| llm | openai | OpenAI API 调用 | +| audio-playsound | playsound, pygobject | 通用音频播放及依赖 | +| dev | zmq, pytest, pytest-cov | 开发调试与测试工具 | +| basic | [tts-edgetts], [llm-openai], [algo-fsrs] | 适用于用户体验的较轻依赖组(推荐) | +| all | 以上所有依赖 | 完整安装组 | ### 从源码安装 -我们提供原生 python 和 uv 两种安装方式.\ +我们提供原生 python 和 uv 两种安装方式. 详见[贡献指南](CONTRIBUTING.md). ## 项目结构 @@ -115,7 +105,8 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ## 参与项目 -欢迎参与到项目协作中! 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解贡献指南. +欢迎参与到项目协作中! +请参阅[贡献指南](CONTRIBUTING.md). ## 许可证 @@ -128,15 +119,6 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ 项目在 `src/heurams/vendor/` 目录下嵌入或在其他位置间接使用了以下第三方代码(可能有修改): -#### py-fsrs (open-spaced-repetition) - -- 上游版本: 6.3.1 -- 引用方式: vendor -- 位置: `src/heurams/vendor/pyfsrs/` -- 原项目: [py-fsrs](https://github.com/open-spaced-repetition/py-fsrs) -- 原版权: Copyright (c) 2026 Open Spaced Repetition Contributors -- 原许可证: MIT License - #### SM.js (slaypni) - 上游版本: commit `6e3bb4afaf484426deb4a9fa3bcffe42ac066b45` (2015年2月4日上游已停止维护) diff --git a/data/config/services/audio.toml b/data/config/services/audio.toml index ac42f77..abf97a9 100644 --- a/data/config/services/audio.toml +++ b/data/config/services/audio.toml @@ -2,7 +2,7 @@ provider = "playsound" _provider_desc = "音频驱动类型" [_provider_candidate] -playsound = "python 跨平台音频系统" +playsound = "Python 桌面跨平台音频系统, 使用了 playsound3 替代了老旧的 playsound" termux = "Android Termux 音频系统" mpg123 = "通用音频系统, 依赖系统 mpg123" pulseaudio = "高级音频路由系统" diff --git a/pyproject.toml b/pyproject.toml index baaa567..b2b1f67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,29 +29,24 @@ algo-fsrs = [ tts-edgetts = [ "edge-tts>=7.2.8", # 微软 TTS ] -misc-jieba = [ - "jieba>=0.42.1", # 用于中文智能分词 -] -llm-openai = [ - "openai>=2.32.0", -] +llm = ["openai>=2.32.0"] audio-playsound = [ - "playsound==1.2.2", - "pygobject>=3.56.2", # playsound 依赖它 + "playsound3==3.3.1", + #"pygobject>=3.56.2", # playsound 依赖它 ] dev = [ # 调试所需依赖 - "zmq>=0.0.0", # 用于 ZMQ 远程调试服务器, 在 linux 上建议先安装 libzmq - "pytest>=8.0.0", # 用于普通测试 + "zmq>=0.0.0", # 用于 ZMQ 远程调试服务器, 在 linux 上建议先安装 libzmq + "pytest>=8.0.0", # 用于普通测试 "pytest-cov>=6.0.0", ] all = [ "heurams[algo-fsrs]", "heurams[tts-edgetts]", - "heurams[misc-jieba]", - "heurams[llm-openai]", + "heurams[llm]", "heurams[audio-playsound]", "heurams[dev]", ] +basic = ["heurams[algo-fsrs]", "heurams[tts-edgetts]", "heurams[llm]"] [project.urls] Homepage = "https://ams.pluv.top" @@ -59,7 +54,6 @@ Issues = "https://github.com/heurams/heurams/issues" [project.scripts] heurams = "heurams.__main__:main" -tui = "heurams.interface.__main__:main" heurams-tui = "heurams.interface.__main__:main" [tool.pytest.ini_options] diff --git a/requirements.txt b/requirements.txt index f172b4a..38e0d15 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ edge-tts==7.0.2 -jieba==0.42.1 openai==1.0.0 playsound==1.2.2 tabulate>=0.9.0 diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index a68b5e7..8c9c913 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -12,8 +12,8 @@ python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 尽管项目保留了 requirements.txt, 我们仍不推荐使用系统 python 和原始 venv 进行开发. 项目的推荐开发环境工具是 uv. 如果你的环境已经安装了 uv: - 先运行 uv sync 同步环境, 此命令只需要执行一遍, uv 会自动处理依赖. - 然后通过运行 uv run tui 启动内置基本用户界面. + 先运行 uv sync --all-extras 同步环境, 此命令只需要执行一遍, uv 会自动处理依赖. + 然后通过运行 uv run heurams-tui 启动内置基本用户界面. 此时您的解释器在项目目录里的 .venv/bin 中, 使用 IDE 开发前, 务必切换解释器! 注意: 一个常见的误区是, 执行 interface 下的 __main__.py 运行基本用户界面, 这会导致 Python 上下文环境异常, 请不要这样做.""" print(prompt) diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index 6461b06..7634458 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -1,21 +1,14 @@ +import importlib +import pkgutil +from pathlib import Path + from .base import BaseAlgorithm -from .sm2 import SM2Algorithm -from .sm15m import SM15MAlgorithm -from .nsp0 import NSP0Algorithm -from .fsrs import FSRSAlgorithm -__all__ = [ - "SM2Algorithm", - "BaseAlgorithm", - "SM15MAlgorithm", - "NSP0Algorithm", - "FSRSAlgorithm", -] +__path__ = [str(Path(__file__).parent)] -algorithms = { - "SM-2": SM2Algorithm, - "NSP-0": NSP0Algorithm, - "SM-15M": SM15MAlgorithm, - "FSRS": FSRSAlgorithm, - "Base": BaseAlgorithm, -} +for _finder, _name, _ispkg in pkgutil.iter_modules(__path__): + if _name == "base": + continue + importlib.import_module(f".{_name}", __package__) + +algorithms = BaseAlgorithm.get_registry() \ No newline at end of file diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index 85d184e..3960ae1 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -5,11 +5,20 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) +_registry: dict[str, type["BaseAlgorithm"]] = {} class BaseAlgorithm: algo_name = "BaseAlgorithm" desc = "算法基类" + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + _registry[cls.algo_name] = cls + + @classmethod + def get_registry(cls) -> dict[str, type["BaseAlgorithm"]]: + return dict(_registry) + class AlgodataDict(TypedDict): real_rept: int rept: int diff --git a/src/heurams/kernel/algorithms/nsp0.py b/src/heurams/kernel/algorithms/nsp0.py index cf8933a..6c4cacd 100644 --- a/src/heurams/kernel/algorithms/nsp0.py +++ b/src/heurams/kernel/algorithms/nsp0.py @@ -10,7 +10,7 @@ logger = get_logger(__name__) class NSP0Algorithm(BaseAlgorithm): algo_name = "NSP-0" - desc = "快速筛选用特殊调度器" + desc = "快速筛选用非间隔重复调度器" class AlgodataDict(TypedDict): real_rept: int diff --git a/src/heurams/kernel/algorithms/sm2.py b/src/heurams/kernel/algorithms/sm2.py index bb8d187..2c7a34f 100644 --- a/src/heurams/kernel/algorithms/sm2.py +++ b/src/heurams/kernel/algorithms/sm2.py @@ -10,7 +10,7 @@ logger = get_logger(__name__) class SM2Algorithm(BaseAlgorithm): algo_name = "SM-2" - desc = "经典间隔重复算法" + desc = "SuperMemo2 (1987) 简单间隔重复调度器" class AlgodataDict(TypedDict): efactor: float diff --git a/uv.lock b/uv.lock index 3c80a4d..3c5ba2d 100644 --- a/uv.lock +++ b/uv.lock @@ -450,17 +450,19 @@ algo-fsrs = [ all = [ { name = "edge-tts" }, { name = "fsrs" }, - { name = "jieba" }, { name = "openai" }, - { name = "playsound" }, - { name = "pygobject" }, + { name = "playsound3" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "zmq" }, ] audio-playsound = [ - { name = "playsound" }, - { name = "pygobject" }, + { name = "playsound3" }, +] +basic = [ + { name = "edge-tts" }, + { name = "fsrs" }, + { name = "openai" }, ] dev = [ { name = "pytest" }, @@ -471,12 +473,9 @@ interface = [ { name = "psutil" }, { name = "textual" }, ] -llm-openai = [ +llm = [ { name = "openai" }, ] -misc-jieba = [ - { name = "jieba" }, -] tts-edgetts = [ { name = "edge-tts" }, ] @@ -486,16 +485,16 @@ requires-dist = [ { name = "edge-tts", marker = "extra == 'tts-edgetts'", specifier = ">=7.2.8" }, { name = "fsrs", marker = "extra == 'algo-fsrs'", specifier = ">=6.3.1" }, { name = "heurams", extras = ["algo-fsrs"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["algo-fsrs"], marker = "extra == 'basic'" }, { name = "heurams", extras = ["audio-playsound"], marker = "extra == 'all'" }, { name = "heurams", extras = ["dev"], marker = "extra == 'all'" }, - { name = "heurams", extras = ["llm-openai"], marker = "extra == 'all'" }, - { name = "heurams", extras = ["misc-jieba"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["llm"], marker = "extra == 'all'" }, + { name = "heurams", extras = ["llm"], marker = "extra == 'basic'" }, { name = "heurams", extras = ["tts-edgetts"], marker = "extra == 'all'" }, - { name = "jieba", marker = "extra == 'misc-jieba'", specifier = ">=0.42.1" }, - { name = "openai", marker = "extra == 'llm-openai'", specifier = ">=2.32.0" }, - { name = "playsound", marker = "extra == 'audio-playsound'", specifier = "==1.2.2" }, + { name = "heurams", extras = ["tts-edgetts"], marker = "extra == 'basic'" }, + { name = "openai", marker = "extra == 'llm'", specifier = ">=2.32.0" }, + { name = "playsound3", marker = "extra == 'audio-playsound'", specifier = "==3.3.1" }, { name = "psutil", marker = "extra == 'interface'", specifier = ">=7.2.2" }, - { name = "pygobject", marker = "extra == 'audio-playsound'", specifier = ">=3.56.2" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "tabulate", specifier = ">=0.10.0" }, @@ -504,7 +503,7 @@ requires-dist = [ { name = "transitions", specifier = ">=0.9.3" }, { name = "zmq", marker = "extra == 'dev'", specifier = ">=0.0.0" }, ] -provides-extras = ["interface", "algo-fsrs", "tts-edgetts", "misc-jieba", "llm-openai", "audio-playsound", "dev", "all"] +provides-extras = ["interface", "algo-fsrs", "tts-edgetts", "llm", "audio-playsound", "dev", "all", "basic"] [[package]] name = "httpcore" @@ -552,12 +551,6 @@ wheels = [ { url = "https://mirrors.ustc.edu.cn/pypi/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "jieba" -version = "0.42.1" -source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/c6/cb/18eeb235f833b726522d7ebed54f2278ce28ba9438e3135ab0278d9792a2/jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2", size = 19214172, upload-time = "2020-01-20T14:27:23.5Z" } - [[package]] name = "jiter" version = "0.14.0" @@ -817,11 +810,15 @@ wheels = [ ] [[package]] -name = "playsound" -version = "1.2.2" +name = "playsound3" +version = "3.3.1" source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/6b/93/39f2296a69fe2c70dcc9b9724147ffc9d7f676f67eb3cbad3baa725ae32d/playsound3-3.3.1.tar.gz", hash = "sha256:3f0eb87d5ff2061d07663c4b010b8e7d66c274344712b01d561a0a73447ef41d", size = 608340, upload-time = "2026-01-22T18:05:55.444Z" } wheels = [ - { url = "https://mirrors.ustc.edu.cn/pypi/packages/f5/16/10d897b0a83fb4b05b03a63d7a2667ab75f857f67f7062fd447dd3f49bf7/playsound-1.2.2-py2.py3-none-any.whl", hash = "sha256:1e83750a5325cbccee03d6e751ba3e78c037ac95b95a3ba1f38d0c5aca9e1a34", size = 5960, upload-time = "2017-06-29T14:08:29.207Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/9d/8b97af915bd8a9e2b17b08bb9d62d45cce5c00a28a64b08324bb5895145b/playsound3-3.3.1-py3-none-any.whl", hash = "sha256:8e606115c3630762a7136579ceb25fbf725768a31f7d0bfc2883154d8c50205d", size = 9697, upload-time = "2026-01-22T18:05:53.783Z" }, ] [[package]] @@ -945,25 +942,6 @@ wheels = [ { url = "https://mirrors.ustc.edu.cn/pypi/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] -[[package]] -name = "pycairo" -version = "1.29.0" -source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } -wheels = [ - { url = "https://mirrors.ustc.edu.cn/pypi/packages/f6/28/6363087b9e60af031398a6ee5c248639eefc6cc742884fa2789411b1f73b/pycairo-1.29.0-cp312-cp312-win32.whl", hash = "sha256:91bcd7b5835764c616a615d9948a9afea29237b34d2ed013526807c3d79bb1d0", size = 751486, upload-time = "2025-11-11T19:11:54.451Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/3a/d2/d146f1dd4ef81007686ac52231dd8f15ad54cf0aa432adaefc825475f286/pycairo-1.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f01c3b5e49ef9411fff6bc7db1e765f542dc1c9cfed4542958a5afa3a8b8e76", size = 845383, upload-time = "2025-11-11T19:12:01.551Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/01/16/6e6f33bb79ec4a527c9e633915c16dc55a60be26b31118dbd0d5859e8c51/pycairo-1.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:eafe3d2076f3533535ad4a361fa0754e0ee66b90e548a3a0f558fed00b1248f2", size = 694518, upload-time = "2025-11-11T19:12:06.561Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/f0/21/3f477dc318dd4e84a5ae6301e67284199d7e5a2384f3063714041086b65d/pycairo-1.29.0-cp313-cp313-win32.whl", hash = "sha256:3eb382a4141591807073274522f7aecab9e8fa2f14feafd11ac03a13a58141d7", size = 750949, upload-time = "2025-11-11T19:12:12.198Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/43/34/7d27a333c558d6ac16dbc12a35061d389735e99e494ee4effa4ec6d99bed/pycairo-1.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:91114e4b3fbf4287c2b0788f83e1f566ce031bda49cf1c3c3c19c3e986e95c38", size = 844149, upload-time = "2025-11-11T19:12:19.171Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/15/43/e782131e23df69e5c8e631a016ed84f94bbc4981bf6411079f57af730a23/pycairo-1.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:09b7f69a5ff6881e151354ea092137b97b0b1f0b2ab4eb81c92a02cc4a08e335", size = 693595, upload-time = "2025-11-11T19:12:23.445Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/2d/fa/87eaeeb9d53344c769839d7b2854db7ff2cd596211e00dd1b702eeb1838f/pycairo-1.29.0-cp314-cp314-win32.whl", hash = "sha256:69e2a7968a3fbb839736257bae153f547bca787113cc8d21e9e08ca4526e0b6b", size = 767198, upload-time = "2025-11-11T19:12:42.336Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/3c/90/3564d0f64d0a00926ab863dc3c4a129b1065133128e96900772e1c4421f8/pycairo-1.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:e91243437a21cc4c67c401eff4433eadc45745275fa3ade1a0d877e50ffb90da", size = 871579, upload-time = "2025-11-11T19:12:48.982Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/5e/91/93632b6ba12ad69c61991e3208bde88486fdfc152be8cfdd13444e9bc650/pycairo-1.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:b72200ea0e5f73ae4c788cd2028a750062221385eb0e6d8f1ecc714d0b4fdf82", size = 719537, upload-time = "2025-11-11T19:12:55.016Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/93/23/37053c039f8d3b9b5017af9bc64d27b680c48a898d48b72e6d6583cf0155/pycairo-1.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5e45fce6185f553e79e4ef1722b8e98e6cde9900dbc48cb2637a9ccba86f627a", size = 874015, upload-time = "2025-11-11T19:12:28.47Z" }, - { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/54/123f6239685f5f3f2edc123f1e38d2eefacebee18cf3c532d2f4bd51d0ef/pycairo-1.29.0-cp314-cp314t-win_arm64.whl", hash = "sha256:caba0837a4b40d47c8dfb0f24cccc12c7831e3dd450837f2a356c75f21ce5a15", size = 721404, upload-time = "2025-11-11T19:12:36.919Z" }, -] - [[package]] name = "pycparser" version = "3.0" @@ -1072,15 +1050,6 @@ wheels = [ { url = "https://mirrors.ustc.edu.cn/pypi/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] -[[package]] -name = "pygobject" -version = "3.56.2" -source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } -dependencies = [ - { name = "pycairo" }, -] -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/a2/80/09247a2be28af2c2240132a0af6c1005a2b1d089242b13a2cd782d2de8d7/pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313", size = 1409059, upload-time = "2026-03-25T16:14:04.008Z" } - [[package]] name = "pytest" version = "9.0.3" @@ -1111,6 +1080,22 @@ wheels = [ { url = "https://mirrors.ustc.edu.cn/pypi/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + [[package]] name = "pyzmq" version = "27.1.0" From 03300f0b18246584e90e0bf2086249b76c98ddf2 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Mon, 4 May 2026 14:22:45 +0800 Subject: [PATCH 66/79] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7=E5=88=B0=20pla?= =?UTF-8?q?ysound3=20=E4=BB=A5=E6=9B=BF=E4=BB=A3=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E9=A2=91=E5=87=BA=E7=9A=84=20playsound?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/misc/favorites.json5 | 6 ++++++ pyproject.toml | 5 +---- requirements.txt | 7 ------- src/heurams/interface/screens/memoqueue.py | 2 +- src/heurams/providers/audio/playsound_audio.py | 10 ++++------ uv.lock | 2 +- 6 files changed, 13 insertions(+), 19 deletions(-) delete mode 100644 requirements.txt diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 index 3f4db12..6c52d1a 100644 --- a/data/misc/favorites.json5 +++ b/data/misc/favorites.json5 @@ -160,5 +160,11 @@ "ident": "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.", "added": 1777847825, "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.", + "added": 1777874192, + "tags": [] } ] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b2b1f67..4caf643 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,10 +30,7 @@ tts-edgetts = [ "edge-tts>=7.2.8", # 微软 TTS ] llm = ["openai>=2.32.0"] -audio-playsound = [ - "playsound3==3.3.1", - #"pygobject>=3.56.2", # playsound 依赖它 -] +audio-playsound = ["playsound3>=3.3.1"] dev = [ # 调试所需依赖 "zmq>=0.0.0", # 用于 ZMQ 远程调试服务器, 在 linux 上建议先安装 libzmq "pytest>=8.0.0", # 用于普通测试 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 38e0d15..0000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -edge-tts==7.0.2 -openai==1.0.0 -playsound==1.2.2 -tabulate>=0.9.0 -textual==7.0.0 -toml==0.10.2 -transitions==0.9.3 diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index c8fd983..9ad35ea 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -156,11 +156,11 @@ class MemScreen(Screen): path = Path(config_var.get()["global"]["paths"]["data"]) / "cache" / "voice" path = path / f"{get_md5(self.atom.registry['nucleon']["tts_text"])}.wav" + logger.debug(str(path)) if path.exists(): play_by_path(path) else: from heurams.services.tts_service import convertor - convertor(self.atom.registry["nucleon"]["tts_text"], path) play_by_path(path) diff --git a/src/heurams/providers/audio/playsound_audio.py b/src/heurams/providers/audio/playsound_audio.py index db0a360..443c7c5 100644 --- a/src/heurams/providers/audio/playsound_audio.py +++ b/src/heurams/providers/audio/playsound_audio.py @@ -1,22 +1,20 @@ """通用音频适配器 -基于 playsound 库的音频播放器, 在绝大多数 python 环境上提供音频服务 -注意: 在未配置 pulseaudio 的 termux 不可用 +基于 playsound3 的音频播放器, 在绝大多数 python 环境上提供音频服务 +注意: 在 termux 不可用 """ import pathlib -import playsound +import playsound3 from heurams.services.logger import get_logger logger = get_logger(__name__) - def play_by_path(path: pathlib.Path): logger.debug("playsound_audio.play_by_path: 开始播放 %s", path) try: - playsound.playsound(str(path)) + playsound3.playsound(str(path)) logger.debug("播放完成: %s", path) except Exception as e: logger.error("播放失败: %s, 错误: %s", path, e) - raise diff --git a/uv.lock b/uv.lock index 3c5ba2d..54da3d7 100644 --- a/uv.lock +++ b/uv.lock @@ -493,7 +493,7 @@ requires-dist = [ { name = "heurams", extras = ["tts-edgetts"], marker = "extra == 'all'" }, { name = "heurams", extras = ["tts-edgetts"], marker = "extra == 'basic'" }, { name = "openai", marker = "extra == 'llm'", specifier = ">=2.32.0" }, - { name = "playsound3", marker = "extra == 'audio-playsound'", specifier = "==3.3.1" }, + { name = "playsound3", marker = "extra == 'audio-playsound'", specifier = ">=3.3.1" }, { name = "psutil", marker = "extra == 'interface'", specifier = ">=7.2.2" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, From 0cc19ca92f767ff286312b412ef9fe9af0401535 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 5 May 2026 10:34:51 +0800 Subject: [PATCH 67/79] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 826 ++++++++------------------------- README.md | 2 +- data/misc/favorites.json5 | 198 ++++++++ data/repo/chmgk/algodata.json | 12 +- data/repo/cngk-t/algodata.json | 704 ++++++++++++++-------------- 5 files changed, 762 insertions(+), 980 deletions(-) diff --git a/LICENSE b/LICENSE index bae94e1..0a23c78 100644 --- a/LICENSE +++ b/LICENSE @@ -1,661 +1,245 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. +The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. +Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. +A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. +The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. +An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. - The precise terms and conditions for copying, distribution and -modification follow. +The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS - 0. Definitions. +0. Definitions. - "This License" refers to version 3 of the GNU Affero General Public License. +"This License" refers to version 3 of the GNU Affero General Public License. - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. - A "covered work" means either the unmodified Program or a work based -on the Program. +A "covered work" means either the unmodified Program or a work based on the Program. - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - 1. Source Code. +1. Source Code. +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". + + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) + HeurAMS + Copyright (C) 2025 Wang Zhiyu (pluvium27) - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. +If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . + +--- + +Additional Permission under AGPL Section 7 + +Local API exemption: When the program is accessed solely via API (including RPC, REST API, GraphQL, or any machine-to-machine interface) from a caller on the same host machine, the source disclosure requirement of AGPL Section 13 is waived. + +Any API call from a different machine (including LAN, private network, or the internet) remains fully subject to AGPL Section 13. + +This exemption does NOT apply to human-facing web interfaces. \ No newline at end of file diff --git a/README.md b/README.md index 1cd9925..7ca5e2b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ 除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 > [!NOTE] -> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 +> 我们已经着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 > 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 > 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 index 6c52d1a..daeeeb2 100644 --- a/data/misc/favorites.json5 +++ b/data/misc/favorites.json5 @@ -166,5 +166,203 @@ "ident": "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.", "added": 1777874192, "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "明道德之广崇, 治乱之条贯, 靡不毕见.", + "added": 1777876114, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "其文约, 其辞微, 其志洁, 其行廉.", + "added": 1777884008, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "其志洁, 故其称物芳; 其行廉, 故死而不容.", + "added": 1777884045, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "生乎吾前, 其闻道也固先乎吾, 吾从而师之;", + "added": 1777884247, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "吾师道也, 夫庸知其年之先后生于吾乎?", + "added": 1777884298, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "是故无贵无贱, 无长无少, 道之所存, 师之所存也.", + "added": 1777884338, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!", + "added": 1777884371, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "古之圣人, 其出人也远矣, 犹且从师而问焉;", + "added": 1777884425, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "今之众人, 其下圣人也亦远矣, 而耻学于师.", + "added": 1777884480, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!", + "added": 1777884505, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.", + "added": 1777884537, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.", + "added": 1777884705, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "问之, 则曰: “彼与彼年相若也, 道相似也.", + "added": 1777884818, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "其称文小而其指极大, 举类迩而见义远.", + "added": 1777884887, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "惑而不从师, 其为惑也, 终不解矣.", + "added": 1777884938, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.", + "added": 1777885310, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.", + "added": 1777885372, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.", + "added": 1777885657, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!", + "added": 1777937005, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.", + "added": 1777937060, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "郯子之徒, 其贤不及孔子.", + "added": 1777937080, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.", + "added": 1777937115, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "实迷途其未远, 觉今是而昨非.", + "added": 1777937271, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "引壶觞以自酌, 眄庭柯以怡颜.", + "added": 1777937411, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "园日涉以成趣, 门虽设而常关.", + "added": 1777937464, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "云无心以出岫, 鸟倦飞而知还.", + "added": 1777937517, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "归去来兮, 请息交以绝游.", + "added": 1777937573, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "悦亲戚之情话, 乐琴书以消忧.", + "added": 1777937619, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "农人告余以春及, 将有事于西畴.", + "added": 1777937642, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.", + "added": 1777937894, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "善万物之得时, 感吾生之行休.", + "added": 1777938016, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "策扶老以流憩, 时矫首而遐观.", + "added": 1777938520, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "既窈窕以寻壑, 亦崎岖而经丘.", + "added": 1777938937, + "tags": [] } ] \ No newline at end of file diff --git a/data/repo/chmgk/algodata.json b/data/repo/chmgk/algodata.json index b024ded..d0b6e19 100644 --- a/data/repo/chmgk/algodata.json +++ b/data/repo/chmgk/algodata.json @@ -2,13 +2,13 @@ "临安春雨初霁": { "SM-2": { "efactor": 2.5, - "real_rept": 2, - "rept": 0, - "interval": 1, - "last_date": 20573, - "next_date": 20574, + "real_rept": 4, + "rept": 2, + "interval": 15, + "last_date": 20578, + "next_date": 20593, "is_activated": 1, - "last_modify": 1777521623.7446923 + "last_modify": 1777940498.2121851 } } } \ No newline at end of file diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json index f809d0c..41412a2 100644 --- a/data/repo/cngk-t/algodata.json +++ b/data/repo/cngk-t/algodata.json @@ -1444,11 +1444,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.095589 } }, "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.": { @@ -1456,11 +1456,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.096489 } }, "明道德之广崇, 治乱之条贯, 靡不毕见.": { @@ -1468,11 +1468,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.0973692 } }, "其文约, 其辞微, 其志洁, 其行廉.": { @@ -1480,11 +1480,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.098246 } }, "其称文小而其指极大, 举类迩而见义远.": { @@ -1492,11 +1492,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.0991225 } }, "其志洁, 故其称物芳; 其行廉, 故死而不容.": { @@ -1504,11 +1504,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1000113 } }, "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.": { @@ -1516,11 +1516,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.100887 } }, "推此志也, 虽与日月争光可也.": { @@ -1528,11 +1528,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1017635 } }, "山居秋暝": { @@ -1540,11 +1540,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1026397 } }, "空山新雨后, 天气晚来秋.": { @@ -1552,11 +1552,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1035266 } }, "明月松间照, 清泉石上流.": { @@ -1564,11 +1564,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1044123 } }, "竹喧归浣女, 莲动下渔舟.": { @@ -1576,11 +1576,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1053016 } }, "随意春芳歇, 王孙自可留.": { @@ -1588,11 +1588,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1062007 } }, "师说": { @@ -1600,11 +1600,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.107093 } }, "古之学者必有师.": { @@ -1612,11 +1612,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1079836 } }, "师者, 所以传道受业解惑也.": { @@ -1624,11 +1624,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.108877 } }, "人非生而知之者, 孰能无惑?": { @@ -1636,11 +1636,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1097696 } }, "惑而不从师, 其为惑也, 终不解矣.": { @@ -1648,11 +1648,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1106517 } }, "生乎吾前, 其闻道也固先乎吾, 吾从而师之;": { @@ -1660,11 +1660,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.111523 } }, "生乎吾后, 其闻道也亦先乎吾, 吾从而师之.": { @@ -1672,11 +1672,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.112409 } }, "吾师道也, 夫庸知其年之先后生于吾乎?": { @@ -1684,11 +1684,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1132977 } }, "是故无贵无贱, 无长无少, 道之所存, 师之所存也.": { @@ -1696,11 +1696,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1141808 } }, "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!": { @@ -1708,11 +1708,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.115059 } }, "古之圣人, 其出人也远矣, 犹且从师而问焉;": { @@ -1720,11 +1720,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1159356 } }, "今之众人, 其下圣人也亦远矣, 而耻学于师.": { @@ -1732,11 +1732,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.116813 } }, "是故圣益圣, 愚益愚.": { @@ -1744,11 +1744,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1177015 } }, "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!": { @@ -1756,11 +1756,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1185758 } }, "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.": { @@ -1768,11 +1768,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1194518 } }, "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.": { @@ -1780,11 +1780,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.120329 } }, "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.": { @@ -1792,11 +1792,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.12121 } }, "巫医乐师百工之人, 不耻相师.": { @@ -1804,11 +1804,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1220849 } }, "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.": { @@ -1816,11 +1816,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1229665 } }, "问之, 则曰: “彼与彼年相若也, 道相似也.": { @@ -1828,11 +1828,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.1238453 } }, "位卑则足羞, 官盛则近谀.”": { @@ -1840,11 +1840,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.124723 } }, "呜呼! 师道之不复, 可知矣.": { @@ -1852,11 +1852,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20577, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777886739.125607 } }, "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!": { @@ -1864,23 +1864,23 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0340557 } }, "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.": { "NSP-0": { "real_rept": 0, - "important": 0, + "important": 1, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": 1, + "last_date": 20578, + "next_date": 20579, + "is_activated": 1, + "last_modify": 1777938950.0348792 } }, "郯子之徒, 其贤不及孔子.": { @@ -1888,11 +1888,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0353334 } }, "孔子曰: 三人行, 则必有我师.": { @@ -1900,11 +1900,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.03615 } }, "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.": { @@ -1912,11 +1912,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0369658 } }, "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.": { @@ -1924,11 +1924,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0377731 } }, "余嘉其能行古道, 作《师说》以贻之.": { @@ -1936,11 +1936,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0385973 } }, "归去来兮辞": { @@ -1948,11 +1948,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.039485 } }, "归去来兮, 田园将芜胡不归?": { @@ -1960,11 +1960,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.040328 } }, "既自以心为形役, 奚惆怅而独悲?": { @@ -1972,11 +1972,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0411494 } }, "悟已往之不谏, 知来者之可追.": { @@ -1984,11 +1984,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0419598 } }, "实迷途其未远, 觉今是而昨非.": { @@ -1996,11 +1996,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0427594 } }, "舟遥遥以轻飏, 风飘飘而吹衣.": { @@ -2008,23 +2008,23 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.043582 } }, "问征夫以前路, 恨晨光之熹微.": { "NSP-0": { "real_rept": 0, - "important": 0, + "important": 1, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": 1, + "last_date": 20578, + "next_date": 20579, + "is_activated": 1, + "last_modify": 1777938950.0443935 } }, "乃瞻衡宇, 载欣载奔.": { @@ -2032,11 +2032,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0448318 } }, "僮仆欢迎, 稚子候门.": { @@ -2044,11 +2044,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0456398 } }, "三径就荒, 松菊犹存.": { @@ -2056,11 +2056,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0464475 } }, "携幼入室, 有酒盈樽.": { @@ -2068,11 +2068,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0472815 } }, "引壶觞以自酌, 眄庭柯以怡颜.": { @@ -2080,11 +2080,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0480993 } }, "倚南窗以寄傲, 审容膝之易安.": { @@ -2092,11 +2092,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0489156 } }, "园日涉以成趣, 门虽设而常关.": { @@ -2104,11 +2104,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0497541 } }, "策扶老以流憩, 时矫首而遐观.": { @@ -2116,11 +2116,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0621138 } }, "云无心以出岫, 鸟倦飞而知还.": { @@ -2128,11 +2128,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0514085 } }, "景翳翳以将入, 抚孤松而盘桓.": { @@ -2140,11 +2140,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0522354 } }, "归去来兮, 请息交以绝游.": { @@ -2152,11 +2152,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.053065 } }, "世与我而相违, 复驾言兮焉求?": { @@ -2164,11 +2164,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0538673 } }, "悦亲戚之情话, 乐琴书以消忧.": { @@ -2176,11 +2176,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0546837 } }, "农人告余以春及, 将有事于西畴.": { @@ -2188,11 +2188,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0554926 } }, "或命巾车, 或棹孤舟.": { @@ -2200,11 +2200,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0562994 } }, "既窈窕以寻壑, 亦崎岖而经丘.": { @@ -2212,11 +2212,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0629177 } }, "木欣欣以向荣, 泉涓涓而始流.": { @@ -2224,11 +2224,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0579095 } }, "善万物之得时, 感吾生之行休.": { @@ -2236,11 +2236,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.058717 } }, "已矣乎! 寓形宇内复几时?": { @@ -2248,11 +2248,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0595295 } }, "曷不委心任去留?": { @@ -2260,11 +2260,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.060347 } }, "胡为乎遑遑欲何之?": { @@ -2272,11 +2272,11 @@ "real_rept": 0, "important": 0, "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 + "interval": Infinity, + "last_date": 20578, + "next_date": Infinity, + "is_activated": 1, + "last_modify": 1777938950.0612867 } }, "富贵非吾愿, 帝乡不可期.": { From 1cbd27279d618bdce23de3404a63f47efa881907 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Tue, 5 May 2026 11:53:37 +0800 Subject: [PATCH 68/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 14 ++++++-------- README.md | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4477447..f403ec1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ - `main` 分支: 稳定版本, 仅当稳定版本释出或修补版本时将 `dev` 合并到 `main` 上 - `dev` 分支: 主线开发版本, 自身仅用于非重构的问题修复和整合功能分支 - 功能与重构分支: 从 `dev` 分支创建, 命名格式为 `feature/描述` 或 `fix/描述` 或 `refactor/v版本号` -- 不要将功能与重构分支先应被合并至 `dev` 后在 `dev` 完成文档开发后再释出至 `main` +- 功能与重构分支应先合并至 `dev`, 再合并至 `main` 代码格式化: @@ -84,7 +84,7 @@ python3 -m heurams.interface # 启动 TUI ## 许可证与外部引用 -贡献者拥有其贡献部分的版权同意其贡献将在 AGPL-3.0 许可证下发布. +贡献者拥有其贡献部分的版权同意其贡献将在 AGPL-3.0 许可证(包括附加的本机 API 调用豁免条款)下发布. 如果您认为有必要引入其他开源的 vendor, 请在 PR 中注明或手动联系以便我们审查 vendor 许可证并更改此处和网站上的关于与版权声明 @@ -92,20 +92,18 @@ python3 -m heurams.interface # 启动 TUI 如果您认为有必要升级某个依赖或运行环境的版本, 请也在 PR 中注明 -## 新的用户界面前端与其他语言移植 +## 新的用户界面前端 HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: - 我们的内置 Textual TUI 前端不是唯一可用的前端 -- 您可以在自己的项目中以独立进程/服务调用 HeurAMS, 而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. +- 如果您有一个自己开发的且可用的 HeurAMS 前端 (例如未实现的 Flutter 前端), 并且以 AGPL-3.0/GPL-3.0 开放源代码, 可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) -- 如果您有一个自己开发的且可用的 HeurAMS 前端 (例如我们暂未实现的 flutter 前端), 并且以 AGPL-3.0/GPL-3.0 开放源代码, 可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) +- 您还可以在自己的项目中以独立进程/服务调用 HeurAMS, 根据 AGPL-3.0 及本项目的附加许可条款, 如果调用发生在同一主机上且不涉及外部网络转发, 则可豁免许可证规定的特定义务而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. - 如果您通过独立进程/服务调用方式开发了另外的软件, 开源但不愿使用 AGPL-3.0/GPL-3.0 许可证, 也可以联系我们, 我们乐于将您的项目链接添加到友链中 - -- 如果您想创建程序库的其他语言 (例如 dart 或 rust) 版本以协助此语言下的方便集成, 并且同样以 AGPL-3.0/GPL-3.0 开放源代码, 也可以联系我们将它转移到 HeurAMS 的官方仓库中以便共同维护, 您将保留您的版权并可主导该仓库下的开发工作 :) - + ## 软件开发之外的贡献 即使您不是软件开发人员, 我们也欢迎您加入贡献! diff --git a/README.md b/README.md index 7ca5e2b..3c4d232 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ### 项目本身 -本项目基于 AGPL-3.0 许可证开放源代码. +本项目基于 AGPL-3.0 许可证开放源代码, 并有一个豁免本机 API 调用的附加条款. 详见根目录下 [LICENSE](LICENSE) 文件. ### 第三方代码 From cd23c2d773bc4633e3bb25af7333bb2a173f9641 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 6 May 2026 09:35:58 +0800 Subject: [PATCH 69/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 11 +- README.md | 3 +- SCREENSHOTS.md | 68 + data/config/repo/cngk.toml | 4 +- data/misc/favorites.json5 | 114 + data/repo/chmgk/manifest.toml | 4 - data/repo/cngk-t/algodata.json | 11402 ------------------- data/repo/cngk-t/manifest.toml | 4 - data/repo/cngk-t/payload.toml | 5705 ---------- data/repo/cngk-t/schedule.toml | 11 - data/repo/cngk-t/typedef.toml | 17 - data/repo/{chmgk => stub}/algodata.json | 0 data/repo/{chmgk => stub}/draft.txt | 0 data/repo/stub/manifest.toml | 4 + data/repo/{chmgk => stub}/payload.toml | 0 data/repo/{chmgk => stub}/schedule.toml | 0 data/repo/{chmgk => stub}/typedef.toml | 0 pyproject.toml | 5 + screenshots/about_1.png | Bin 0 -> 359601 bytes screenshots/dashboard_1.png | Bin 0 -> 226804 bytes screenshots/dashboard_2.png | Bin 0 -> 226705 bytes screenshots/favmanager_1.png | Bin 0 -> 338423 bytes screenshots/memoqueue_cloze_1.png | Bin 0 -> 165686 bytes screenshots/memoqueue_recognition_1.png | Bin 0 -> 208067 bytes screenshots/memoqueue_recognition_2.png | Bin 0 -> 225157 bytes screenshots/navigator_1.png | Bin 0 -> 268305 bytes screenshots/precache_1.png | Bin 0 -> 242493 bytes screenshots/preparation.png | Bin 0 -> 324252 bytes screenshots/setting_1.png | Bin 0 -> 183353 bytes screenshots/setting_2.png | Bin 0 -> 181271 bytes src/heurams/interface/css/main.tcss | 13 +- src/heurams/interface/screens/about.py | 30 +- src/heurams/interface/screens/memoqueue.py | 11 +- src/heurams/kernel/README.md | 2 +- src/heurams/services/README.md | 2 +- tests/README.md | 150 + uv.lock | 20 +- 37 files changed, 394 insertions(+), 17186 deletions(-) create mode 100644 SCREENSHOTS.md delete mode 100644 data/repo/chmgk/manifest.toml delete mode 100644 data/repo/cngk-t/algodata.json delete mode 100644 data/repo/cngk-t/manifest.toml delete mode 100644 data/repo/cngk-t/payload.toml delete mode 100644 data/repo/cngk-t/schedule.toml delete mode 100644 data/repo/cngk-t/typedef.toml rename data/repo/{chmgk => stub}/algodata.json (100%) rename data/repo/{chmgk => stub}/draft.txt (100%) create mode 100644 data/repo/stub/manifest.toml rename data/repo/{chmgk => stub}/payload.toml (100%) rename data/repo/{chmgk => stub}/schedule.toml (100%) rename data/repo/{chmgk => stub}/typedef.toml (100%) create mode 100644 screenshots/about_1.png create mode 100644 screenshots/dashboard_1.png create mode 100644 screenshots/dashboard_2.png create mode 100644 screenshots/favmanager_1.png create mode 100644 screenshots/memoqueue_cloze_1.png create mode 100644 screenshots/memoqueue_recognition_1.png create mode 100644 screenshots/memoqueue_recognition_2.png create mode 100644 screenshots/navigator_1.png create mode 100644 screenshots/precache_1.png create mode 100644 screenshots/preparation.png create mode 100644 screenshots/setting_1.png create mode 100644 screenshots/setting_2.png create mode 100644 tests/README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f403ec1..5d70548 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ > [!NOTE] > 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 -> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android, iOS 和 Plasma Mobile 提供现代用户界面 > 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 ## 开发规范 @@ -86,11 +86,10 @@ python3 -m heurams.interface # 启动 TUI 贡献者拥有其贡献部分的版权同意其贡献将在 AGPL-3.0 许可证(包括附加的本机 API 调用豁免条款)下发布. -如果您认为有必要引入其他开源的 vendor, 请在 PR 中注明或手动联系以便我们审查 vendor 许可证并更改此处和网站上的关于与版权声明 - -如果您认为有必要引入其他专有的网络服务(就像现在项目中的 edgetts), 请也在 PR 中注明 - -如果您认为有必要升级某个依赖或运行环境的版本, 请也在 PR 中注明 +如有以下情况, 请在 PR 描述中注明: +- 如果需要引入其他开源 vendor +- 如果需要引入其他专有的网络服务(例如当前项目中的 edgetts) +- 如果需要升级某个依赖或运行环境的版本 ## 新的用户界面前端 diff --git a/README.md b/README.md index 3c4d232..9bfd752 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ > [!NOTE] > 我们已经着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 -> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android 和 Plasma Mobile 提供现代用户界面 +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android, iOS 和 Plasma Mobile 提供现代用户界面 > 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 ## 特性 @@ -44,6 +44,7 @@ - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 - 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持导出为压缩包或合并单文本文件以通过纯文本文件形式在 pastebin 等平台分享 - 性能提升: 得益于现代且支持分块的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 +- AI 友好: 想象您有一些 .apkg 牌组或一大段教材内容, 您可以方便且高效率地使用 AI 工具生成可在 HeurAMS 使用的单元集 ### 实用用户界面 diff --git a/SCREENSHOTS.md b/SCREENSHOTS.md new file mode 100644 index 0000000..ed252c8 --- /dev/null +++ b/SCREENSHOTS.md @@ -0,0 +1,68 @@ +# 截图展示 + +潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图: + +- Textual (基本用户界面): 基于 Python Textual 框架构建的程序库内置跨平台 TUI 界面, 支持触屏、鼠标、键盘多操作模式, 是当前开箱即用的默认前端. +- KiriMemo: 基于 KDE `Kirigami` 框架的现代跨平台前端, 使用 C++ 和 QML 构建, 通过 `PyOtherSide` 直接复用 Python 内核,为 Windows、Linux、macOS、Android、iOS 和 Plasma Mobile 提供原生体验(尚未稳定). + +欢迎为现有前端贡献代码, 或开发您自己的前端. +详见[贡献指南](CONTRIBUTING.md#新的用户界面前端). + +## 基本用户界面前端的截图 + +### 仪表盘与导航器 + +仪表盘包含学习面板的总体视图, 包括不同功能区域的操作入口, 统计信息, 以及单元集概览. +导航器是一个实用的模态窗口, 能带您在多种功能间自如切换, 按 `n` 键或单击下方按钮可在任意界面迅速打开/关闭导航器. + +
+ + + +
+ +### 准备界面与预缓存工具 + +学习准备界面展示了单元集基本信息和每个单元的学习状态, 并提供了学习和预缓存的入口. +预缓存工具使您能提前预缓存文本转语音资源以确保复习流程的顺畅体验和离线复习能力, 但即使您不预先缓存, 资源也会在复习播放时被自动加载. + +
+ + +
+ +### 记忆队列界面 + +队列式学习记忆的主要界面. +同一知识点可产生多种谜题类型的评估方式, 软件内置完形填空与识别题等多种测试类型, 您可在复习流程中按顺序完成不同测试. + +
+ + + +
+ + +### 设置 + +配置界面包含算法选择、音频与多种服务的提供者切换、以及界面与算法设置等选项. + +
+ + +
+ +### 其他界面 + +收藏管理器可管理您手动标记的个人收藏集. +关于页面提供了程序版本号、许可协议等信息. + +
+ + +
+ +## KiriMemo 前端的截图 + +截图将在 KiriMemo 前端开发趋于稳定后补充. + diff --git a/data/config/repo/cngk.toml b/data/config/repo/cngk.toml index 19dff73..ea2bbef 100644 --- a/data/config/repo/cngk.toml +++ b/data/config/repo/cngk.toml @@ -1,6 +1,6 @@ -algorithm = "SM-2" +algorithm = "NSP-0" _algorithm_desc = "记忆调度算法" -scheduled_num = 20 +scheduled_num = 35 _scheduled_num_desc = "单次记忆单元数量" [_algorithm_candidate] diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 index daeeeb2..a8078f5 100644 --- a/data/misc/favorites.json5 +++ b/data/misc/favorites.json5 @@ -364,5 +364,119 @@ "ident": "既窈窕以寻壑, 亦崎岖而经丘.", "added": 1777938937, "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "怀良辰以孤往, 或植杖而耘耔.", + "added": 1777968294, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "淮左名都, 竹西佳处, 解鞍少驻初程.", + "added": 1777970555, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.", + "added": 1778018829, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;", + "added": 1778018908, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.", + "added": 1778019166, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.", + "added": 1778019396, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.", + "added": 1778019511, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "心非木石岂无感, 吞声踯躅不敢言.", + "added": 1778019707, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,", + "added": 1778020343, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!", + "added": 1778020491, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "江畔何人初见月? 江月何年初照人?", + "added": 1778025537, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "不知江月待何人, 但见长江送流水.", + "added": 1778025571, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "斜月沉沉藏海雾, 碣石潇湘无限路.", + "added": 1778025668, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "不知乘月几人归, 落月摇情满江树.", + "added": 1778025686, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "东南形胜, 三吴都会, 钱塘自古繁华.", + "added": 1778025708, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "江娥啼竹素女愁, 李凭中国弹箜篌.", + "added": 1778025886, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "十二门前融冷光, 二十三丝动紫皇.", + "added": 1778025946, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.", + "added": 1778026396, + "tags": [] + }, + { + "repo_path": "cngk-t", + "ident": "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.", + "added": 1778026427, + "tags": [] } ] \ No newline at end of file diff --git a/data/repo/chmgk/manifest.toml b/data/repo/chmgk/manifest.toml deleted file mode 100644 index f2d7ff7..0000000 --- a/data/repo/chmgk/manifest.toml +++ /dev/null @@ -1,4 +0,0 @@ -title = "高考化学" -package = "chmgk" -author = "__heurams__" -desc = "高考古诗文 60 篇" diff --git a/data/repo/cngk-t/algodata.json b/data/repo/cngk-t/algodata.json deleted file mode 100644 index 41412a2..0000000 --- a/data/repo/cngk-t/algodata.json +++ /dev/null @@ -1,11402 +0,0 @@ -{ - "临安春雨初霁": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4914656 - } - }, - "世味年来薄似纱, 谁令骑马客京华.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4924672 - } - }, - "小楼一夜听春雨, 深巷明朝卖杏花.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.493454 - } - }, - "矮纸斜行闲作草, 晴窗细乳戏分茶.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4944363 - } - }, - "素衣莫起风尘叹, 犹及清明可到家.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4954169 - } - }, - "书愤": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4964006 - } - }, - "早岁那知世事艰, 中原北望气如山": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.4973834 - } - }, - "楼船夜雪瓜洲渡, 铁马秋风大散关": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.498366 - } - }, - "塞上长城空自许, 镜中衰鬓已先斑": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.499353 - } - }, - "出师一表真名世, 千载谁堪伯仲间": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5003324 - } - }, - "五代史伶官传序": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5013266 - } - }, - "呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5023134 - } - }, - "原庄宗之所以得天下, 与其所以失之者, 可以知之矣": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5033157 - } - }, - "世言晋王之将终也, 以三矢赐庄宗而告之曰:": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.504301 - } - }, - "梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5052884 - } - }, - "此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5062537 - } - }, - "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5072265 - } - }, - "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5081902 - } - }, - "及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.509152 - } - }, - "至于誓天断发, 泣下沾襟, 何其衰也!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5101078 - } - }, - "岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5110755 - } - }, - "《书》曰: 满招损, 谦得益.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5120487 - } - }, - "忧劳可以兴国, 逸豫可以亡身, 自然之理也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5130248 - } - }, - "故方其盛也, 举天下之豪杰, 莫能与之争;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.513995 - } - }, - "及其衰也, 数十伶人困之, 而身死国灭, 为天下笑": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5150003 - } - }, - "夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5160367 - } - }, - "六国论": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5170627 - } - }, - "六国破灭, 非兵不利, 战不善, 弊在赂秦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5180395 - } - }, - "赂秦而力亏, 破灭之道也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5190074 - } - }, - "或曰: 六国互丧, 率赂秦耶?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5199776 - } - }, - "曰: 不赂者以赂者丧.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.520953 - } - }, - "盖失强援, 不能独完.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5219326 - } - }, - "故曰: 弊在赂秦也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5228999 - } - }, - "秦以攻取之外, 小则获邑, 大则得城.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5238662 - } - }, - "较秦之所得, 与战胜而得者, 其实百倍;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.524846 - } - }, - "诸侯之所亡, 与战败而亡者, 其实亦百倍.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5258238 - } - }, - "则秦之所大欲, 诸侯之所大患, 固不在战矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.526805 - } - }, - "思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.52777 - } - }, - "子孙视之不甚惜, 举以予人, 如弃草芥.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5287466 - } - }, - "今日割五城, 明日割十城, 然后得一夕安寝.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5297248 - } - }, - "起视四境, 而秦兵又至矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5306935 - } - }, - "然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5316658 - } - }, - "故不战而强弱胜负已判矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5326347 - } - }, - "至于颠覆, 理固宜然.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5336022 - } - }, - "古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.534574 - } - }, - "此言得之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5355504 - } - }, - "齐人未尝赂秦, 终继五国迁灭, 何哉?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5365207 - } - }, - "与嬴而不助五国也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5375 - } - }, - "五国既丧, 齐亦不免矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5385113 - } - }, - "燕赵之君, 始有远略, 能守其土, 义不赂秦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20575, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777687299.5395193 - } - }, - "是故燕虽小国而后亡, 斯用兵之效也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2494323 - } - }, - "至丹以荆卿为计, 始速祸焉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2503824 - } - }, - "赵尝五战于秦, 二败而三胜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2513177 - } - }, - "后秦击赵者再, 李牧连却之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2522445 - } - }, - "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2531524 - } - }, - "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2540634 - } - }, - "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2549765 - } - }, - "则胜负之数, 存亡之理, 当与秦相较, 或未易量.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2558837 - } - }, - "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2567906 - } - }, - "则吾恐秦人食之不得下咽也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.257705 - } - }, - "悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2586217 - } - }, - "为国者无使为积威之所劫哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2595222 - } - }, - "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2604313 - } - }, - "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.261338 - } - }, - "劝学": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2622435 - } - }, - "君子曰: 学不可以已.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.263148 - } - }, - "青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2640674 - } - }, - "木直中绳, 𫐓以为轮, 其曲中规.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2649877 - } - }, - "虽有槁暴, 不复挺者, 𫐓使之然也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2659097 - } - }, - "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.266835 - } - }, - "吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2677584 - } - }, - "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2686841 - } - }, - "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2696033 - } - }, - "君子生非异也, 善假于物也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2705297 - } - }, - "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2714655 - } - }, - "故不积跬步, 无以至千里; 不积小流, 无以成江海.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2723877 - } - }, - "骐骥一跃, 不能十步; 驽马十驾, 功在不舍.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2733133 - } - }, - "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2742264 - } - }, - "蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2751412 - } - }, - "蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2760553 - } - }, - "声声慢·寻寻觅觅": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2769687 - } - }, - "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2778819 - } - }, - "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2788045 - } - }, - "大道之行也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.2797318 - } - }, - "大道之行也, 天下为公.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20576, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777752121.280661 - } - }, - "选贤与能, 讲信修睦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3410826 - } - }, - "故人不独亲其亲, 不独子其子.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3419733 - } - }, - "使老有所终, 壮有所用, 幼有所长.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3428566 - } - }, - "矜寡孤独废疾者皆有所养.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.343717 - } - }, - "男有分, 女有归.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3445776 - } - }, - "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.345438 - } - }, - "是故谋闭不兴, 盗窃乱贼而不作.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.346368 - } - }, - "故外户而不闭, 是谓大同.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3472884 - } - }, - "客至": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3481581 - } - }, - "舍南舍北皆春水, 但见群鸥日日来.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3490245 - } - }, - "花径不曾缘客扫, 蓬门今始为君开.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3498929 - } - }, - "盘飧市远无兼味, 樽酒家贫只旧醅.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3507535 - } - }, - "肯与邻翁相对饮, 隔篱呼取尽余杯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3516183 - } - }, - "将进酒": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3524792 - } - }, - "君不见, 黄河之水天上来, 奔流到海不复回.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3533425 - } - }, - "君不见, 高堂明镜悲白发, 朝如青丝暮成雪!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.354205 - } - }, - "人生得意须尽欢, 莫使金樽空对月.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3550696 - } - }, - "天生我材必有用, 千金散尽还复来.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3559296 - } - }, - "烹羊宰牛且为乐, 会须一饮三百杯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3570464 - } - }, - "岑夫子, 丹丘生, 将进酒, 杯莫停.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3579862 - } - }, - "与君歌一曲, 请君为我倾耳听.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3589103 - } - }, - "钟鼓馔玉不足贵, 但愿长醉不复醒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3598297 - } - }, - "古来圣贤皆寂寞, 惟有饮者留其名.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3607597 - } - }, - "陈王昔时宴平乐, 斗酒十千恣欢谑.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3616798 - } - }, - "主人何为言少钱, 径须沽取对君酌.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.362612 - } - }, - "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3635416 - } - }, - "屈原列传": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3644655 - } - }, - "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3653889 - } - }, - "离骚者, 犹离忧也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3663144 - } - }, - "夫天者, 人之始也; 父母者, 人之本也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3672378 - } - }, - "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3682392 - } - }, - "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3691041 - } - }, - "信而见疑, 忠而被谤, 能无怨乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3699749 - } - }, - "屈平之作《离骚》, 盖自怨生也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.370834 - } - }, - "《国风》好色而不淫, 《小雅》怨诽而不乱.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777847940.3725486 - } - }, - "若《离骚》者, 可谓兼之矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.095589 - } - }, - "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.096489 - } - }, - "明道德之广崇, 治乱之条贯, 靡不毕见.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.0973692 - } - }, - "其文约, 其辞微, 其志洁, 其行廉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.098246 - } - }, - "其称文小而其指极大, 举类迩而见义远.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.0991225 - } - }, - "其志洁, 故其称物芳; 其行廉, 故死而不容.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1000113 - } - }, - "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.100887 - } - }, - "推此志也, 虽与日月争光可也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1017635 - } - }, - "山居秋暝": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1026397 - } - }, - "空山新雨后, 天气晚来秋.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1035266 - } - }, - "明月松间照, 清泉石上流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1044123 - } - }, - "竹喧归浣女, 莲动下渔舟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1053016 - } - }, - "随意春芳歇, 王孙自可留.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1062007 - } - }, - "师说": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.107093 - } - }, - "古之学者必有师.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1079836 - } - }, - "师者, 所以传道受业解惑也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.108877 - } - }, - "人非生而知之者, 孰能无惑?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1097696 - } - }, - "惑而不从师, 其为惑也, 终不解矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1106517 - } - }, - "生乎吾前, 其闻道也固先乎吾, 吾从而师之;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.111523 - } - }, - "生乎吾后, 其闻道也亦先乎吾, 吾从而师之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.112409 - } - }, - "吾师道也, 夫庸知其年之先后生于吾乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1132977 - } - }, - "是故无贵无贱, 无长无少, 道之所存, 师之所存也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1141808 - } - }, - "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.115059 - } - }, - "古之圣人, 其出人也远矣, 犹且从师而问焉;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1159356 - } - }, - "今之众人, 其下圣人也亦远矣, 而耻学于师.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.116813 - } - }, - "是故圣益圣, 愚益愚.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1177015 - } - }, - "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1185758 - } - }, - "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1194518 - } - }, - "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.120329 - } - }, - "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.12121 - } - }, - "巫医乐师百工之人, 不耻相师.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1220849 - } - }, - "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1229665 - } - }, - "问之, 则曰: “彼与彼年相若也, 道相似也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.1238453 - } - }, - "位卑则足羞, 官盛则近谀.”": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.124723 - } - }, - "呜呼! 师道之不复, 可知矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20577, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777886739.125607 - } - }, - "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0340557 - } - }, - "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.": { - "NSP-0": { - "real_rept": 0, - "important": 1, - "rept": 0, - "interval": 1, - "last_date": 20578, - "next_date": 20579, - "is_activated": 1, - "last_modify": 1777938950.0348792 - } - }, - "郯子之徒, 其贤不及孔子.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0353334 - } - }, - "孔子曰: 三人行, 则必有我师.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.03615 - } - }, - "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0369658 - } - }, - "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0377731 - } - }, - "余嘉其能行古道, 作《师说》以贻之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0385973 - } - }, - "归去来兮辞": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.039485 - } - }, - "归去来兮, 田园将芜胡不归?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.040328 - } - }, - "既自以心为形役, 奚惆怅而独悲?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0411494 - } - }, - "悟已往之不谏, 知来者之可追.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0419598 - } - }, - "实迷途其未远, 觉今是而昨非.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0427594 - } - }, - "舟遥遥以轻飏, 风飘飘而吹衣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.043582 - } - }, - "问征夫以前路, 恨晨光之熹微.": { - "NSP-0": { - "real_rept": 0, - "important": 1, - "rept": 0, - "interval": 1, - "last_date": 20578, - "next_date": 20579, - "is_activated": 1, - "last_modify": 1777938950.0443935 - } - }, - "乃瞻衡宇, 载欣载奔.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0448318 - } - }, - "僮仆欢迎, 稚子候门.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0456398 - } - }, - "三径就荒, 松菊犹存.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0464475 - } - }, - "携幼入室, 有酒盈樽.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0472815 - } - }, - "引壶觞以自酌, 眄庭柯以怡颜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0480993 - } - }, - "倚南窗以寄傲, 审容膝之易安.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0489156 - } - }, - "园日涉以成趣, 门虽设而常关.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0497541 - } - }, - "策扶老以流憩, 时矫首而遐观.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0621138 - } - }, - "云无心以出岫, 鸟倦飞而知还.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0514085 - } - }, - "景翳翳以将入, 抚孤松而盘桓.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0522354 - } - }, - "归去来兮, 请息交以绝游.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.053065 - } - }, - "世与我而相违, 复驾言兮焉求?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0538673 - } - }, - "悦亲戚之情话, 乐琴书以消忧.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0546837 - } - }, - "农人告余以春及, 将有事于西畴.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0554926 - } - }, - "或命巾车, 或棹孤舟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0562994 - } - }, - "既窈窕以寻壑, 亦崎岖而经丘.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0629177 - } - }, - "木欣欣以向荣, 泉涓涓而始流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0579095 - } - }, - "善万物之得时, 感吾生之行休.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.058717 - } - }, - "已矣乎! 寓形宇内复几时?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0595295 - } - }, - "曷不委心任去留?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.060347 - } - }, - "胡为乎遑遑欲何之?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": Infinity, - "last_date": 20578, - "next_date": Infinity, - "is_activated": 1, - "last_modify": 1777938950.0612867 - } - }, - "富贵非吾愿, 帝乡不可期.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "怀良辰以孤往, 或植杖而耘耔.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登东皋以舒啸, 临清流而赋诗.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "聊乘化以归尽, 乐夫天命复奚疑!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "归园田居·其一": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "少无适俗韵, 性本爱丘山": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "误落尘网中, 一去三十年": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "羁鸟恋旧林, 池鱼思故渊": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "开荒南野际, 守拙归园田": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "方宅十余亩, 草屋八九间": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "榆柳荫后檐, 桃李罗堂前": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "暧暧远人村, 依依墟里烟": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "狗吠深巷中, 鸡鸣桑树颠": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "户庭无尘杂, 虚室有余闲": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "久在樊笼里, 复得返自然": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "念奴娇·赤壁怀古": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "大江东去, 浪淘尽, 千古风流人物.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故垒西边, 人道是, 三国周郎赤壁.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "乱石穿空, 惊涛拍岸, 卷起千堆雪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江山如画, 一时多少豪杰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "遥想公瑾当年, 小乔初嫁了, 雄姿英发.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "羽扇纶巾, 谈笑间, 樯橹灰飞烟灭.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故国神游, 多情应笑我, 早生华发.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人生如梦, 一尊还酹江月.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "念奴娇·过洞庭": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "洞庭青草, 近中秋, 更无一点风色.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "玉鉴琼田三万顷, 着我扁舟一叶.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "素月分辉, 明河共影, 表里俱澄澈.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "悠然心会, 妙处难与君说.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "应念岭海经年, 孤光自照, 肝肺皆冰雪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "短发萧骚襟袖冷, 稳泛沧浪空阔.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "尽挹西江, 细斟北斗, 万象为宾客.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "扣舷独啸, 不知今夕何夕!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "扬州慢": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "淮左名都, 竹西佳处, 解鞍少驻初程.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "过春风十里, 尽荠麦青青.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自胡马窥江去后, 废池乔木, 犹厌言兵.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "渐黄昏, 清角吹寒, 都在空城.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "杜郎俊赏, 算而今, 重到须惊.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "纵豆蔻词工, 青楼梦好, 难赋深情.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "二十四桥仍在, 波心荡, 冷月无声.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "念桥边红药, 年年知为谁生?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "报任安书": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "《诗》三百篇, 大底圣贤发愤之所为作也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此人皆意有所郁结, 不得通其道, 故述往事, 思来者.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "亦欲以究天人之际, 通古今之变, 成一家之言.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然此可为智者道, 难为俗人言也!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "拟行路难·其四": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "泻水置平地, 各自东西南北流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人生亦有命, 安能行叹复坐愁?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "酌酒以自宽, 举杯断绝歌路难.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "心非木石岂无感, 吞声踯躅不敢言.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "无衣": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "春江花月夜": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "春江潮水连海平, 海上明月共潮生.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "滟滟随波千万里, 何处春江无月明!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江流宛转绕芳甸, 月照花林皆似霰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "空里流霜不觉飞, 汀上白沙看不见.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江天一色无纤尘, 皎皎空中孤月轮.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江畔何人初见月? 江月何年初照人?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人生代代无穷已, 江月年年望相似.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不知江月待何人, 但见长江送流水.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "白云一片去悠悠, 青枫浦上不胜愁.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谁家今夜扁舟子? 何处相思明月楼?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "可怜楼上月徘徊, 应照离人妆镜台.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "玉户帘中卷不去, 捣衣砧上拂还来.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此时相望不相闻, 愿逐月华流照君.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鸿雁长飞光不度, 鱼龙潜跃水成文.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "昨夜闲潭梦落花, 可怜春半不还家.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江水流春去欲尽, 江潭落月复西斜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "斜月沉沉藏海雾, 碣石潇湘无限路.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不知乘月几人归, 落月摇情满江树.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "望海潮·东南形胜": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "东南形胜, 三吴都会, 钱塘自古繁华.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "烟柳画桥, 风帘翠幕, 参差十万人家.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "云树绕堤沙, 怒涛卷霜雪, 天堑无涯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "市列珠玑, 户盈罗绮, 竞豪奢.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "重湖叠𪩘清嘉, 有三秋桂子, 十里荷花.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "异日图将好景, 归去凤池夸.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "朝天子·咏喇叭": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "喇叭, 唢呐, 曲儿小腔儿大": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "官船来往乱如麻, 全仗你抬声价": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "军听了军愁, 民听了民怕": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "哪里去辨甚么真共假?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "眼见的吹翻了这家, 吹伤了那家,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "只吹的水尽鹅飞罢!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "李凭箜篌引": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吴丝蜀桐张高秋, 空山凝云颓不流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江娥啼竹素女愁, 李凭中国弹箜篌.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "昆山玉碎凤凰叫, 芙蓉泣露香兰笑.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "十二门前融冷光, 二十三丝动紫皇.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "女娲炼石补天处, 石破天惊逗秋雨.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "梦入神山教神妪, 老鱼跳波瘦蛟舞.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吴质不眠倚桂树, 露脚斜飞湿寒兔.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "桂枝香·金陵怀古": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登临送目, 正故国晚秋, 天气初肃.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千里澄江似练, 翠峰如簇.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "归帆去棹残阳里, 背西风, 酒旗斜矗.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "彩舟云淡, 星河鹭起, 画图难足.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "念往昔, 繁华竞逐.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "叹门外楼头, 悲恨相续.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千古凭高对此, 谩嗟荣辱.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "六朝旧事随流水, 但寒烟衰草凝绿.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "至今商女, 时时犹唱, 后庭遗曲.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "梦游天姥吟留别": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "天姥连天向天横, 势拔五岳掩赤城.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "天台四万八千丈, 对此欲倒东南倾.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "我欲因之梦吴越, 一夜飞度镜湖月.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "湖月照我影, 送我至剡溪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谢公宿处今尚在, 渌水荡漾清猿啼.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "脚著谢公屐, 身登青云梯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "半壁见海日, 空中闻天鸡.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千岩万转路不定, 迷花倚石忽已暝.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "熊咆龙吟殷岩泉, 栗深林兮惊层巅.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "云青青兮欲雨, 水澹澹兮生烟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "列缺霹雳, 丘峦崩摧.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "洞天石扉, 訇然中开.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "青冥浩荡不见底, 日月照耀金银台.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "霓为衣兮风为马, 云之君兮纷纷而来下.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虎鼓瑟兮鸾回车, 仙之人兮列如麻.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "忽魂悸以魄动, 恍惊起而长嗟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "惟觉时之枕席, 失向来之烟霞.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "世间行乐亦如此, 古来万事东流水.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "安能摧眉折腰事权贵, 使我不得开心颜?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "永遇乐·京口北固亭怀古": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千古江山, 英雄无觅, 孙仲谋处.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "舞榭歌台, 风流总被, 雨打风吹去.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "斜阳草树, 寻常巷陌, 人道寄奴曾住.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "想当年, 金戈铁马, 气吞万里如虎.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "元嘉草草, 封狼居胥, 赢得仓皇北顾.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "四十三年, 望中犹记, 烽火扬州路.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "可堪回首, 佛狸祠下, 一片神鸦社鼓.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "凭谁问: 廉颇老矣, 尚能饭否?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江城子·乙卯正月二十日夜记梦": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "十年生死两茫茫, 不思量, 自难忘": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千里孤坟, 无处话凄凉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "纵使相逢应不识, 尘满面, 鬓如霜": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "夜来幽梦忽还乡, 小轩窗, 正梳妆": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "相顾无言, 惟有泪千行": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "料得年年肠断处, 明月夜, 短松冈": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "涉江采芙蓉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "涉江采芙蓉, 兰泽多芳草.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "采之欲遗谁? 所思在远道.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "还顾望旧乡, 长路漫浩浩.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "同心而离居, 忧伤以终老.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "燕歌行": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "汉家烟尘在东北, 汉将辞家破残贼.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "男儿本自重横行, 天子非常赐颜色.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "摐金伐鼓下榆关, 旌旆逶迤碣石间.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "校尉羽书飞瀚海, 单于猎火照狼山.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "山川萧条极边土, 胡骑凭陵杂风雨.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "战士军前半死生, 美人帐下犹歌舞!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "大漠穷秋塞草腓, 孤城落日斗兵稀.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "身当恩遇常轻敌, 力尽关山未解围.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "铁衣远戍辛勤久, 玉箸应啼别离后.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "少妇城南欲断肠, 征人蓟北空回首.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "边庭飘飖那可度, 绝域苍茫无所有.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "杀气三时作阵云, 寒声一夜传刁斗.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "相看白刃血纷纷, 死节从来岂顾勋!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君不见沙场征战苦, 至今犹忆李将军.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "琵琶行": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "浔阳江头夜送客, 枫叶荻花秋瑟瑟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "主人下马客在船, 举酒欲饮无管弦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "醉不成欢惨将别, 别时茫茫江浸月.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "忽闻水上琵琶声, 主人忘归客不发.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "寻声暗问弹者谁, 琵琶声停欲语迟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "移船相近邀相见, 添酒回灯重开宴.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "千呼万唤始出来, 犹抱琵琶半遮面.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "转轴拨弦三两声, 未成曲调先有情.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "弦弦掩抑声声思, 似诉平生不得志.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "低眉信手续续弹, 说尽心中无限事.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "轻拢慢捻抹复挑, 初为《霓裳》后《六幺》.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "大弦嘈嘈如急雨, 小弦切切如私语.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "嘈嘈切切错杂弹, 大珠小珠落玉盘.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "间关莺语花底滑, 幽咽泉流冰下难.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "冰泉冷涩弦凝绝, 凝绝不通声暂歇.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "别有幽愁暗恨生, 此时无声胜有声.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "银瓶乍破水浆迸, 铁骑突出刀枪鸣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "曲终收拨当心画, 四弦一声如裂帛.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "东船西舫悄无言, 唯见江心秋月白.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "沉吟放拨插弦中, 整顿衣裳起敛容.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自言本是京城女, 家在虾蟆陵下住.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "十三学得琵琶成, 名属教坊第一部.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "曲罢曾教善才服, 妆成每被秋娘妒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "五陵年少争缠头, 一曲红绡不知数.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "钿头银篦击节碎, 血色罗裙翻酒污.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今年欢笑复明年, 秋月春风等闲度.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "弟走从军阿姨死, 暮去朝来颜色故.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "门前冷落鞍马稀, 老大嫁作商人妇.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "商人重利轻别离, 前月浮梁买茶去.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "去来江口守空船, 绕船月明江水寒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "夜深忽梦少年事, 梦啼妆泪红阑干.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "我闻琵琶已叹息, 又闻此语重唧唧.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "同是天涯沦落人, 相逢何必曾相识!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "我从去年辞帝京, 谪居卧病浔阳城.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "浔阳地僻无音乐, 终岁不闻丝竹声.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "住近湓江地低湿, 黄芦苦竹绕宅生.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其间旦暮闻何物? 杜鹃啼血猿哀鸣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "春江花朝秋月夜, 往往取酒还独倾.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂无山歌与村笛, 呕哑嘲哳难为听.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今夜闻君琵琶语, 如听仙乐耳暂明.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "莫辞更坐弹一曲, 为君翻作《琵琶行》.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "感我此言良久立, 却坐促弦弦转急.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "凄凄不似向前声, 满座重闻皆掩泣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "座中泣下谁最多? 江州司马青衫湿.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登岳阳楼": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "昔闻洞庭水, 今上岳阳楼.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吴楚东南坼, 乾坤日夜浮.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "亲朋无一字, 老病有孤舟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "戎马关山北, 凭轩涕泗流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登快阁": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "痴儿了却公家事, 快阁东西倚晚晴.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "落木千山天远大, 澄江一道月分明.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "朱弦已为佳人绝, 青眼聊因美酒横.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "万里归船弄长笛, 此心吾与白鸥盟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登泰山记": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "泰山之阳, 汶水西流; 其阴, 济水东流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "阳谷皆入汶, 阴谷皆入济.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "当其南北分者, 古长城也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "最高日观峰, 在长城南十五里.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "是月丁未, 与知府朱孝纯子颍由南麓登.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "四十五里, 道皆砌石为磴, 其级七千有余.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "泰山正南面有三谷.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "中谷绕泰安城下, 郦道元所谓环水也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "古时登山, 循东谷入, 道有天门.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "东谷者, 古谓之天门溪水, 余所不至也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今所经中岭及山巅, 崖限当道者, 世皆谓之天门云.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "道中迷雾冰滑, 磴几不可登.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "及既上, 苍山负雪, 明烛天南.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "戊申晦, 五鼓, 与子颍坐日观亭, 待日出.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "大风扬积雪击面.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "亭东自足下皆云漫.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "稍见云中白若樗蒱数十立者, 山也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "极天云一线异色, 须臾成五采.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "日上, 正赤如丹, 下有红光动摇承之.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "或曰, 此东海也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "亭西有岱祠, 又有碧霞元君祠.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "皇帝行宫在碧霞元君祠东.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "僻不当道者, 皆不及往.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "山多石, 少土.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "石苍黑色, 多平方, 少圜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "少杂树, 多松, 生石罅, 皆平顶.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "冰雪, 无瀑水, 无鸟兽音迹.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "至日观数里内无树, 而雪与人膝齐.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "桐城姚鼐记.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "登高": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "风急天高猿啸哀, 渚清沙白鸟飞回.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "无边落木萧萧下, 不尽长江滚滚来.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "万里悲秋常作客, 百年多病独登台.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "艰难苦恨繁霜鬓, 潦倒新停浊酒杯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "短歌行": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "对酒当歌, 人生几何!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "譬如朝露, 去日苦多.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "慨当以慷, 忧思难忘.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "何以解忧? 唯有杜康.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "青青子衿, 悠悠我心.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "但为君故, 沉吟至今.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "呦呦鹿鸣, 食野之苹.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "我有嘉宾, 鼓瑟吹笙.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "明明如月, 何时可掇?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "忧从中来, 不可断绝.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "越陌度阡, 枉用相存.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "契阔谈讌, 心念旧恩.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "月明星稀, 乌鹊南飞.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "绕树三匝, 何枝可依?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "山不厌高, 海不厌深.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "周公吐哺, 天下归心.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "石钟山记": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "《水经》云:\"彭蠡之口有石钟山焉\"": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "是说也, 人常疑之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "至唐李渤始访其遗踪, 得双石于潭上": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自以为得之矣": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然是说也, 余尤疑之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "石之铿然有声者, 所在皆是也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而此独以钟名, 何哉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "元丰七年六月丁丑, 余自齐安舟行适临汝": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而长子迈将赴饶之德兴尉, 送之至湖口": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "因得观所谓石钟者": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余固笑而不信也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "至暮夜月明, 独与迈乘小舟, 至绝壁下": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "大石侧立千尺, 如猛兽奇鬼, 森然欲搏人": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而山上栖鹘, 闻人声亦惊起, 磔磔云霄间": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "又有若老人咳且笑于山谷中者, 或曰此鹳鹤也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余方心动欲还, 而大声发于水上": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "噌吰如钟鼓不绝": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "舟人大恐": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "徐而察之, 则山下皆石穴罅": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不知其浅深, 微波入焉, 涵澹澎湃而为此也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "舟回至两山间, 将入港口, 有大石当中流": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "可坐百人, 空中而多窍": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "与风水相吞吐, 有窾坎镗鞳之声": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "与向之噌吰者相应, 如乐作焉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "因笑谓迈曰:\"汝识之乎\"": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "噌吰者, 周景王之无射也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "窾坎镗鞳者, 魏庄子之歌钟也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "古之人不余欺也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "事不目见耳闻, 而臆断其有无, 可乎": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "郦元之所见闻殆与余同, 而言之不详": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "士大夫终不肯以小舟夜泊绝壁之下": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故莫能知": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而渔工水师虽知而不能言": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此世所以不传也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而陋者乃以斧斤考击而求之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自以为得其实": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余是以记之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盖叹郦元之简, 而笑李渤之陋也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "离骚": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "帝高阳之苗裔兮, 朕皇考曰伯庸.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "摄提贞于孟陬兮, 惟庚寅吾以降.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "皇览揆余初度兮, 肇锡余以嘉名.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "名余曰正则兮, 字余曰灵均.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "纷吾既有此内美兮, 又重之以修能.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "扈江离与辟芷兮, 纫秋兰以为佩.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "汩余若将不及兮, 恐年岁之不吾与.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "朝搴阰之木兰兮, 夕揽洲之宿莽.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "日月忽其不淹兮, 春与秋其代序.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "惟草木之零落兮, 恐美人之迟暮.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不抚壮而弃秽兮, 何不改此度?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "乘骐骥以驰骋兮, 来吾道夫先路!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "长太息以掩涕兮, 哀民生之多艰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余虽好修姱以鞿羁兮, 謇朝谇而夕替.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "既替余以蕙纕兮, 又申之以揽茝.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "亦余心之所善兮, 虽九死其犹未悔.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "怨灵修之浩荡兮, 终不察夫民心.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "众女嫉余之蛾眉兮, 谣诼谓余以善淫.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "固时俗之工巧兮, 偭规矩而改错.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "背绳墨以追曲兮, 竞周容以为度.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "忳郁邑余侘傺兮, 吾独穷困乎此时也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "宁溘死以流亡兮, 余不忍为此态也!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鸷鸟之不群兮, 自前世而固然.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "何方圜之能周兮, 夫孰异道而相安?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "屈心而抑志兮, 忍尤而攘诟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "伏清白以死直兮, 固前圣之所厚.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "悔相道之不察兮, 延伫乎吾将反.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "回朕车以复路兮, 及行迷之未远.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "步余马于兰皋兮, 驰椒丘且焉止息.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "进不入以离尤兮, 退将复修吾初服.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "制芰荷以为衣兮, 集芙蓉以为裳.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不吾知其亦已兮, 苟余情其信芳.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "高余冠之岌岌兮, 长余佩之陆离.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "芳与泽其杂糅兮, 唯昭质其犹亏.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "忽反顾以游目兮, 将往观乎四荒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "佩缤纷其繁饰兮, 芳菲菲其弥章.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "民生各有所乐兮, 余独好修以为常.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虽体解吾犹未变兮, 岂余心之可惩?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "种树郭橐驼传": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "郭橐驼, 不知始何名.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "驼闻之, 曰:'甚善.名我固当.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "因舍其名, 亦自谓橐驼云.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其乡曰丰乐乡, 在长安西.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "他植者虽窥伺效慕, 莫能如也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "既然已, 勿动勿虑, 去不复顾.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其莳也若子, 其置也若弃, 则其天者全而其性得矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吾又何能为哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "问者曰:'以子之道, 移之官理, 可乎?'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "驼曰:'我知种树而已, 官理, 非吾业也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "'鸣鼓而聚之, 击木而召之.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故病且怠.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "若是, 则与吾业者其亦有类乎?'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "传其事以为官戒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "答司马谏议书": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "辟邪说, 难壬人, 不为拒谏.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "至于怨诽之多, 则固前知其如此也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "如曰今日当一切不事事, 守前所为而已, 则非某之所敢知.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "无由会晤, 不任区区向往之至!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "苏幕遮·燎沉香": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "燎沉香, 消溽暑": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鸟雀呼晴, 侵晓窥檐语": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "叶上初阳干宿雨, 水面清圆, 一一风荷举": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "故乡遥, 何日去?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "家住吴门, 久作长安旅": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "五月渔郎相忆否?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "小楫轻舟, 梦入芙蓉浦": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "菩萨蛮·书江西造口壁": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "郁孤台下清江水, 中间多少行人泪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "西北望长安, 可怜无数山.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "青山遮不住, 毕竟东流去.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "江晚正愁余, 山深闻鹧鸪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "菩萨蛮·小山重叠金明灭": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鬓云欲度香腮雪": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "懒起画蛾眉, 弄妆梳洗迟": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "照花前后镜, 花面交相映": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "新帖绣罗襦, 双双金鹧鸪": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虞美人": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "春花秋月何时了, 往事知多少.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "小楼昨夜又东风, 故国不堪回首月明中.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "雕阑玉砌应犹在, 只是朱颜改.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "问君能有几多愁, 恰是一江春水向东流.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蜀相": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "丞相祠堂何处寻? 锦官城外柏森森.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "映阶碧草自春色, 隔叶黄鹂空好音.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "三顾频烦天下计, 两朝开济老臣心.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "出师未捷身先死, 长使英雄泪满襟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蜀道难": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "噫吁嚱, 危乎高哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蜀道之难, 难于上青天!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蚕丛及鱼凫, 开国何茫然!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "尔来四万八千岁, 不与秦塞通人烟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "西当太白有鸟道, 可以横绝峨眉巅.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "地崩山摧壮士死, 然后天梯石栈相钩连.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "上有六龙回日之高标, 下有冲波逆折之回川.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "黄鹤之飞尚不得过, 猿猱欲度愁攀援.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "青泥何盘盘, 百步九折萦岩峦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "扪参历井仰胁息, 以手抚膺坐长叹.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "问君西游何时还? 畏途巉岩不可攀.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "但见悲鸟号古木, 雄飞雌从绕林间.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "又闻子规啼夜月, 愁空山.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蜀道之难, 难于上青天, 使人听此凋朱颜!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "连峰去天不盈尺, 枯松倒挂倚绝壁.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "飞湍瀑流争喧豗, 砯崖转石万壑雷.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其险也如此, 嗟尔远道之人胡为乎来哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "所守或匪亲, 化为狼与豺.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "锦城虽云乐, 不如早还家.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蜀道之难, 难于上青天, 侧身西望长咨嗟!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "论语·侍坐": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "子路、曾皙、冉有、公西华侍坐": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "夫子哂之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "求! 尔何如?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "赤! 尔何如?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "点! 尔何如?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "子曰: 何伤乎? 亦各言其志也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "夫子喟然叹曰: 吾与点也!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "子曰: 亦各言其志也已矣": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "曰: 夫子何哂由也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "曰: 为国以礼, 其言不让, 是故哂之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "唯求则非邦也与?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "安见方六七十如五六十而非邦也者?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "唯赤则非邦也与?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "论语·学而八佾": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人而不仁, 如礼何? 人而不仁, 如乐何?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "朝闻道, 夕死可矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君子喻于义, 小人喻于利.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "见贤思齐焉, 见不贤而内自省也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "质胜文则野, 文胜质则史. 文质彬彬, 然后君子.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "知者不惑, 仁者不忧, 勇者不惧.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "有一言而可以终身行之者乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其'恕'乎! 己所不欲, 勿施于人.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谏太宗十思疏": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "有善始者实繁, 能克终者盖寡.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "竭诚则胡越为一体, 傲物则骨肉为行路.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "贺新郎·国脉微如缕": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "国脉微如缕": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "问长缨何时入手, 缚将戎主?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "未必人间无好汉, 谁与宽些尺度?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "试看取当年韩五": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "岂有谷城公付授, 也不干曾遇骊山母": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谈笑起, 两河路": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "少时棋柝曾联句": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "叹而今登楼揽镜, 事机频误": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "闻说北风吹面急, 边上冲梯屡舞": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君莫道投鞭虚语": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自古一贤能制难, 有金汤便可无张许?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "快投笔, 莫题柱": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "赤壁赋": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "清风徐来, 水波不兴": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "举酒属客, 诵明月之诗, 歌窈窕之章": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "少焉, 月出于东山之上, 徘徊于斗牛之间": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "白露横江, 水光接天": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "纵一苇之所如, 凌万顷之茫然": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "浩浩乎如冯虚御风, 而不知其所止": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "飘飘乎如遗世独立, 羽化而登仙": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "于是饮酒乐甚, 扣舷而歌之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "歌曰: '桂棹兮兰桨, 击空明兮溯流光'": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "渺渺兮予怀, 望美人兮天一方": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "客有吹洞箫者, 倚歌而和之": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其声呜呜然, 如怨如慕, 如泣如诉": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余音袅袅, 不绝如缕": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "舞幽壑之潜蛟, 泣孤舟之嫠妇": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "苏子愀然, 正襟危坐而问客曰": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "何为其然也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "西望夏口, 东望武昌, 山川相缪, 郁乎苍苍": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此非孟德之困于周郎者乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "方其破荆州, 下江陵, 顺流而东也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "舳舻千里, 旌旗蔽空": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "酾酒临江, 横槊赋诗": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "固一世之雄也, 而今安在哉?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "驾一叶之扁舟, 举匏樽以相属": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "寄蜉蝣于天地, 渺沧海之一粟": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "哀吾生之须臾, 羡长江之无穷": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "挟飞仙以遨游, 抱明月而长终": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "知不可乎骤得, 托遗响于悲风": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "苏子曰: '客亦知夫水与月乎?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "逝者如斯, 而未尝往也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盈虚者如彼, 而卒莫消长也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盖将自其变者而观之, 则天地曾不能以一瞬": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自其不变者而观之, 则物与我皆无尽也": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而又何羡乎!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "且夫天地之间, 物各有主": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "苟非吾之所有, 虽一毫而莫取": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "惟江上之清风, 与山间之明月": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "耳得之而为声, 目遇之而成色": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "取之无禁, 用之不竭": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "是造物者之无尽藏也, 而吾与子之所共适": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "客喜而笑, 洗盏更酌": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "肴核既尽, 杯盘狼籍": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "相与枕藉乎舟中, 不知东方之既白": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "过秦论": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "秦孝公据崤函之固, 拥雍州之地,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "君臣固守以窥周室,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "当是时也, 商君佐之,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "内立法度, 务耕织, 修守战之具,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "外连衡而斗诸侯.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "于是秦人拱手而取西河之外.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "孝公既没, 惠文、武、昭襄蒙故业, 因遗策,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "诸侯恐惧, 会盟而谋弱秦,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "不爱珍器重宝肥饶之地, 以致天下之士,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "合从缔交, 相与为一.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "尝以十倍之地, 百万之众, 叩关而攻秦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "秦人开关延敌, 九国之师, 逡巡而不敢进.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "秦无亡矢遗镞之费, 而天下诸侯已困矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "于是从散约败, 争割地而赂秦.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "因利乘便, 宰割天下, 分裂山河.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "强国请服, 弱国入朝.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "延及孝文王、庄襄王, 享国之日浅, 国家无事.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "及至始皇, 奋六世之余烈, 振长策而御宇内,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吞二周而亡诸侯, 履至尊而制六合,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "执敲扑而鞭笞天下, 威振四海.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "南取百越之地, 以为桂林、象郡; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "百越之君, 俯首系颈, 委命下吏.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "胡人不敢南下而牧马, 士不敢弯弓而报怨.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "于是废先王之道, 焚百家之言, 以愚黔首; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "隳名城, 杀豪杰; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然后践华为城, 因河为池,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "据亿丈之城, 临不测之渊, 以为固.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "良将劲弩守要害之处, 信臣精卒陈利兵而谁何.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "始皇既没, 余威震于殊俗.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蹑足行伍之间, 而倔起阡陌之中,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "率疲弊之卒, 将数百之众, 转而攻秦; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "斩木为兵, 揭竿为旗,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "天下云集响应, 赢粮而景从.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "山东豪俊遂并起而亡秦族矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "且夫天下非小弱也, 雍州之地, 崤函之固, 自若也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "锄櫌棘矜, 非铦于钩戟长铩也; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谪戍之众, 非抗于九国之师也; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "深谋远虑, 行军用兵之道, 非及乡时之士也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然而成败异变, 功业相反, 何也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "试使山东之国与陈涉度长絜大, 比权量力,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "则不可同年而语矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然后以六合为家, 崤函为宫; ": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "仁义不施而攻守之势异也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "锦瑟": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "锦瑟无端五十弦, 一弦一柱思华年.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "庄生晓梦迷蝴蝶, 望帝春心托杜鹃.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "沧海月明珠有泪, 蓝田日暖玉生烟.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此情可待成追忆, 只是当时已惘然.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "长亭送别": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "碧云天, 黄花地, 西风紧, 北雁南飞.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "晓来谁染霜林醉? 总是离人泪.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "阿房宫赋": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "六王毕, 四海一, 蜀山兀, 阿房出.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "覆压三百余里, 隔离天日.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "骊山北构而西折, 直走咸阳.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "二川溶溶, 流入宫墙.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "长桥卧波, 未云何龙?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "复道行空, 不霁何虹?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "高低冥迷, 不知西东.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "一日之内, 一宫之间, 而气候不齐.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "明星荧荧, 开妆镜也;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "绿云扰扰, 梳晓鬟也;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "渭流涨腻, 弃脂水也;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "烟斜雾横, 焚椒兰也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "一肌一容, 尽态极妍, 缦立远视, 而望幸焉.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "有不得见者, 三十六年.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "使负栋之柱, 多于南亩之农夫;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "架梁之椽, 多于机上之工女;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "钉头磷磷, 多于在庾之粟粒;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "瓦缝参差, 多于周身之帛缕;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "直栏横槛, 多于九土之城郭;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "管弦呕哑, 多于市人之言语.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "使天下之人, 不敢言而敢怒.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "独夫之心, 日益骄固.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "戍卒叫, 函谷举, 楚人一炬, 可怜焦土!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "灭六国者六国也, 非秦也; 族秦者秦也, 非天下也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "嗟乎! 使六国各爱其人, 则足以拒秦;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "使秦复爱六国之人, 则递三世可至万世而为君,": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "谁得而族灭也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "秦人不暇自哀, 而后人哀之;": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "后人哀之而不鉴之, 亦使后人而复哀后人也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "陈情表": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣密言: 臣以险衅, 夙遭闵凶.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "生孩六月, 慈父见背; 行年四岁, 舅夺母志.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "祖母刘愍臣孤弱, 躬亲抚养.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣少多疾病, 九岁不行, 零丁孤苦, 至于成立.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "逮奉圣朝, 沐浴清化.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣以供养无主, 辞不赴命.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "猥以微贱, 当侍东宫, 非臣陨首所能上报.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣具以表闻, 辞不就职.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣之进退, 实为狼狈.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣无祖母, 无以至今日, 祖母无臣, 无以终余年.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "母孙二人, 更相为命, 是以区区不能废远.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "乌鸟私情, 愿乞终养.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣生当陨首, 死当结草.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "臣不胜犬马怖惧之情, 谨拜表以闻.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "青玉案·元夕": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "东风夜放花千树, 更吹落、星如雨": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "宝马雕车香满路": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "凤箫声动, 玉壶光转, 一夜鱼龙舞": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蛾儿雪柳黄金缕, 笑语盈盈暗香去": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "众里寻他千百度": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "蓦然回首, 那人却在, 灯火阑珊处": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "静女": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "静女其娈, 贻我彤管. 彤管有炜, 说怿女美.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "自牧归荑, 洵美且异. 匪女之为美, 美人之贻.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "项脊轩志": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "项脊轩, 旧南阁子也.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "室仅方丈, 可容一人居.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "又北向, 不能得日, 日过午已昏.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余稍为修葺, 使不上漏.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "然余居于此, 多可喜, 亦多可悲.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "先是庭中通南北为一.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "迨诸父异爨, 内外多置小门墙, 往往而是.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "东犬西吠, 客逾庖而宴, 鸡栖于厅.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "庭中始为篱, 已为墙, 凡再变矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "家有老妪, 尝居于此.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "妪, 先大母婢也, 乳二世, 先妣抚之甚厚.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "室西连于中闺, 先妣尝一至.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余自束发读书轩中, 一日, 大母过余曰:": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "比去, 以手阖门, 自语曰:": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吾家读书久不效, 儿之成, 则可待乎!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "顷之, 持一象笏至, 曰:": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "此吾祖太常公宣德间执此以朝, 他日汝当用之!": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "瞻顾遗迹, 如在昨日, 令人长号不自禁.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余扃牖而居, 久之, 能以足音辨人.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "轩凡四遭火, 得不焚, 殆有神护者.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "吾妻归宁, 述诸小妹语曰:": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "闻姊家有阁子, 且何谓阁子也?": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "其后六年, 吾妻死, 室坏不修.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "鹊桥仙": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "纤云弄巧, 飞星传恨, 银汉迢迢暗度.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "金风玉露一相逢, 便胜却人间无数.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "柔情似水, 佳期如梦, 忍顾鹊桥归路.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - }, - "两情若是久长时, 又岂在朝朝暮暮.": { - "NSP-0": { - "real_rept": 0, - "important": 0, - "rept": 0, - "interval": 0, - "last_date": 0, - "next_date": 0, - "is_activated": 0, - "last_modify": 1777751808.8809566 - } - } -} \ No newline at end of file diff --git a/data/repo/cngk-t/manifest.toml b/data/repo/cngk-t/manifest.toml deleted file mode 100644 index d914da1..0000000 --- a/data/repo/cngk-t/manifest.toml +++ /dev/null @@ -1,4 +0,0 @@ -title = "高考必背古诗文-筛选" -package = "cngk-t" -author = "__heurams__" -desc = "高考古诗文 60 篇" diff --git a/data/repo/cngk-t/payload.toml b/data/repo/cngk-t/payload.toml deleted file mode 100644 index d97b218..0000000 --- a/data/repo/cngk-t/payload.toml +++ /dev/null @@ -1,5705 +0,0 @@ -["临安春雨初霁"] -note = ['陆游〔宋代〕'] -content = "临安/春雨/初霁/" -translation = "临安春雨初霁" -keyword_note = { "临安" = "南宋都城, 今杭州", "霁" = "雨后或雪后转晴" } - -["世味年来薄似纱, 谁令骑马客京华."] -note = [] -content = "世味/年来/薄似纱/, 谁令/骑马/客/京华./" -translation = "这些年世态人情淡薄得似纱, 谁又让我乘马来到京都作客沾染繁华? " -keyword_note = { "世味" = "人世滋味; 社会人情", "客" = "客居", "京华" = "京城之美称, 这里指当时的京城临安" } - -["小楼一夜听春雨, 深巷明朝卖杏花."] -note = [] -content = "小楼/一夜/听/春雨/, 深巷/明朝/卖/杏花./" -translation = "住在小楼听尽了一夜的春雨淅沥滴答, 明日一早, 深幽的小巷便有人叫卖杏花. " -keyword_note = { "深巷" = "很长的巷道", "明朝" = "明日早晨" } - -["矮纸斜行闲作草, 晴窗细乳戏分茶."] -note = [] -content = "矮纸/斜行/闲/作草/, 晴窗/细乳/戏/分茶./" -translation = "铺开小纸从容地斜写着草书, 在小雨初晴的窗边细细地煮水、沏茶、撇沫, 试品名茶. " -keyword_note = { "矮纸" = "短纸、小纸", "斜行" = "倾斜的行列", "草" = "指草书", "晴窗" = "明亮的窗户", "细乳" = "沏茶时水面呈白色的小泡沫", "分茶" = "宋元时煎茶之法" } - -["素衣莫起风尘叹, 犹及清明可到家."] -note = [] -content = "素衣/莫起/风尘/叹/, 犹及/清明/可/到家./" -translation = "不要叹息那京都的尘土会弄脏洁白的衣衫, 清明时节还来得及回到镜湖边的山阴故家. " -keyword_note = { "素衣" = "原指白色的衣服, 这里用作代称. 是诗人对自己的谦称", "风尘叹" = "因风尘而叹息. 暗指不必担心京城的不良风气会污染自己的品质" } - -["书愤"] -note = [] -content = "书愤/" -translation = "书愤" -keyword_note = {} - -["早岁那知世事艰, 中原北望气如山"] -note = [] -content = "早岁/那知/世事/艰/, 中原/北望/气/如山/" -translation = "年轻时就立志北伐中原, 哪想到竟然是如此艰难. 我常常北望那中原大地, 热血沸腾啊怨气如山啊" -keyword_note = { "早岁" = "年轻时", "世事艰" = "世事艰难 (指北伐中原的艰难) ", "气如山" = "豪气如山涌" } - -["楼船夜雪瓜洲渡, 铁马秋风大散关"] -note = ['瓜洲渡: 宋军在东南抗击金兵进犯之地', '大散关: 陆游在南郑参加王炎军幕事时与金兵发生遭遇战之地'] -content = "楼船/夜雪/瓜洲/渡/, 铁马/秋风/大散关/" -translation = "记得在瓜州渡痛击金兵, 雪夜里飞奔着楼船战舰. 秋风中跨战马纵横驰骋, 收复了大散关捷报频传" -keyword_note = { "楼船" = "雄伟的战舰", "铁马" = "披铁甲的战马", "瓜洲渡" = "东南抗金要地", "大散关" = "西北抗金关隘" } - -["塞上长城空自许, 镜中衰鬓已先斑"] -note = ["塞上长城: 用南朝刘宋名将檀道济自称'万里长城'的典故"] -content = "塞上/长城/空/自许/, 镜中/衰鬓/已/先斑/" -translation = "想当初我自比万里长城, 立壮志为祖国扫除边患. 到如今垂垂老鬓发如霜, 盼北伐盼恢复都成空谈" -keyword_note = { "塞上长城" = "自比为保卫国家的长城", "空自许" = "徒然自许", "衰鬓" = "衰老的鬓发", "先斑" = "先已花白" } - -["出师一表真名世, 千载谁堪伯仲间"] -note = ['出师一表: 指诸葛亮的《出师表》', '伯仲间: 相提并论的意思'] -content = "出师/一表/真/名世/, 千载/谁堪/伯仲/间/" -translation = "不由人缅怀那诸葛孔明, 出师表真可谓名不虚传, 有谁像诸葛亮鞠躬尽瘁, 率三军复汉室北定中原" -keyword_note = { "出师一表" = "诸葛亮的《出师表》", "名世" = "名传于世", "伯仲间" = "相提并论" } - -["五代史伶官传序"] -note = [] -content = "五代史伶官传序/" -translation = "五代史伶官传序" -keyword_note = {} - -["呜呼! 盛衰之理, 虽曰天命, 岂非人事哉!"] -note = ['《五代史伶官传序》开篇提出中心论点'] -content = "呜呼! /盛衰/之/理/, 虽/曰/天命/, 岂非/人事/哉!/" -translation = "唉! 盛衰的道理, 虽说是天命决定的, 难道说不是人事造成的吗? " -keyword_note = { "盛衰" = "兴盛和衰败", "理" = "道理", "虽" = "虽然", "天命" = "天意", "岂非" = "难道不是", "人事" = "人的作为" } - -["原庄宗之所以得天下, 与其所以失之者, 可以知之矣"] -note = [] -content = "原/庄宗/之所以/得/天下/, 与/其/所以/失之/者/, 可以/知/之/矣/" -translation = "推究庄宗取得天下的原因, 与他失去天下的原因, 就可以明白了" -keyword_note = { "原" = "推究", "庄宗" = "后唐庄宗李存勖", "所以" = "...的原因", "得" = "取得", "失" = "失去" } - -["世言晋王之将终也, 以三矢赐庄宗而告之曰:"] -note = [] -content = "世言/晋王/之/将终/也/, 以/三矢/赐/庄宗/而/告之/曰/:/" -translation = "世人传说晋王临死时, 把三支箭赐给庄宗, 并告诉他说" -keyword_note = { "世言" = "世人传说", "晋王" = "李克用", "将终" = "临死", "矢" = "箭", "赐" = "赏赐" } - -["梁, 吾仇也; 燕王, 吾所立; 契丹与吾约为兄弟; 而皆背晋以归梁"] -note = [] -content = "梁/, 吾/仇/也; /燕王/, 吾/所立; /契丹/与/吾/约/为/兄弟; /而/皆/背/晋/以/归/梁/" -translation = "梁王朱温是我的仇敌, 燕王是我推立的, 契丹与我约为兄弟, 可是后来都背叛我去投靠了梁" -keyword_note = { "梁" = "后梁太祖朱温", "仇" = "仇敌", "燕王" = "刘仁恭", "所立" = "所推立", "契丹" = "北方部族", "约" = "订立盟约", "背" = "背叛", "归" = "归顺" } - -["此三者, 吾遗恨也. 与尔三矢, 尔其无忘乃父之志!"] -note = [] -content = "此/三者/, 吾/遗恨/也. /与/尔/三矢/, 尔/其/无忘/乃父/之/志!/" -translation = "这三件事是我的遗恨. 交给你三支箭, 你千万不要忘记你父亲报仇的志向" -keyword_note = { "三者" = "三件事", "遗恨" = "遗留的恨事", "与" = "给", "尔" = "你", "其" = "一定 (表祈使) ", "无忘" = "不要忘记", "乃父" = "你的父亲" } - -["庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之"] -note = [] -content = "庄宗/受/而/藏之/于/庙. /其后/用兵/, 则/遣/从事/以/一少牢/告庙/, 请/其/矢/, 盛/以/锦囊/, 负/而/前驱/, 及/凯旋/而/纳之/" -translation = "庄宗接受了箭, 把它收藏在祖庙里. 以后庄宗出兵打仗, 便派手下的随从官员, 用猪羊去祭告祖先, 从宗庙里恭敬地取出箭来, 用漂亮的锦囊装着, 背着它走在前面, 等到凯旋时再把箭藏入祖庙" -keyword_note = { "受" = "接受", "庙" = "祖庙", "从事" = "随从官员", "少牢" = "用猪羊祭祀", "告庙" = "祭告祖庙", "锦囊" = "丝绸袋子", "负" = "背着", "前驱" = "在前面走", "凯旋" = "胜利归来", "纳" = "收藏" } - -["方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!"] -note = [] -content = "方/其/系/燕/父子/以/组/, 函/梁/君臣/之/首/, 入于/太庙/, 还矢/先王/, 而/告以/成功/, 其/意气/之/盛/, 可谓/壮/哉!/" -translation = "当他用绳子绑住燕王父子, 用小木匣装着梁国君臣的头, 走进祖庙, 把箭交还到晋王的灵座前, 告诉他生前报仇的志向已经完成, 他那神情气概, 是多么威风" -keyword_note = { "方" = "当", "系" = "捆绑", "组" = "绳索", "函" = "用木匣装", "太庙" = "祖庙", "还矢" = "交还箭", "先王" = "指晋王", "意气" = "神情气概", "壮" = "威武" } - -["及仇雠已灭, 天下已定, 一夫夜呼, 乱者四应, 仓皇东出, 未及见贼而士卒离散, 君臣相顾, 不知所归"] -note = [] -content = "及/仇雠/已/灭/, 天下/已/定/, 一夫/夜呼/, 乱者/四应/, 仓皇/东出/, 未及/见贼/而/士卒/离散/, 君臣/相顾/, 不知/所归/" -translation = "等到仇敌已经消灭, 天下已经安定, 一人在夜里发难, 作乱的人四面响应, 他慌慌张张的出兵向东逃跑, 还没见到乱贼, 部下的兵士就纷纷逃散, 君臣们你看着我, 我看着你, 不知道哪里去好" -keyword_note = { "仇雠" = "仇敌", "一夫" = "一个人", "夜呼" = "在夜里呼喊", "乱者" = "作乱的人", "四应" = "在四面响应", "仓皇" = "慌张", "东出" = "向东出逃", "士卒" = "士兵", "离散" = "分散逃离", "相顾" = "互相看着" } - -["至于誓天断发, 泣下沾襟, 何其衰也!"] -note = [] -content = "至于/誓天/断发/, 泣下/沾襟/, 何其/衰/也!/" -translation = "到了割下头发来对天发誓, 抱头痛哭, 眼泪沾湿衣襟的可怜地步, 怎么那样的衰败差劲呢" -keyword_note = { "誓天" = "对天发誓", "断发" = "割断头发", "泣下" = "眼泪流下", "沾襟" = "沾湿衣襟", "何其" = "多么", "衰" = "衰败" } - -["岂得之难而失之易欤? 抑本其成败之迹, 而皆自于人欤?"] -note = [] -content = "岂/得之/难/而/失之/易/欤? /抑/本/其/成败/之/迹/, 而/皆/自于/人/欤?/" -translation = "难道说是因为取得天下难, 而失去天下容易才像这样的吗? 还是认真推究他成功失败的原因, 都是由于人事呢" -keyword_note = { "岂" = "难道", "得" = "取得", "失" = "失去", "抑" = "还是", "本" = "推究", "成败" = "成功失败", "迹" = "事迹", "自于" = "来自于" } - -["《书》曰: 满招损, 谦得益."] -note = ['引用《尚书》名言'] -content = "《/书/》/曰/: 满/招/损/, 谦/得/益./" -translation = "《尚书》上说: '自满会招来损害, 谦虚能得到益处'" -keyword_note = { "《书》" = "《尚书》", "满" = "自满", "招" = "招来", "损" = "损害", "谦" = "谦虚", "得" = "得到", "益" = "益处" } - -["忧劳可以兴国, 逸豫可以亡身, 自然之理也"] -note = [] -content = "忧劳/可以/兴国/, 逸豫/可以/亡身/, 自然/之/理/也/" -translation = "忧劳可以使国家兴盛, 安乐可以使自身灭亡, 这是自然的道理" -keyword_note = { "忧劳" = "忧虑勤劳", "兴国" = "使国家兴盛", "逸豫" = "安逸享乐", "亡身" = "使自身灭亡", "自然" = "理所当然" } - -["故方其盛也, 举天下之豪杰, 莫能与之争;"] -note = [] -content = "故/方/其/盛/也/, 举/天下/之/豪杰/, 莫/能/与/之/争;/" -translation = "因此, 当他兴盛时, 普天下的豪杰, 没有谁能和他相争" -keyword_note = { "故" = "因此", "方" = "当", "盛" = "兴盛", "举" = "全", "豪杰" = "英雄豪杰", "莫" = "没有谁" } - -["及其衰也, 数十伶人困之, 而身死国灭, 为天下笑"] -note = [] -content = "及/其/衰/也/, 数十/伶人/困之/, 而/身死/国灭/, 为/天下/笑/" -translation = "到他衰败时, 数十个乐官就把他困住, 最后身死国灭, 被天下人耻笑" -keyword_note = { "及" = "等到", "衰" = "衰败", "伶人" = "乐官", "困" = "围困", "身死" = "自身死亡", "国灭" = "国家灭亡", "为" = "被" } - -["夫祸患常积于忽微, 而智勇多困于所溺, 岂独伶人也哉?"] -note = ['文章结尾点明主旨'] -content = "夫/祸患/常/积/于/忽微/, 而/智勇/多/困/于/所溺/, 岂/独/伶人/也/哉?/" -translation = "祸患常常是由一点一滴极小的错误积累而酿成的, 纵使是聪明有才能和英勇果敢的人, 也多半沉溺于某种爱好之中, 受其迷惑而结果陷于困穷, 难道只有乐工吗" -keyword_note = { "祸患" = "灾祸", "积" = "积累", "忽微" = "极小的事情", "智勇" = "智勇的人", "困" = "受困", "所溺" = "所沉溺的事物", "岂独" = "难道只有", "伶人" = "乐工" } - -["六国论"] -note = [] -content = "六国论/" -translation = "六国论" -keyword_note = {} - -["六国破灭, 非兵不利, 战不善, 弊在赂秦."] -note = [] -content = "六国/破灭/, 非/兵/不利/, 战/不善/, 弊/在/赂秦./" -translation = "六国的灭亡, 不是 (因为他们的) 武器不锋利, 仗打得不好, 弊端在于用土地来贿赂秦国. " -keyword_note = { "兵" = "兵器", "利" = "锋利", "善" = "好", "弊" = "弊端", "赂秦" = "贿赂秦国" } - -["赂秦而力亏, 破灭之道也."] -note = [] -content = "赂秦/而/力亏/, 破灭/之/道/也./" -translation = "拿土地贿赂秦国亏损了自己的力量, (这就) 是灭亡的原因. " -keyword_note = { "力亏" = "力量亏损", "道" = "原因, 途径" } - -["或曰: 六国互丧, 率赂秦耶?"] -note = [] -content = "或/曰:/ 六国/互丧/, 率/赂秦/耶?/" -translation = "有人问: “六国一个接一个的灭亡, 难道全部是因为贿赂秦国吗? ”" -keyword_note = { "或" = "有人", "互丧" = "相继灭亡", "率" = "全都" } - -["曰: 不赂者以赂者丧."] -note = [] -content = "曰:/ 不赂者/以/赂者/丧./" -translation = " (回答) 说: “不贿赂秦国的国家因为有贿赂秦国的国家而灭亡. ”" -keyword_note = { "以" = "因为" } - -["盖失强援, 不能独完."] -note = [] -content = "盖/失/强援/, 不能/独完./" -translation = "原因是不贿赂秦国的国家失掉了强有力的外援, 不能独自保全. " -keyword_note = { "盖" = "承接上文, 表示原因", "强援" = "强有力的外援", "独完" = "独自保全" } - -["故曰: 弊在赂秦也."] -note = [] -content = "故/曰:/ 弊/在/赂秦/也./" -translation = "所以说: 弊病在于贿赂秦国. ”" -keyword_note = { "故" = "所以" } - -["秦以攻取之外, 小则获邑, 大则得城."] -note = [] -content = "秦/以/攻取/之外/, 小/则/获邑/, 大/则/得城./" -translation = "秦国除了用战争夺取土地以外, (还受到诸侯的贿赂) , 小的贿赂就获得邑镇, 大的贿赂就获得城池. " -keyword_note = { "攻取" = "用战争夺取", "邑" = "小城镇", "城" = "大城池" } - -["较秦之所得, 与战胜而得者, 其实百倍;"] -note = [] -content = "较/秦之/所得/, 与/战胜/而/得者/, 其/实/百倍;/" -translation = "比较秦国受贿赂所得到的土地与战胜别国所得到的土地, (前者)实际多百倍. " -keyword_note = { "较" = "比较", "所得" = "得到的土地", "其实" = "它实际的数量" } - -["诸侯之所亡, 与战败而亡者, 其实亦百倍."] -note = [] -content = "诸侯/之/所亡/, 与/战败/而/亡者/, 其/实/亦/百倍./" -translation = "六国诸侯 (贿赂秦国) 所丧失的土地与战败所丧失的土地相比, 实际也要多百倍. " -keyword_note = { "所亡" = "丧失的土地" } - -["则秦之所大欲, 诸侯之所大患, 固不在战矣."] -note = [] -content = "则/秦之/所/大欲/, 诸侯/之/所/大患/, 固/不/在/战/矣./" -translation = "那么秦国最想要的, 与六国诸侯最担心的, 本来就不在于战争. " -keyword_note = { "大欲" = "最想要的", "大患" = "最担心的", "固" = "本来" } - -["思厥先祖父, 暴霜露, 斩荆棘, 以有尺寸之地."] -note = [] -content = "思/厥/先祖父/, 暴/霜露/, 斩/荆棘/, 以/有/尺寸/之/地./" -translation = "想到他们的祖辈和父辈, 冒着寒霜雨露, 披荆斩棘, 才有了很少的一点土地. " -keyword_note = { "厥" = "他们的", "先祖父" = "祖辈和父辈", "暴霜露" = "暴露在霜露之中, 形容艰苦", "尺寸之地" = "很少的土地" } - -["子孙视之不甚惜, 举以予人, 如弃草芥."] -note = [] -content = "子孙/视之/不/甚惜/, 举/以/予人/, 如/弃/草芥./" -translation = "子孙对那些土地却不很爱惜, 全都拿来送给别人, 就像扔掉小草一样不珍惜. " -keyword_note = { "视" = "对待", "举" = "拿", "予" = "给", "草芥" = "小草, 比喻微不足道的东西" } - -["今日割五城, 明日割十城, 然后得一夕安寝."] -note = [] -content = "今日/割/五城/, 明日/割/十城/, 然后/得/一夕/安寝./" -translation = "今天割掉五座城, 明天割掉十座城, 这才能睡一夜安稳觉. " -keyword_note = { "割" = "割让", "安寝" = "安稳睡觉" } - -["起视四境, 而秦兵又至矣."] -note = [] -content = "起/视/四境/, 而/秦兵/又/至/矣./" -translation = "明天起床一看四周边境, 秦国的军队又来了. " -keyword_note = { "四境" = "四方边境" } - -["然则诸侯之地有限, 暴秦之欲无厌, 奉之弥繁, 侵之愈急."] -note = [] -content = "然则/诸侯/之/地/有限/, 暴秦/之/欲/无厌/, 奉之/弥繁/, 侵之/愈急./" -translation = "既然这样, 那么诸侯的土地有限, 强暴的秦国的欲望永远不会满足, (诸侯) 送给他的越多, 他侵犯得就越急迫. " -keyword_note = { "然则" = "既然这样, 那么", "暴秦" = "强暴的秦国", "无厌" = "不满足", "奉" = "奉献", "弥" = "更加", "繁" = "多", "侵" = "侵犯", "愈" = "越发" } - -["故不战而强弱胜负已判矣."] -note = [] -content = "故/不战/而/强弱/胜负/已/判/矣./" -translation = "所以用不着战争, 谁强谁弱, 谁胜谁负就已经决定了. " -keyword_note = { "判" = "决定, 分清" } - -["至于颠覆, 理固宜然."] -note = [] -content = "至于/颠覆/, 理/固/宜然./" -translation = "到了覆灭的地步,道理本来就是这样子的. " -keyword_note = { "颠覆" = "灭亡", "理" = "道理", "固" = "本来", "宜然" = "应该这样" } - -["古人云: “以地事秦, 犹抱薪救火, 薪不尽, 火不灭.”"] -note = [] -content = "古人/云:/ “以/地/事秦/, 犹/抱薪/救火/, 薪/不尽/, 火/不灭.”/" -translation = "古人说: “用土地侍奉秦国, 就好像抱柴救火, 柴不烧完, 火就不会灭. ”" -keyword_note = { "事" = "侍奉", "犹" = "好像", "抱薪救火" = "抱着柴草救火" } - -["此言得之."] -note = [] -content = "此/言/得之./" -translation = "这话说的很正确. " -keyword_note = { "得之" = "得其理, 说对了" } - -["齐人未尝赂秦, 终继五国迁灭, 何哉?"] -note = [] -content = "齐人/未尝/赂秦/, 终/继/五国/迁灭/, 何哉?/" -translation = "齐国不曾贿赂秦国, (可是) 最终也随着五国灭亡了, 为什么呢? " -keyword_note = { "未尝" = "不曾", "终" = "最终", "继" = "跟着", "迁灭" = "灭亡" } - -["与嬴而不助五国也."] -note = [] -content = "与嬴/而/不助/五国/也./" -translation = " (是因为齐国) 跟秦国交好而不帮助其他五国. " -keyword_note = { "与嬴" = "亲附秦国 (嬴是秦国的姓) " } - -["五国既丧, 齐亦不免矣."] -note = [] -content = "五国/既丧/, 齐/亦/不免/矣./" -translation = "五国已经灭亡了, 齐国也就没法幸免了. " -keyword_note = { "既" = "已经", "免" = "幸免" } - -["燕赵之君, 始有远略, 能守其土, 义不赂秦."] -note = [] -content = "燕赵/之君/, 始/有/远略/, 能/守/其土/, 义/不/赂秦./" -translation = "燕国和赵国的国君, 起初有长远的谋略, 能够守住他们的国土, 坚持正义, 不贿赂秦国. " -keyword_note = { "始" = "起初", "远略" = "长远的谋略", "义" = "坚持正义 (名词作动词) " } - -["是故燕虽小国而后亡, 斯用兵之效也."] -note = [] -content = "是故/燕/虽/小国/而/后亡/, 斯/用兵/之/效/也./" -translation = "因此燕虽然是个小国, 却后来才灭亡, 这就是用兵抗秦的效果. " -keyword_note = { "是故" = "因此", "斯" = "这", "效" = "效果, 成效" } - -["至丹以荆卿为计, 始速祸焉."] -note = [] -content = "至/丹/以/荆卿/为/计/, 始/速/祸/焉./" -translation = "等到后来燕太子丹用派遣荆轲刺杀秦王作对付秦国的计策, 这才招致了 (灭亡的) 祸患. " -keyword_note = { "丹" = "燕太子丹", "荆卿" = "荆轲", "速" = "招致" } - -["赵尝五战于秦, 二败而三胜."] -note = [] -content = "赵/尝/五战/于秦/, 二败/而/三胜./" -translation = "赵国曾经与秦国交战五次, 打了两次败仗, 三次胜仗. " -keyword_note = { "尝" = "曾经", "于" = "和, 同" } - -["后秦击赵者再, 李牧连却之."] -note = [] -content = "后/秦/击赵/者/再/, 李牧/连/却之./" -translation = "后来秦国又两次打赵国. (赵国大将) 李牧接连打退秦国的进攻. " -keyword_note = { "再" = "两次", "却之" = "使之退却, 打退它" } - -["洎牧以谗诛, 邯郸为郡, 惜其用武而不终也."] -note = [] -content = "洎/牧/以/谗/诛/, 邯郸/为/郡/, 惜/其/用武/而/不终/也./" -translation = "等到李牧因为谗言陷害被诛杀, (赵国都城) 邯郸变成 (秦国的一个) 郡, 可惜赵国用武力抗秦而没能坚持到底. " -keyword_note = { "洎" = "等到", "谗" = "谗言", "诛" = "被杀", "为郡" = "成为 (秦国的) 一个郡", "不终" = "没有坚持到底" } - -["且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已."] -note = [] -content = "且/燕赵/处/秦/革灭/殆尽/之际/, 可谓/智力/孤危/, 战败/而亡/, 诚/不得已./" -translation = "而且燕赵两国正处在秦国把其他国家快要消灭干净的时候, 可以说是智谋穷竭, 国势孤立危急, 战败了而亡国, 确实是不得已的事. " -keyword_note = { "革灭" = "消灭", "殆尽" = "几乎完了", "智力" = "智谋和力量", "孤危" = "孤立危急", "诚" = "确实" } - -["向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,"] -note = [] -content = "向使/三国/各/爱/其地/, 齐人/勿/附/于秦/, 刺客/不行/, 良将/犹在,/" -translation = "假使韩、魏、楚三国都爱惜他们的国土, 齐国不依附秦国. (燕国的) 刺客不去 (刺秦王) , (赵国的) 良将李牧还活着, " -keyword_note = { "向使" = "假使", "附" = "依附", "不行" = "不去", "犹" = "还" } - -["则胜负之数, 存亡之理, 当与秦相较, 或未易量."] -note = [] -content = "则/胜负/之数/, 存亡/之理/, 当/与/秦/相较/, 或/未/易量./" -translation = "那么胜负存亡的命运, 倘若与秦国相比较, 也许还不容易衡量 (出高低来) 呢. " -keyword_note = { "数" = "天数, 命运", "理" = "理数, 命运", "当" = "倘若", "或" = "或许", "易量" = "容易判断" } - -["呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,"] -note = [] -content = "呜呼/! 以/赂秦/之/地/封/天下/之/谋臣/, 以/事秦/之/心/礼/天下/之/奇才/, 并力/西向,/" -translation = "唉! (如果六国诸侯) 用贿赂秦国的土地来封给天下的谋臣, 用侍奉秦国的心来礼遇天下的奇才, 齐心合力地向西 (对付秦国) , " -keyword_note = { "呜呼" = "叹词, 唉", "封" = "封赏", "礼" = "礼遇 (名词作动词) ", "并力" = "合力", "西向" = "向西 (对抗秦国) " } - -["则吾恐秦人食之不得下咽也."] -note = [] -content = "则/吾/恐/秦人/食之/不得/下咽/也./" -translation = "那么, 我恐怕秦国人饭也不能咽下去. " -keyword_note = { "恐" = "恐怕", "下咽" = "咽下" } - -["悲夫! 有如此之势, 而为秦人积威之所劫, 日削月割, 以趋于亡."] -note = [] -content = "悲夫/! 有/如此/之势/, 而/为/秦人/积威/之/所劫/, 日/削/月/割/, 以/趋于/亡./" -translation = "真可悲啊! 有这样的有利形势, 却被秦国积久的威势所胁迫, 每日每月割让土地, 以至于走向灭亡. " -keyword_note = { "悲夫" = "可悲啊", "积威" = "积久而成的威势", "劫" = "胁迫", "日削月割" = "一天天地削减, 一月月地割让" } - -["为国者无使为积威之所劫哉!"] -note = [] -content = "为/国者/无/使/为/积威/之/所劫/哉!/" -translation = "治理国家的人不要被积久的威势所胁迫啊! " -keyword_note = { "为国者" = "治理国家的人", "无使" = "不要让自己" } - -["夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势."] -note = [] -content = "夫/六国/与/秦/皆/诸侯/, 其/势/弱于/秦/, 而/犹有/可以/不赂/而/胜之/之/势./" -translation = "六国和秦国都是诸侯之国, 他们的势力比秦国弱, 却还有可以不贿赂秦国而战胜它的优势. " -keyword_note = { "夫" = "句首发语词", "势" = "势力", "弱于秦" = "比秦国弱", "犹" = "仍然", "可以" = "可以凭借" } - -["苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣."] -note = [] -content = "苟/以/天下/之/大/, 下/而/从/六国/破亡/之/故事/, 是/又/在/六国/下/矣./" -translation = "如果凭借偌大国家, 却追随六国灭亡的前例, 这就比不上六国了. " -keyword_note = { "苟" = "如果", "天下之大" = "偌大的天下 (指宋朝) ", "下" = "降低身份, 这里指追随", "从" = "跟随", "故事" = "旧事, 先例", "是" = "这" } - -["劝学"] -note = [] -content = "劝学/" -translation = "劝学" -keyword_note = {} - -["君子曰: 学不可以已."] -note = [] -content = "君子/曰: /学/不可以/已./" -translation = "君子说: 学习是不可以停止的" -keyword_note = { "君子" = "指有学问有修养的人", "已" = "停止" } - -["青, 取之于蓝, 而青于蓝; 冰, 水为之, 而寒于水."] -note = [] -content = "青/, 取之/于蓝/, 而/青/于蓝; /冰/, 水/为之/, 而/寒/于水./" -translation = "靛青是从蓝草里提取的, 可是比蓝草的颜色更深; 冰是水凝结而成的, 却比水还要寒冷" -keyword_note = { "青" = "靛青, 一种染料", "蓝" = "蓼蓝, 一年生草本植物, 叶子含蓝汁, 可以做蓝色染料" } - -["木直中绳, 𫐓以为轮, 其曲中规."] -note = [] -content = "木直/中绳/, 𫐓/以为/轮/, 其曲/中规./" -translation = "一块木材直得合乎墨线, 假如用火烤使它弯曲做成车轮, 它的弧度就可以符合圆规的标准" -keyword_note = { "中绳" = "合乎拉直的墨线", "𫐓" = "通'煣', 古代用火烤使木条弯曲的一种工艺", "规" = "圆规, 画圆的工具" } - -["虽有槁暴, 不复挺者, 𫐓使之然也."] -note = [] -content = "虽/有/槁暴/, 不复/挺者/, 𫐓/使之/然也./" -translation = "即使又被风吹日晒而干枯了, 木材也不会再挺直, 是因为经过加工使它成为这样的" -keyword_note = { "有" = "通'又'", "槁暴" = "晒干. 槁, 枯. 暴, 同'曝', 晒干", "挺" = "直" } - -["故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣."] -note = [] -content = "故/木/受绳/则直/, 金/就砺/则利/, 君子/博学/而/日/参省/乎己/, 则/知明/而/行/无过矣./" -translation = "所以木材用墨线量过再经辅具加工就能取直, 刀剑在磨刀石上磨过就能变得锋利, 君子广泛地学习并且每天检验反省自己, 那么他就会智慧明达而且行为没有过失了" -keyword_note = { "受绳" = "用墨线量过", "金" = "指金属制的刀剑等", "就砺" = "拿到磨刀石上去磨", "博学" = "广泛地学习", "参省" = "检验反省. 参, 一译检验, 检查; 二译同'叁', 多次", "知" = "同'智', 见识" } - -["吾尝终日而思矣, 不如须臾之所学也; 吾尝跂而望矣, 不如登高之博见也."] -note = [] -content = "吾尝/终日/而思矣/, 不如/须臾/之所学也; /吾尝/跂/而望矣/, 不如/登高/之博见也./" -translation = "我曾经整天思索, 却不如片刻学到的知识多; 我曾经踮起脚远望, 却不如登到高处看得广阔" -keyword_note = { "须臾" = "片刻, 一会儿", "跂" = "踮起脚后跟", "博见" = "看见的范围广, 见得广" } - -["登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰."] -note = [] -content = "登高/而招/, 臂/非加长也/, 而/见者/远; /顺风/而呼/, 声/非加疾也/, 而/闻者/彰./" -translation = "登到高处招手, 胳膊没有加长, 可是别人在远处也能看见; 顺着风呼叫, 声音没有变得洪亮, 可是听的人在远处也能听得很清楚" -keyword_note = { "疾" = "声音洪大", "彰" = "明显, 清楚. 这里指听得更清楚" } - -["假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河."] -note = [] -content = "假/舆马者/, 非/利足也/, 而/致/千里; /假/舟楫者/, 非/能水也/, 而/绝/江河./" -translation = "借助车马的人, 并不是脚走得快, 却可以达到千里之外; 借助舟船的人, 并不善于游泳, 却可以横渡江河" -keyword_note = { "假" = "凭借, 利用", "舆" = "车厢, 这里指车", "利足" = "脚走得快", "水" = "游泳", "绝" = "横渡" } - -["君子生非异也, 善假于物也."] -note = [] -content = "君子/生/非异也/, 善/假于/物也./" -translation = "君子的资质秉性跟一般人没有不同, 只是君子善于借助外物罢了" -keyword_note = { "生" = "通'性', 天赋, 资质" } - -["积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉."] -note = [] -content = "积土/成山/, 风雨/兴焉; /积水/成渊/, 蛟龙/生焉; /积善/成德/, 而/神明/自得/, 圣心/备焉./" -translation = "堆积土石成了高山, 风雨从这里兴起; 汇积水流成为深渊, 蛟龙从这儿产生; 积累善行养成高尚的道德, 精神得到提升, 圣人的心境由此具备" -keyword_note = { "神明" = "精神", "圣心" = "圣人的心境" } - -["故不积跬步, 无以至千里; 不积小流, 无以成江海."] -note = [] -content = "故/不积/跬步/, 无以/至/千里; /不积/小流/, 无以/成/江海./" -translation = "所以不积累一步半步的行程, 就没有办法达到千里之远; 不积累细小的流水, 就没有办法汇成江河大海" -keyword_note = { "跬" = "行走时两脚之间的距离, 等于现在所说的一步、古人所说的半步", "步" = "古人说一步, 指左右脚都向前迈一次的距离, 等于现在的两步" } - -["骐骥一跃, 不能十步; 驽马十驾, 功在不舍."] -note = [] -content = "骐骥/一跃/, 不能/十步; /驽马/十驾/, 功在/不舍./" -translation = "骏马一跨跃, 也不足十步远; 劣马连走十天, 它的成功在于不停止" -keyword_note = { "骐骥" = "骏马, 千里马", "驽马" = "劣马", "十驾" = "劣马拉车连走十天也能到达. 驾, 古代马拉车时, 早晨套一上车, 晚上卸去. 套车叫驾, 所以这里用'驾'指代马车一天的行程", "舍" = "舍弃. 指不放弃行路" } - -["锲而舍之, 朽木不折; 锲而不舍, 金石可镂."] -note = [] -content = "锲/而舍之/, 朽木/不折; /锲/而不舍/, 金石/可镂./" -translation = "如果刻几下就停下来了, 那么腐朽的木头也刻不断. 如果不停地刻下去, 那么金石也能雕刻成功" -keyword_note = { "锲" = "用刀雕刻", "镂" = "原指在金属上雕刻, 泛指雕刻" } - -["蚓无爪牙之利, 筋骨之强, 上食埃土, 下饮黄泉, 用心一也."] -note = [] -content = "蚓/无/爪牙/之利/, 筋骨/之强/, 上/食/埃土/, 下/饮/黄泉/, 用心/一也./" -translation = "蚯蚓没有锐利的爪子和牙齿, 强健的筋骨, 却能向上吃到泥土, 向下喝到地下的泉水, 这是由于它用心专一" -keyword_note = { "黄泉" = "地下的泉水", "一" = "专一" } - -["蟹六跪而二螯, 非蛇鳝之穴无可寄托者, 用心躁也."] -note = [] -content = "蟹/六跪/而/二螯/, 非/蛇鳝/之穴/无可/寄托者/, 用心/躁也./" -translation = "螃蟹有六条腿, 两个蟹钳, 但是没有蛇、鳝的洞穴它就无处藏身, 这是因为它用心浮躁" -keyword_note = { "六跪" = "六条腿. 蟹实际上是八条腿. 跪, 蟹脚", "螯" = "螃蟹等节肢动物身前的大爪, 形如钳", "蛇鳝" = "异文'蛇蟮'", "躁" = "浮躁, 不专心" } - -["声声慢·寻寻觅觅"] -note = [] -content = "声声慢·寻寻觅觅/" -translation = "声声慢·寻寻觅觅" -keyword_note = {} - -["寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识."] -note = [] -content = "寻寻觅觅/, 冷冷清清/, 凄凄惨惨戚戚. /乍暖还寒时候/, 最难将息. /三杯两盏淡酒/, 怎敌他/、晚来风急/! /雁过也/, 正伤心/, 却是旧时相识./" -translation = "苦苦寻觅, 却只见冷冷清清, 怎不让人凄惨悲戚. 秋天的天气, 总是忽然变暖又转寒, 最难休养调理. 喝几杯淡酒, 怎么能抵挡得住傍晚的寒风紧吹? 一行大雁从头顶上飞过, 更让人伤心, 竟然都是当年为我传递书信的旧相识. " -keyword_note = { "寻寻觅觅" = "意谓想把失去的一切都找回来, 表现非常空虚怅惘、迷茫失落的心态", "凄凄惨惨戚戚" = "忧愁苦闷的样子", "乍暖还寒" = "指秋天的天气, 忽然变暖, 又转寒冷", "将息" = "旧时方言, 休养调理之意", "怎敌他" = "对付, 抵挡" } - -["满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!"] -note = ['守着窗儿 一作: 守著窗儿'] -content = "满地黄花堆积/, 憔悴损/, 如今有谁堪摘? /守着窗儿/, 独自怎生得黑? /梧桐更兼细雨/, 到黄昏/、点点滴滴. /这次第/, 怎一个愁字了得!/" -translation = "园中菊花堆积满地, 唯独我因忧伤而憔悴瘦损, 如今有谁可以摘取? 孤独地守在窗前, 一个人怎样才能熬到天黑? 梧桐叶上细雨淋漓, 到黄昏时分, 那雨声还是点点滴滴. 这般光景, 一个'愁'字怎么能概括得尽! " -keyword_note = { "憔悴损" = "表示程度很深", "堪" = "可以, 能够", "怎生" = "怎样的. 生: 语助词", "梧桐更兼细雨" = "暗用白居易《长恨歌》'秋雨梧桐叶落时'诗意", "这次第" = "这光景、这情形", "怎一个愁字了得" = "一个'愁'字怎么能概括得尽呢" } - -["大道之行也"] -note = [] -content = "大道之行也/" -translation = "大道之行也" -keyword_note = {} - -["大道之行也, 天下为公."] -note = [] -content = "大道/之行/也/, 天下/为公./" -translation = "大道实行的时代, 是以天下为大家所共有" -keyword_note = { "大道" = "上古帝王所遵行的礼乐准则", "天下为公" = "天下成为公共的" } - -["选贤与能, 讲信修睦."] -note = [] -content = "选贤/与能/, 讲信/修睦./" -translation = "选举贤能者共同治理, 人人心口如一, 彼此合作" -keyword_note = { "选贤与能" = "选拔贤才推举能人", "讲信修睦" = "讲求信用增进和睦" } - -["故人不独亲其亲, 不独子其子."] -note = [] -content = "故/人/不独/亲其亲/, 不独/子其子./" -translation = "于是大家不独敬奉自己的父母, 不独扶养自己的儿女" -keyword_note = { "亲其亲" = "敬奉自己的父母", "子其子" = "抚养自己的子女" } - -["使老有所终, 壮有所用, 幼有所长."] -note = [] -content = "使/老/有所终/, 壮/有所用/, 幼/有所长./" -translation = "使社会上的老者各得安享天年, 壮者各能贡献才力, 儿童得到良好的教育" -keyword_note = { "有所终" = "有善终", "有所用" = "有用处", "有所长" = "使成长" } - -["矜寡孤独废疾者皆有所养."] -note = [] -content = "矜寡/孤独/废疾者/皆/有所养./" -translation = "鳏、寡、孤、独以及残疾人都能得到供养" -keyword_note = { "矜" = "同'鳏', 老而无妻", "寡" = "老而无夫", "孤" = "幼而无父", "独" = "老而无子", "废疾" = "残废的人" } - -["男有分, 女有归."] -note = [] -content = "男/有分/, 女/有归./" -translation = "男人各尽自己的职分, 女人各有自己的家庭" -keyword_note = { "分" = "职分", "归" = "女子出嫁" } - -["货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己."] -note = [] -content = "货/恶其/弃于地/也/, 不必/藏于己/; 力/恶其/不出于身/也/, 不必/为己./" -translation = "既不把财物委弃于无用之地, 也不把财物私藏于己身. 既嫌恶有力不肯出力, 也不能为私人出力才算是效劳" -keyword_note = { "货" = "财物", "力" = "劳力" } - -["是故谋闭不兴, 盗窃乱贼而不作."] -note = [] -content = "是故/谋闭/不兴/, 盗窃/乱贼/而不作./" -translation = "因此, 就不会有钩心斗角、损人利己的阴谋发生, 也不会有劫持、偷盗、杀人越货的勾当出现" -keyword_note = { "谋闭" = "阴谋闭藏", "作" = "发生" } - -["故外户而不闭, 是谓大同."] -note = [] -content = "故/外户/而不闭/, 是谓/大同./" -translation = "纵有门窗的设置, 也只是便于起居, 并无需防备歹人. 那样的世界才真是大同的世界" -keyword_note = { "闭" = "关闭", "大同" = "儒家的理想社会, 实际是理想化了的原始社会" } - -["客至"] -note = [] -content = "客至/" -translation = "客至" -keyword_note = {} - -["舍南舍北皆春水, 但见群鸥日日来."] -note = ["杜甫〔唐代']"] -content = "舍南/舍北/皆/春水/, 但见/群鸥/日日/来./" -translation = "草堂的南北绿水缭绕、春意荡漾, 只见鸥群日日结队飞来. " -keyword_note = { "舍" = "指家", "但见" = "只见. 此句意为平时交游很少, 只有鸥鸟不嫌弃能与之相亲" } - -["花径不曾缘客扫, 蓬门今始为君开."] -note = [] -content = "花径/不曾/缘客/扫/, 蓬门/今始/为君/开./" -translation = "长满花草的庭院小路不曾因为迎客而打扫, 只是为了你的到来, 我家草门首次打开. " -keyword_note = { "花径" = "长满花草的小路", "蓬门" = "用蓬草编成的门户, 以示房子的简陋" } - -["盘飧市远无兼味, 樽酒家贫只旧醅."] -note = [] -content = "盘飧/市远/无/兼味/, 樽酒/家贫/只/旧醅./" -translation = "离集市太远盘中没好菜肴, 家境贫寒只有隔年的陈酒招待. " -keyword_note = { "市远" = "离市集远", "兼味" = "多种美味佳肴. 无兼味, 谦言菜少", "樽" = "酒器", "旧醅" = "旧酿之酒. 醅, 没有过滤的酒, 也泛指酒" } - -["肯与邻翁相对饮, 隔篱呼取尽余杯."] -note = [] -content = "肯与/邻翁/相对/饮/, 隔篱/呼取/尽/余杯./" -translation = "如肯与邻家老翁举杯对饮, 那我就隔着篱笆将他唤来. " -keyword_note = { "肯" = "能否允许, 这是向客人征询", "余杯" = "余下来的酒" } - -["将进酒"] -note = [] -content = "将进酒/" -translation = "将进酒" -keyword_note = {} - -["君不见, 黄河之水天上来, 奔流到海不复回."] -note = ['黄河发源于青海, 因那里地势极高, 故称天上来'] -content = "君不见/, 黄河之水/天上来/, 奔流到海/不复回./" -translation = "你没见那黄河之水从天上奔腾而来, 波涛翻滚直奔东海, 再也没有回来" -keyword_note = { "君不见" = "乐府中常用的一种夸语", "天上来" = "黄河发源于青海, 因那里地势极高, 故称" } - -["君不见, 高堂明镜悲白发, 朝如青丝暮成雪!"] -note = [] -content = "君不见/, 高堂明镜/悲白发/, 朝如青丝/暮成雪!/" -translation = "你没见那年迈的父母, 对着明镜感叹自己的白发, 年轻时候的满头青丝如今已是雪白一片" -keyword_note = { "高堂" = "指的是父母", "青丝" = "黑发" } - -["人生得意须尽欢, 莫使金樽空对月."] -note = [] -content = "人生得意/须尽欢/, 莫使金樽/空对月./" -translation = "人生得意之时应当纵情欢乐, 莫要让这金杯无酒空对明月" -keyword_note = { "得意" = "适意高兴的时候", "金樽" = "精美的酒器" } - -["天生我材必有用, 千金散尽还复来."] -note = [] -content = "天生我材/必有用/, 千金散尽/还复来./" -translation = "每个人只要生下来就必有用处, 黄金千两一挥而尽还能够再来" -keyword_note = {} - -["烹羊宰牛且为乐, 会须一饮三百杯."] -note = [] -content = "烹羊宰牛/且为乐/, 会须一饮/三百杯./" -translation = "我们烹羊宰牛姑且作乐, 一次痛饮三百杯也不为多" -keyword_note = { "会须" = "应当" } - -["岑夫子, 丹丘生, 将进酒, 杯莫停."] -note = [] -content = "岑夫子/, 丹丘生/, 将进酒/, 杯莫停./" -translation = "岑夫子和丹丘生啊! 快喝吧! 别停下杯子" -keyword_note = { "岑夫子" = "指岑勋", "丹丘生" = "元丹丘", "将进酒" = "请饮酒", "杯莫停" = "别停下杯子" } - -["与君歌一曲, 请君为我倾耳听."] -note = [] -content = "与君歌/一曲/, 请君为我/倾耳听./" -translation = "我为你们高歌一曲, 请你们都来侧耳倾听" -keyword_note = { "与君" = "给你们, 为你们", "倾耳听" = "侧耳倾听" } - -["钟鼓馔玉不足贵, 但愿长醉不复醒."] -note = [] -content = "钟鼓馔玉/不足贵/, 但愿长醉/不复醒./" -translation = "钟鸣馔食的豪华生活有何珍贵, 只希望长驻醉乡不再清醒" -keyword_note = { "钟鼓" = "富贵人家宴会中奏乐使用的乐器", "馔玉" = "美好的食物", "不复醒" = "不再清醒" } - -["古来圣贤皆寂寞, 惟有饮者留其名."] -note = [] -content = "古来圣贤/皆寂寞/, 惟有饮者/留其名./" -translation = "自古以来圣贤这两种酒是寂寞的, 只有那喝酒的人才能够留传美名" -keyword_note = {} - -["陈王昔时宴平乐, 斗酒十千恣欢谑."] -note = [] -content = "陈王昔时/宴平乐/, 斗酒十千/恣欢谑./" -translation = "陈王曹植当年宴设乐平关你可知道, 斗酒万钱也豪饮宾主尽情欢乐" -keyword_note = { "陈王" = "指陈思王曹植", "平乐" = "观名", "恣" = "放纵, 无拘无束", "谑" = "玩笑" } - -["主人何为言少钱, 径须沽取对君酌."] -note = [] -content = "主人何为/言少钱/, 径须沽取/对君酌./" -translation = "主人呀, 你为何说我的钱不多? 你只管端出酒来让我喝" -keyword_note = { "径须" = "干脆, 只管", "沽" = "买酒" } - -["五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!"] -note = [] -content = "五花马/、千金裘/, 呼儿将出/换美酒/, 与尔同销/万古愁!/" -translation = "五花千里马, 千金狐皮裘, 快叫那侍儿拿去换美酒, 我和你们共同消解这万古愁" -keyword_note = { "五花马" = "指名贵的马", "千金裘" = "珍贵的皮衣", "销" = "同'消'" } - -["屈原列传"] -note = [] -content = "屈原列传/" -translation = "屈原列传" -keyword_note = {} - -["屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》."] -note = [] -content = "屈平/疾/王听之/不聪也/, 谗谄之/蔽明也/, 邪曲之/害公也/, 方正之/不容也/, 故/忧愁/幽思/而作/《离骚》./" -translation = "屈原痛心楚怀王听信谗言, 不能分辨是非, 谄媚国君的人遮蔽了楚怀王的明见, 品行不正的小人损害国家, 端方正直的人不被昏君谗臣所容, 所以忧愁深思, 就创作了《离骚》. " -keyword_note = { "疾" = "痛心", "不聪" = "不能分辨是非", "谗谄" = "说人坏话、奉承献媚", "蔽明" = "蒙蔽明见", "邪曲" = "品行不正", "方正" = "端方正直" } - -["离骚者, 犹离忧也."] -note = [] -content = "离骚者/, 犹/离忧也./" -translation = "'离骚', 就是遭遇忧愁的意思. " -keyword_note = { "离忧" = "遭遇忧患" } - -["夫天者, 人之始也; 父母者, 人之本也."] -note = [] -content = "夫/天者/, 人之/始也/; 父母者/, 人之/本也./" -translation = "上天, 是人的原始; 父母, 是人的根本. " -keyword_note = {} - -["人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也."] -note = [] -content = "人穷/则反本/, 故/劳苦/倦极/, 未尝/不呼天也/; 疾痛/惨怛/, 未尝/不呼/父母也./" -translation = "人处境困难时, 总是要追念上天和父母 (希望给以援助) , 所以劳累疲倦时, 没有不呼叫上天的; 病痛和内心悲伤时, 没有不呼叫父母的. " -keyword_note = { "人穷则反本" = "人困窘没有出路, 就会追念根本", "倦极" = "疲倦困苦", "惨怛" = "忧伤, 悲痛" } - -["屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣."] -note = [] -content = "屈平/正道/直行/, 竭忠/尽智/以事/其君/, 谗人/间之/, 可谓/穷矣./" -translation = "屈原使 (自己) 道德端正, 使 (自己) 品行正直, 竭尽忠心用尽智慧来侍奉他的国君, 却被小人离间, 可以说处境很困难. " -keyword_note = {} - -["信而见疑, 忠而被谤, 能无怨乎?"] -note = [] -content = "信而/见疑/, 忠而/被谤/, 能无/怨乎?/" -translation = "诚信而被怀疑, 尽忠却被诽谤, 能没有怨愤吗? " -keyword_note = { "信而见疑" = "诚实不欺却被怀疑" } - -["屈平之作《离骚》, 盖自怨生也."] -note = [] -content = "屈平/之作/《离骚》/, 盖自/怨生也./" -translation = "屈原作《离骚》, 大概是自己的怨愤所引起的. " -keyword_note = {} - -["《国风》好色而不淫, 《小雅》怨诽而不乱."] -note = [] -content = "《国风》/好色/而不淫/, 《小雅》/怨诽/而不乱./" -translation = "《诗经》中的《国风》, 写男女恋情而不过度, 《小雅》有怨刺之言, 但不直接愤怒. " -keyword_note = { "淫" = "过度、无节制" } - -["若《离骚》者, 可谓兼之矣."] -note = [] -content = "若/《离骚》者/, 可谓/兼之矣./" -translation = "屈原的《离骚》诗, 则两者之美兼而有之. " -keyword_note = {} - -["上称帝喾, 下道齐桓, 中述汤武, 以刺世事."] -note = [] -content = "上称/帝喾/, 下道/齐桓/, 中述/汤/武/, 以刺/世事./" -translation = " (他) 远古提到帝喾, 近古提到齐桓公, 中古提到商汤、周武王, 利用古代帝王这些事用来讽刺当世社会. " -keyword_note = { "帝喾" = "传说中的五帝之一", "汤武" = "商汤、周武王" } - -["明道德之广崇, 治乱之条贯, 靡不毕见."] -note = [] -content = "明/道德之/广崇/, 治乱之/条贯/, 靡不/毕见./" -translation = "阐明道德的广大崇高, 治乱的条理, 没有不全表现出来的. " -keyword_note = { "广崇" = "广大崇高", "条贯" = "条理", "靡" = "无, 没有" } - -["其文约, 其辞微, 其志洁, 其行廉."] -note = [] -content = "其文/约/, 其辞/微/, 其志/洁/, 其行/廉./" -translation = "他的文章简约, 语言含蓄, 他的志趣高洁, 行为正直. " -keyword_note = { "约" = "简约", "微" = "含蓄隐晦" } - -["其称文小而其指极大, 举类迩而见义远."] -note = [] -content = "其称文/小而/其指/极大/, 举类/迩而/见义/远./" -translation = "就其文字来看, 不过是寻常事情, 但是它的旨趣是极大的, 列举的是近事, 而表达的意思却十分深远. " -keyword_note = { "指" = "同'旨', 意旨", "迩" = "近" } - -["其志洁, 故其称物芳; 其行廉, 故死而不容."] -note = [] -content = "其志/洁/, 故其/称物/芳/; 其行/廉/, 故死/而不容./" -translation = "他的志趣高洁, 所以作品中多用美人芳草作比喻; 他的行为正直, 所以至死不容于世. " -keyword_note = { "称物芳" = "多用美人香草来比喻" } - -["自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也."] -note = [] -content = "自疏/濯淖/污泥/之中/, 蝉蜕/于/浊秽/, 以/浮游/尘埃/之外/, 不获/世之/滋垢/, 皭然/泥而/不滓者/也./" -translation = "他自动地远离污泥浊水, 像蝉脱壳那样摆脱污秽环境, 以便超脱世俗之外, 不沾染尘世的污垢, 出于污泥而不染, 依旧保持高洁的品德. " -keyword_note = { "自疏" = "自动地远离", "濯淖污泥" = "污浊", "蝉蜕" = "像蝉脱壳那样摆脱", "浊秽" = "污秽的境地", "滋垢" = "尘世的污垢", "皭然" = "清白、洁净的样子", "泥而不滓" = "出淤泥而不染" } - -["推此志也, 虽与日月争光可也."] -note = [] -content = "推/此志也/, 虽与/日月/争光/可也./" -translation = "推赞这种志行, 即使同日月争光都可以. " -keyword_note = { "推" = "推赞, 推许" } - -["山居秋暝"] -note = [] -content = "山居秋暝/" -translation = "山居秋暝" -keyword_note = {} - -["空山新雨后, 天气晚来秋."] -note = [] -content = "空山/新雨/后/, 天气/晚来/秋./" -translation = "新雨过后山谷里空旷清新, 初秋傍晚的天气特别凉爽. " -keyword_note = { "空山" = "空旷, 空寂的山野", "新" = "刚刚", "晚来秋" = "初秋傍晚的天气特别凉爽" } - -["明月松间照, 清泉石上流."] -note = [] -content = "明月/松间/照/, 清泉/石上/流./" -translation = "明月映照着幽静的松林间, 清澈泉水在山石上淙淙淌流. " -keyword_note = { "清泉石上流" = "写的正是雨后的景色" } - -["竹喧归浣女, 莲动下渔舟."] -note = [] -content = "竹喧/归/浣女/, 莲动/下/渔舟./" -translation = "竹林里传来喧闹声, 知是少女洗衣归来, 莲叶轻摇知是上游荡下轻舟. " -keyword_note = { "竹喧" = "竹林中笑语喧哗", "喧" = "笑语喧哗", "浣女" = "洗衣服的女子", "浣" = "洗涤衣物" } - -["随意春芳歇, 王孙自可留."] -note = [] -content = "随意/春芳/歇/, 王孙/自可/留./" -translation = "任凭春天的花草消失, 眼前的秋景足以让我流连久居. " -keyword_note = { "随意" = "任凭", "春芳" = "春天的花草", "歇" = "消散, 消失", "王孙" = "原指贵族子弟, 此处指诗人自己", "留" = "居" } - -["师说"] -note = [] -content = "师说/" -translation = "师说" -keyword_note = {} - -["古之学者必有师."] -note = ['学者: 求学的人'] -content = "古之/学者/必有/师./" -translation = "古代求学的人一定有老师" -keyword_note = { "学者" = "求学的人" } - -["师者, 所以传道受业解惑也."] -note = ["受: 通'授', 传授, 讲授"] -content = "师者/, 所以/传道/受业/解惑/也./" -translation = "老师是传授道理, 教授学业, 解决疑难问题的人" -keyword_note = { "传道" = "传授道理", "受业" = "教授学业", "解惑" = "解决疑难问题", "受" = "通'授', 传授" } - -["人非生而知之者, 孰能无惑?"] -note = [] -content = "人非/生而/知之/者/, 孰能/无惑?/" -translation = "人不是生下来就懂得道理的, 谁能没有疑惑" -keyword_note = { "孰能" = "谁能" } - -["惑而不从师, 其为惑也, 终不解矣."] -note = [] -content = "惑而/不从/师/, 其/为惑/也/, 终/不解/矣./" -translation = "有疑惑却不跟从老师学习, 他所存在的疑惑, 就始终不能解决" -keyword_note = { "终" = "始终" } - -["生乎吾前, 其闻道也固先乎吾, 吾从而师之;"] -note = [] -content = "生乎/吾前/, 其/闻道/也/固/先乎/吾/, 吾/从而/师之;/" -translation = "在我之前出生的人, 他懂得道理本来就比我早, 我跟从他, 拜他为师" -keyword_note = { "闻道" = "懂得道理", "固" = "本来", "师之" = "以他为师" } - -["生乎吾后, 其闻道也亦先乎吾, 吾从而师之."] -note = [] -content = "生乎/吾后/, 其/闻道/也/亦/先乎/吾/, 吾/从而/师之./" -translation = "在我之后出生的人, 他懂得道理如果也比我早, 我也跟从他学习, 把他当作老师" -keyword_note = { "亦" = "也" } - -["吾师道也, 夫庸知其年之先后生于吾乎?"] -note = [] -content = "吾/师道/也/, 夫/庸知/其年/之/先后/生于/吾乎?/" -translation = "我学习的是道理, 哪里管他的年龄比我大还是比我小呢" -keyword_note = { "师道" = "学习道理", "庸知" = "哪里管" } - -["是故无贵无贱, 无长无少, 道之所存, 师之所存也."] -note = [] -content = "是故/无贵/无贱/, 无长/无少/, 道之/所存/, 师之/所存/也./" -translation = "因此, 不论地位显贵还是地位低下, 不论年长年少, 道理存在的地方, 就是老师存在的地方" -keyword_note = { "是故" = "因此", "所存" = "存在的地方" } - -["嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!"] -note = [] -content = "嗟乎!/ 师道/之/不传/也/久矣!/ 欲人/之/无惑/也/难矣!/" -translation = "唉! 从师学习的风尚没有流传已经很久了, 想要人们没有疑惑很难呐" -keyword_note = { "嗟乎" = "感叹词, 唉", "师道" = "从师学习的风尚" } - -["古之圣人, 其出人也远矣, 犹且从师而问焉;"] -note = [] -content = "古之/圣人/, 其/出人/也/远矣/, 犹且/从师/而问/焉;/" -translation = "古代的圣人, 他们超过一般人很远了, 尚且跟从老师向老师请教" -keyword_note = { "出人" = "超出一般人", "犹且" = "尚且" } - -["今之众人, 其下圣人也亦远矣, 而耻学于师."] -note = [] -content = "今之/众人/, 其/下/圣人/也/亦/远矣/, 而/耻学/于师./" -translation = "现在的一般人, 他们跟圣人相比相差很远了, 却以向老师学为羞耻" -keyword_note = { "众人" = "一般人", "下" = "低于, 不如", "耻学于师" = "以向老师学习为耻" } - -["是故圣益圣, 愚益愚."] -note = [] -content = "是故/圣/益圣/, 愚/益愚./" -translation = "所以圣人就更加圣明, 愚人就更加愚昧" -keyword_note = { "益" = "更加" } - -["圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!"] -note = [] -content = "圣人/之/所以/为圣/, 愚人/之/所以/为愚/, 其/皆/出于/此乎!/" -translation = "圣人之所以成为圣人, 愚人之所以成为愚人, 大概都是这个原因引起的吧" -keyword_note = { "所以" = "...的原因", "其" = "大概" } - -["爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣."] -note = [] -content = "爱/其子/, 择师/而教/之;/ 于/其身/也/, 则/耻师/焉/, 惑矣./" -translation = "众人喜爱他们的孩子, 选择老师教育孩子; 他们自己呢, 却以从师学习为耻, 这真是糊涂啊" -keyword_note = { "其身" = "他们自己", "耻师" = "以从师为耻", "惑" = "糊涂" } - -["彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也."] -note = ['句读: 也叫句逗. 古代称文辞意尽处为句, 语意未尽而须停顿处为读'] -content = "彼/童子/之师/, 授之/书/而习/其/句读/者/, 非/吾/所谓/传其道/解其惑/者也./" -translation = "那孩子的老师, 教他们读书, 学习书中的文句, 并不是我所说的给人传授道理, 给人解释疑惑的老师" -keyword_note = { "句读" = "文句停顿", "所谓" = "所说的" } - -["句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也."] -note = ["不: 通'否', 表否定"] -content = "句读/之/不知/, 惑之/不解/, 或/师焉/, 或/不焉/, 小学/而/大遗/, 吾/未见/其明/也./" -translation = "不理解文句, 疑惑得不到解决, 有的向老师学习, 有的却不向老师求教, 小的方面学习, 大的方面却放弃了, 我看不出他们有什么明智的呢" -keyword_note = { "或" = "有的", "不" = "通'否'", "小学" = "小的方面学习", "大遗" = "大的方面放弃" } - -["巫医乐师百工之人, 不耻相师."] -note = ['巫医: 古代用祝祷、占卜等迷信方法或兼用药物医治疾病为业的人', '百工: 泛指手工业者'] -content = "巫医/乐师/百工/之人/, 不耻/相师./" -translation = "医生, 乐师及各种工匠, 不以互相学习为耻" -keyword_note = { "巫医" = "医生", "乐师" = "音乐师", "百工" = "各种工匠", "不耻相师" = "不以互相学习为耻" } - -["士大夫之族, 曰师曰弟子云者, 则群聚而笑之."] -note = [] -content = "士大夫/之族/, 曰师/曰弟子/云者/, 则/群聚/而笑/之./" -translation = "士大夫这类人中, 如有人称人家为老师, 称自己为学生, 这些人就聚集在一起嘲笑他" -keyword_note = { "族" = "类", "云者" = "如此说" } - -["问之, 则曰: “彼与彼年相若也, 道相似也."] -note = [] -content = "问之/, 则曰/: “彼与/彼年/相若/也/, 道/相似/也./" -translation = "问那些嘲笑者, 他们就说: 那个人与某人年龄相近, 修养和学业也差不多" -keyword_note = { "相若" = "相近", "相似" = "差不多" } - -["位卑则足羞, 官盛则近谀.”"] -note = [] -content = "位卑/则/足羞/, 官盛/则/近谀/.”/" -translation = "以地位低的人为师, 足以感到羞愧, 称官位高的人为师就近于谄媚" -keyword_note = { "位卑" = "地位低", "足羞" = "足以羞愧", "官盛" = "官位高", "近谀" = "近于谄媚" } - -["呜呼! 师道之不复, 可知矣."] -note = [] -content = "呜呼!/ 师道/之/不复/, 可知/矣./" -translation = "啊! 从师学习的风尚不能恢复, 由此就可以知道了" -keyword_note = { "不复" = "不能恢复" } - -["巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!"] -note = ['不齿: 不屑与之同列, 表示鄙视'] -content = "巫医/乐师/百工/之人/, 君子/不齿/, 今/其智/乃/反不能/及/, 其/可怪/也欤!/" -translation = "医生、乐师及各种工匠, 士大夫之类的人是不屑与他们为伍的, 现在士大夫们的智慧反而不如他们. 难道值得奇怪吗" -keyword_note = { "君子" = "士大夫", "不齿" = "不屑为伍", "乃" = "反而", "及" = "如" } - -["圣人无常师. 孔子师郯子、苌弘、师襄、老聃."] -note = ['郯子: 春秋时郯国国君', '苌弘: 周敬王大夫', '师襄: 鲁国乐官', '老聃: 即老子'] -content = "圣人/无常/师./ 孔子/师/郯子/、苌弘/、师襄/、老聃./" -translation = "圣人没有固定的老师, 孔子曾经以郯子、苌弘、师襄、老聃为师" -keyword_note = { "常师" = "固定的老师" } - -["郯子之徒, 其贤不及孔子."] -note = [] -content = "郯子/之徒/, 其/贤/不及/孔子./" -translation = "郯子这一类人, 他们的道德才能不如孔子" -keyword_note = { "之徒" = "这一类人", "贤" = "道德才能", "不及" = "不如" } - -["孔子曰: 三人行, 则必有我师."] -note = [] -content = "孔子/曰/: 三人/行/, 则/必有/我师./" -translation = "孔子说: 几个人走在一起, 其中就一定有我的老师" -keyword_note = { "三人行" = "几个人一起走" } - -["是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已."] -note = [] -content = "是故/弟子/不必/不如/师/, 师/不必/贤于/弟子/, 闻道/有/先后/, 术业/有/专攻/, 如是/而已./" -translation = "因此学生不一定不如老师, 老师也不一定比弟子强, 听闻道理有先有后, 学问和技艺上各有各的主攻方向, 像这样罢了" -keyword_note = { "不必" = "不一定", "贤于" = "比...强", "术业" = "学问技艺", "专攻" = "专门研究", "而已" = "罢了" } - -["李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余."] -note = ['六艺经传: 六经的经文和传文'] -content = "李氏/子蟠/, 年/十七/, 好/古文/, 六艺/经传/皆/通习/之/, 不拘/于时/, 学/于余./" -translation = "李蟠, 十七岁, 爱好古文, 六经的经文和传文都普遍学习了, 不被世俗的限制, 向我学习" -keyword_note = { "好" = "爱好", "古文" = "先秦文章", "六艺经传" = "六经的经文和传文", "通习" = "普遍学习", "不拘于时" = "不被时俗限制" } - -["余嘉其能行古道, 作《师说》以贻之."] -note = [] -content = "余/嘉/其/能行/古道/, 作/《师说》/以/贻之./" -translation = "我赞许他能遵行古人从师学习的风尚, 特别写了这篇《师说》来赠给他" -keyword_note = { "嘉" = "赞许", "古道" = "古人风尚", "贻" = "赠送" } - -["归去来兮辞"] -note = [] -content = "归去来兮辞/" -translation = "归去来兮辞" -keyword_note = {} - -["归去来兮, 田园将芜胡不归?"] -note = [] -content = "归去/来兮/, 田园/将芜/胡不归?/" -translation = "回家去吧! 田园快要荒芜了, 为什么不回去呢? " -keyword_note = { "归去来兮" = "回去吧", "将芜" = "快要荒芜", "胡不归" = "为什么不回去" } - -["既自以心为形役, 奚惆怅而独悲?"] -note = [] -content = "既/自以/心为/形役/, 奚/惆怅/而/独悲?/" -translation = "既然自己使心为身所驱役, 又何必怅惘而独自悲戚呢? " -keyword_note = { "心为形役" = "心神被形体役使", "奚" = "为什么", "惆怅" = "怅惘", "独悲" = "独自悲戚" } - -["悟已往之不谏, 知来者之可追."] -note = [] -content = "悟/已往/之/不谏/, 知/来者/之/可追./" -translation = "我已明悟过去的错误已经不可挽回, 未来的事还来得及补救" -keyword_note = { "已往" = "过去", "不谏" = "不可挽回", "来者" = "未来的事", "可追" = "可以补救" } - -["实迷途其未远, 觉今是而昨非."] -note = [] -content = "实/迷途/其/未远/, 觉/今是/而/昨非./" -translation = "我确实走入了迷途, 但还不算太远, 已觉悟如今的做法是对的, 而曾经的行为是错的" -keyword_note = { "迷途" = "走入迷途", "其" = "但", "未远" = "不算太远", "今是" = "现在正确", "昨非" = "过去错误" } - -["舟遥遥以轻飏, 风飘飘而吹衣."] -note = [] -content = "舟/遥遥/以/轻飏/, 风/飘飘/而/吹衣./" -translation = "船在水面上轻轻地飘荡着前进, 微风吹拂着衣裳, 衣袂翩翩" -keyword_note = { "遥遥" = "飘摇放流", "轻飏" = "轻轻地飘荡", "飘飘" = "微风吹拂" } - -["问征夫以前路, 恨晨光之熹微."] -note = [] -content = "问/征夫/以/前路/, 恨/晨光/之/熹微./" -translation = "向行人打听前面的路程, 遗憾的是天刚刚放亮" -keyword_note = { "征夫" = "行人", "前路" = "前面的路程", "恨" = "遗憾", "熹微" = "天色微明" } - -["乃瞻衡宇, 载欣载奔."] -note = [] -content = "乃/瞻/衡宇/, 载欣/载奔./" -translation = "刚刚看到自己简陋的家门, 心中欣喜, 奔跑过去" -keyword_note = { "乃" = "刚刚", "瞻" = "看见", "衡宇" = "横木为门的简陋房屋", "载欣载奔" = "一边高兴一边奔跑" } - -["僮仆欢迎, 稚子候门."] -note = [] -content = "僮仆/欢迎/, 稚子/候门./" -translation = "家中童仆欢喜地前来迎接, 孩子们守候在门前" -keyword_note = { "僮仆" = "童仆", "欢迎" = "欢喜迎接", "稚子" = "幼儿", "候门" = "在门前等候" } - -["三径就荒, 松菊犹存."] -note = [] -content = "三径/就荒/, 松菊/犹存./" -translation = "院子里的小路快要荒芜了, 松菊还长在那里" -keyword_note = { "三径" = "院中小路", "就荒" = "快要荒芜", "犹存" = "还存在" } - -["携幼入室, 有酒盈樽."] -note = [] -content = "携幼/入室/, 有酒/盈樽./" -translation = "带着孩子们进了屋, 美酒已经盛满了酒樽" -keyword_note = { "携幼" = "带着孩子", "入室" = "进屋", "盈樽" = "满杯" } - -["引壶觞以自酌, 眄庭柯以怡颜."] -note = [] -content = "引/壶觞/以/自酌/, 眄/庭柯/以/怡颜./" -translation = "我端起酒壶酒杯自斟自饮, 看看院子里的树木, 觉得很愉快" -keyword_note = { "引" = "端起", "壶觞" = "酒壶酒杯", "自酌" = "自斟自饮", "眄" = "随便看看", "庭柯" = "院子里的树木", "怡颜" = "使面容愉快" } - -["倚南窗以寄傲, 审容膝之易安."] -note = [] -content = "倚/南窗/以/寄傲/, 审/容膝/之/易安./" -translation = "倚着南窗寄托我的傲世之情, 深知这狭小之地容易使我心安" -keyword_note = { "寄傲" = "寄托傲世之情", "审" = "深知", "容膝" = "仅能容膝的小屋", "易安" = "容易安适" } - -["园日涉以成趣, 门虽设而常关."] -note = [] -content = "园/日涉/以/成趣/, 门/虽设/而/常关./" -translation = "天天到园里行走, 自成一种乐趣, 小园的门经常地关闭着" -keyword_note = { "日涉" = "天天走到", "成趣" = "自成乐趣", "虽设" = "虽然设置", "常关" = "经常关闭" } - -["策扶老以流憩, 时矫首而遐观."] -note = [] -content = "策/扶老/以/流憩/, 时/矫首/而/遐观./" -translation = "拄着拐杖出去走走, 随时随地休息, 时时抬头望着远方 (的天空) " -keyword_note = { "策" = "拄着", "扶老" = "手杖", "流憩" = "到处走走歇歇", "矫首" = "抬头", "遐观" = "远望" } - -["云无心以出岫, 鸟倦飞而知还."] -note = [] -content = "云/无心/以/出岫/, 鸟/倦飞/而/知还./" -translation = "云气自然而然地从山峰飘浮而出, 倦飞的鸟儿也知道飞回巢中" -keyword_note = { "无心" = "自然而然", "出岫" = "从山中冒出", "倦飞" = "飞累了", "知还" = "知道返回" } - -["景翳翳以将入, 抚孤松而盘桓."] -note = [] -content = "景/翳翳/以/将入/, 抚/孤松/而/盘桓./" -translation = "日光暗淡, 太阳快要落下去了, 我手抚着孤松徘徊着不忍离去" -keyword_note = { "景" = "日光", "翳翳" = "阴暗的样子", "将入" = "快要落下", "抚" = "手抚", "孤松" = "孤立的松树", "盘桓" = "徘徊" } - -["归去来兮, 请息交以绝游."] -note = [] -content = "归去/来兮/, 请/息交/以/绝游./" -translation = "回家去吧! 请让我同外界断绝交游" -keyword_note = { "息交" = "停止交往", "绝游" = "断绝交游" } - -["世与我而相违, 复驾言兮焉求?"] -note = [] -content = "世/与我/而/相违/, 复/驾言/兮/焉求?/" -translation = "世事与我所想的相违背, 还要驾车出去追求什么? " -keyword_note = { "相违" = "相违背", "驾言" = "驾车出游", "焉求" = "追求什么" } - -["悦亲戚之情话, 乐琴书以消忧."] -note = [] -content = "悦/亲戚/之/情话/, 乐/琴书/以/消忧./" -translation = "以亲人间的知心话为愉悦, 以弹琴读书为乐来消除忧愁" -keyword_note = { "悦" = "以...为愉悦", "情话" = "知心话", "乐" = "以...为乐", "琴书" = "弹琴读书", "消忧" = "消除忧愁" } - -["农人告余以春及, 将有事于西畴."] -note = [] -content = "农人/告余/以/春及/, 将/有事/于/西畴./" -translation = "农夫告诉我春天到了, 西边田野里要开始耕种了" -keyword_note = { "告余" = "告诉我", "春及" = "春天到了", "有事" = "指耕种之事", "西畴" = "西边田野" } - -["或命巾车, 或棹孤舟."] -note = [] -content = "或/命/巾车/, 或/棹/孤舟./" -translation = "有时驾着有布篷的小车, 有时划着一条小船" -keyword_note = { "或" = "有时", "命" = "叫上", "巾车" = "有帷的小车", "棹" = "划船" } - -["既窈窕以寻壑, 亦崎岖而经丘."] -note = [] -content = "既/窈窕/以/寻壑/, 亦/崎岖/而/经丘./" -translation = "有时经过幽深曲折的山谷, 有时走过高低不平的山路" -keyword_note = { "窈窕" = "幽深曲折", "寻壑" = "经过山谷", "崎岖" = "高低不平", "经丘" = "走过山路" } - -["木欣欣以向荣, 泉涓涓而始流."] -note = [] -content = "木/欣欣/以/向荣/, 泉/涓涓/而/始流./" -translation = "草木茂盛, 细水缓流" -keyword_note = { "欣欣" = "草木茂盛", "向荣" = "滋长茂盛", "涓涓" = "水流细微", "始流" = "开始流动" } - -["善万物之得时, 感吾生之行休."] -note = [] -content = "善/万物/之/得时/, 感/吾生/之/行休./" -translation = " (我) 羡慕自然界的万物一到春天便及时生长茂盛, 感叹自己的一生行将结束" -keyword_note = { "善" = "羡慕", "得时" = "及时生长", "感" = "感叹", "行休" = "行将结束" } - -["已矣乎! 寓形宇内复几时?"] -note = [] -content = "已矣乎/! / 寓形/宇内/复/几时?/" -translation = "算了吧! 活在世上还能有多久? " -keyword_note = { "已矣乎" = "算了吧", "寓形宇内" = "活在世上", "复几时" = "还能有多久" } - -["曷不委心任去留?"] -note = [] -content = "曷不/委心/任/去留?/" -translation = "为什么不随心所欲, 听凭自然的生死? " -keyword_note = { "曷不" = "为什么不", "委心" = "随心所欲", "任去留" = "听凭生死" } - -["胡为乎遑遑欲何之?"] -note = [] -content = "胡为乎/遑遑/欲/何之?/" -translation = "为什么心神不定, 想要到哪里去呢? " -keyword_note = { "胡为乎" = "为什么", "遑遑" = "心神不定", "欲何之" = "想要到哪里去" } - -["富贵非吾愿, 帝乡不可期."] -note = [] -content = "富贵/非/吾愿/, 帝乡/不可/期./" -translation = "富贵不是我所求, 修成神仙是没有希望的" -keyword_note = { "非吾愿" = "不是我的愿望", "帝乡" = "仙境", "不可期" = "不可企及" } - -["怀良辰以孤往, 或植杖而耘耔."] -note = [] -content = "怀/良辰/以/孤往/, 或/植杖/而/耘耔./" -translation = "爱惜那良辰美景我独自去欣赏, 有时放下手杖, 拿起农具除草培土" -keyword_note = { "怀" = "爱惜", "良辰" = "美好时光", "孤往" = "独自外出", "植杖" = "放下手杖", "耘耔" = "除草培土" } - -["登东皋以舒啸, 临清流而赋诗."] -note = [] -content = "登/东皋/以/舒啸/, 临/清流/而/赋诗./" -translation = "登上东边的山坡我放声呼啸, 傍着清清的溪流把诗歌吟唱" -keyword_note = { "东皋" = "东边高地", "舒啸" = "放声长啸", "临" = "面对", "清流" = "清清溪流", "赋诗" = "吟诗" } - -["聊乘化以归尽, 乐夫天命复奚疑!"] -note = [] -content = "聊/乘化/以/归尽/, 乐夫/天命/复/奚疑!/" -translation = "姑且顺随自然的变化, 走到生命的尽头. 乐天安命, 还有什么可疑虑的呢? " -keyword_note = { "聊" = "姑且", "乘化" = "顺随自然变化", "归尽" = "走到生命尽头", "乐夫天命" = "乐天安命", "复奚疑" = "还有什么疑虑" } - -["归园田居·其一"] -note = [] -content = "归园田居·其一/" -translation = "归园田居·其一" -keyword_note = {} - -["少无适俗韵, 性本爱丘山"] -note = [] -content = "少/无/适俗/韵/, 性/本/爱/丘山/" -translation = "年少时就没有适应世俗的性情, 生来就喜爱大自然的风物" -keyword_note = { "少" = "指少年时代", "适俗" = "适应世俗", "韵" = "气质、情致. 一作'愿'", "丘山" = "指山林" } - -["误落尘网中, 一去三十年"] -note = ['误落 一作: 误入'] -content = "误落/尘网/中/, 一去/三十年/" -translation = "错误地陷落到世俗的种种束缚中, 转眼间远离田园已十余年" -keyword_note = { "尘网" = "世俗的种种束缚", "三十年" = "有人认为是'十三年'之误 (陶渊明做官十三年) . 一说, 此处是三又十年之意" } - -["羁鸟恋旧林, 池鱼思故渊"] -note = [] -content = "羁鸟/恋/旧林/, 池鱼/思/故渊/" -translation = "笼中之鸟怀念以前生活的树林, 池塘之鱼思念旧日嬉戏的深潭" -keyword_note = { "羁鸟" = "笼中之鸟", "恋" = "一作'眷'", "池鱼" = "池塘之鱼", "旧林、故渊" = "借喻自己怀恋旧居" } - -["开荒南野际, 守拙归园田"] -note = [] -content = "开荒/南野/际/, 守拙/归/园田/" -translation = "我愿到南面的田野去开荒, 依着拙朴的心性回家耕种田园" -keyword_note = { "南野" = "南面的田野. 一作'南亩', 指农田", "野" = "一作'亩'", "际" = "间", "守拙" = "意思是不随波逐流, 固守节操" } - -["方宅十余亩, 草屋八九间"] -note = [] -content = "方宅/十余/亩/, 草屋/八九/间/" -translation = "围绕着房宅方圆有十余亩地, 还有八九间茅草屋" -keyword_note = { "方宅" = "宅地方圆. 一说, '方'通'旁'" } - -["榆柳荫后檐, 桃李罗堂前"] -note = [] -content = "榆柳/荫/后檐/, 桃李/罗/堂前/" -translation = "生长茂盛的榆树柳树遮蔽了后屋檐, 桃树李树整齐的罗列在屋前" -keyword_note = { "荫" = "遮蔽", "罗" = "罗列" } - -["暧暧远人村, 依依墟里烟"] -note = [] -content = "暧暧/远人/村/, 依依/墟里/烟/" -translation = "远处邻村的屋舍依稀可见, 村落上方轻柔而缓慢的飘升着袅袅炊烟" -keyword_note = { "暧暧" = "迷蒙隐约的样子", "依依" = "轻柔而缓慢的飘升", "墟里" = "村落" } - -["狗吠深巷中, 鸡鸣桑树颠"] -note = [] -content = "狗吠/深巷/中/, 鸡鸣/桑树/颠/" -translation = "深深的街巷中传来了几声狗吠, 桑树顶端有雄鸡不停啼鸣" -keyword_note = { "颠" = "顶端" } - -["户庭无尘杂, 虚室有余闲"] -note = [] -content = "户庭/无/尘杂/, 虚室/有/余闲/" -translation = "庭院内没有尘俗杂事烦扰, 静室里有的是安适悠闲" -keyword_note = { "户庭" = "门户庭院", "尘杂" = "尘俗杂事", "虚室" = "空室, 比喻心境", "余闲" = "闲暇" } - -["久在樊笼里, 复得返自然"] -note = [] -content = "久在/樊笼/里/, 复得/返/自然/" -translation = "久久困于官场生活, 毫无自由, 我今日总算又归耕园田" -keyword_note = { "樊笼" = "蓄鸟工具, 这里比喻官场生活. 樊, 藩篱, 栅栏", "返自然" = "指归耕园田" } - -["念奴娇·赤壁怀古"] -note = [] -content = "念奴娇·赤壁怀古/" -translation = "念奴娇·赤壁怀古" -keyword_note = {} - -["大江东去, 浪淘尽, 千古风流人物."] -note = [] -content = "大江/东去/, 浪/淘尽/, 千古/风流/人物./" -translation = "滚滚长江向东奔流而去, 千百年来奔腾不息的滔滔巨浪淘尽了多少杰出的英雄人物" -keyword_note = { "大江" = "指长江", "淘" = "冲洗, 冲刷", "风流人物" = "指杰出的历史名人" } - -["故垒西边, 人道是, 三国周郎赤壁."] -note = [] -content = "故垒/西边/, 人道是/, 三国/周郎/赤壁./" -translation = "旧日营垒的西边, 有人说, 那儿是三国时周瑜大破曹军的赤壁" -keyword_note = { "故垒" = "过去遗留下来的营垒", "周郎" = "指三国时吴国名将周瑜, 字公瑾" } - -["乱石穿空, 惊涛拍岸, 卷起千堆雪."] -note = ['穿空 一作: 崩云'] -content = "乱石/穿空/, 惊涛/拍岸/, 卷起/千堆雪./" -translation = "只见陡峭纷乱的岩壁耸入云霄, 汹涌澎湃的巨浪拍打着江岸, 卷起无数堆雪白的浪花" -keyword_note = { "雪" = "比喻浪花" } - -["江山如画, 一时多少豪杰."] -note = [] -content = "江山/如画/, 一时/多少/豪杰./" -translation = "雄壮的江山奇丽如画, 一时间涌现了多少英雄豪杰" -keyword_note = { "豪杰" = "英雄豪杰" } - -["遥想公瑾当年, 小乔初嫁了, 雄姿英发."] -note = [] -content = "遥想/公瑾/当年/, 小乔/初嫁了/, 雄姿/英发./" -translation = "我不禁遥想起当年的周公瑾, 美丽的小乔刚嫁给他, 英姿雄健风度翩翩神采照人" -keyword_note = { "公瑾" = "周瑜字公瑾", "小乔" = "周瑜之妻", "雄姿英发" = "谓周瑜体貌不凡, 言谈卓绝" } - -["羽扇纶巾, 谈笑间, 樯橹灰飞烟灭."] -note = ['樯橹 一作: 强虏'] -content = "羽扇/纶巾/, 谈笑间/, 樯橹/灰飞/烟灭./" -translation = "手摇羽扇, 头戴纶巾, 谈笑之间, 就将曹军的战船烧得灰飞烟灭" -keyword_note = { "羽扇纶巾" = "古代儒将的便装打扮", "樯橹" = "这里代指曹操的水军战船" } - -["故国神游, 多情应笑我, 早生华发."] -note = [] -content = "故国/神游/, 多情/应笑我/, 早生/华发./" -translation = "如今我身临古战场神游往昔, 应笑我多愁善感, 以至于过早生出了白发" -keyword_note = { "故国神游" = "'神游故国'的倒文, 指当年的赤壁战场", "华发" = "花白的头发" } - -["人生如梦, 一尊还酹江月."] -note = ['人生 一作: 人间; 尊 同: 樽'] -content = "人生/如梦/, 一尊/还酹/江月./" -translation = "人生在世犹如大梦一场, 还是洒一杯酒祭献给江中伴我的明月吧" -keyword_note = { "尊" = "同'樽', 酒杯", "酹" = "洒酒于地, 表示祭奠或立誓" } - -["念奴娇·过洞庭"] -note = [] -content = "念奴娇·过洞庭/" -translation = "念奴娇·过洞庭" -keyword_note = {} - -["洞庭青草, 近中秋, 更无一点风色."] -note = [] -content = "洞庭/青草/, 近/中秋/, 更/无/一点/风色./" -translation = "洞庭湖与青草湖相连, 浩瀚无边, 在这中秋将至的时节, 更是没有一点风势" -keyword_note = { "洞庭" = "湖名, 在湖南岳阳西南", "青草" = "青草湖, 与洞庭湖相连", "风色" = "风势" } - -["玉鉴琼田三万顷, 着我扁舟一叶."] -note = ['着 同: 著', '玉鉴 一作: 玉界'] -content = "玉鉴/琼田/三万顷/, 着/我/扁舟/一叶./" -translation = "平静清澈的湖面像白玉磨成的镜子, 像美玉铺成的田地, 有几万顷那么宽阔, 湖上只漂浮着我的一叶扁舟" -keyword_note = { "玉鉴" = "像白玉磨成的镜子", "琼田" = "像美玉铺成的田地", "扁舟" = "小船" } - -["素月分辉, 明河共影, 表里俱澄澈."] -note = ['明河 一作: 银河'] -content = "素月/分辉/, 明河/共影/, 表里/俱/澄澈./" -translation = "皎洁的明月和灿烂的银河, 在这浩瀚的玉镜中映出她们的芳姿, 水面上下一片澄明" -keyword_note = { "素月" = "洁白的月亮", "明河" = "天河", "表里" = "里里外外, 此处指天上月亮和银河的光辉映入湖中, 上下一片澄明" } - -["悠然心会, 妙处难与君说."] -note = [] -content = "悠然/心会/, 妙处/难/与/君/说./" -translation = "体会着万物的空明, 这种美妙的体验却不知如何与君分享" -keyword_note = { "悠然" = "闲适自得的样子", "心会" = "内心领会" } - -["应念岭海经年, 孤光自照, 肝肺皆冰雪."] -note = ['岭海 一作: 岭表', '肝肺 一作: 肝胆'] -content = "应念/岭海/经年/, 孤光/自照/, 肝肺/皆/冰雪./" -translation = "感怀这一轮孤光自照的明月啊, 多少年徘徊于岭海之间, 胸襟仍像冰雪一样透明" -keyword_note = { "岭海" = "岭外, 即五岭以南的两广地区, 作者此前为官广西", "孤光" = "指月光", "冰雪" = "比喻心地光明磊落像冰雪般纯洁" } - -["短发萧骚襟袖冷, 稳泛沧浪空阔."] -note = ['短发 一作: 短鬓', '沧浪 一作: 沧冥'] -content = "短发/萧骚/襟袖/冷/, 稳/泛/沧浪/空阔./" -translation = "如今我 (虽) 因年老而深感短发稀疏, 衣襟单薄透着寒意, (但) 我仍能平静地泛舟在这广阔浩淼的苍溟之中" -keyword_note = { "萧骚" = "稀疏", "沧浪" = "青苍色的水" } - -["尽挹西江, 细斟北斗, 万象为宾客."] -note = ['尽挹 一作: 尽吸'] -content = "尽挹/西江/, 细斟/北斗/, 万象/为/宾客./" -translation = "让我捧尽西江清澈的江水, 细细地斟在北斗星做成的酒勺中, 请天地万象统统来做我的宾客" -keyword_note = { "挹" = "舀", "西江" = "长江连通洞庭湖, 中上游在洞庭以西, 故称西江", "北斗" = "星座名. 由七颗星排成像舀酒的斗的形状", "万象" = "万物" } - -["扣舷独啸, 不知今夕何夕!"] -note = ['扣 一作: 叩', '啸 一作: 笑'] -content = "扣舷/独啸/, 不知/今夕/何夕!/" -translation = "我尽情地拍打着我的船舷, 独自地放声高歌啊, 不知道今夕是何年! " -keyword_note = { "扣舷" = "敲击船舷", "啸" = "撮口作声", "不知今夕何夕" = "赞叹夜色美好, 使人沉醉, 竟忘掉一切 (包括时间) " } - -["扬州慢"] -note = [] -content = "扬州慢/" -translation = "扬州慢" -keyword_note = {} - -["淮左名都, 竹西佳处, 解鞍少驻初程."] -note = [] -content = "淮左/名都/, 竹西/佳处/, 解鞍/少驻/初程./" -translation = "扬州自古是著名的都会, 这里有著名游览胜地竹西亭, 初到扬州我解鞍下马停留一会儿. " -keyword_note = { "淮左名都" = "指扬州, 宋朝淮南东路的首府", "竹西" = "竹西亭, 扬州著名游览胜地", "解鞍少驻初程" = "解下马鞍稍作停留, 初段行程" } - -["过春风十里, 尽荠麦青青."] -note = [] -content = "过/春风/十里/, 尽/荠麦/青青./" -translation = "昔日繁华热闹的扬州路, 如今长满了青青荠麦, 一片荒凉. " -keyword_note = { "春风十里" = "借指扬州, 出自杜牧《赠别》诗" } - -["自胡马窥江去后, 废池乔木, 犹厌言兵."] -note = [] -content = "自/胡马/窥江/去后/, 废池/乔木/, 犹厌/言兵./" -translation = "金兵侵略长江流域地区, 洗劫扬州后, 只留下残存的古树和废毁的池台, 都不愿再谈论那残酷的战争. " -keyword_note = { "胡马窥江" = "指金兵侵略长江流域地区", "废池" = "废毁的池台", "乔木" = "残存的古树" } - -["渐黄昏, 清角吹寒, 都在空城."] -note = [] -content = "渐/黄昏/, 清角/吹寒/, 都在/空城./" -translation = "临近黄昏, 凄清的号角声响起, 回荡在这座凄凉残破的空城. " -keyword_note = { "清角" = "凄清的号角声", "空城" = "凄凉残破的空城" } - -["杜郎俊赏, 算而今, 重到须惊."] -note = [] -content = "杜郎/俊赏/, 算/而今/, 重到/须惊./" -translation = "杜牧俊逸清赏, 料想他现在再来的话也会感到震惊. " -keyword_note = { "杜郎" = "杜牧", "俊赏" = "俊逸清赏" } - -["纵豆蔻词工, 青楼梦好, 难赋深情."] -note = [] -content = "纵/豆蔻/词工/, 青楼/梦好/, 难赋/深情./" -translation = "即使'豆蔻'词语精工, 青楼美梦的诗意很好, 也难抒写此刻深沉悲怆感情. " -keyword_note = { "豆蔻词工" = "杜牧《赠别》诗词语精工", "青楼梦好" = "杜牧《遣怀》诗意境很好" } - -["二十四桥仍在, 波心荡, 冷月无声."] -note = [] -content = "二十四桥/仍在/, 波心/荡/, 冷月/无声./" -translation = "二十四桥依然还在, 桥下江水水波荡漾, 月色凄冷, 四周寂静无声. " -keyword_note = { "二十四桥" = "扬州城内古桥" } - -["念桥边红药, 年年知为谁生?"] -note = [] -content = "念/桥边/红药/, 年年/知为/谁生?/" -translation = "想那桥边红色的芍药花年年花叶繁荣, 可它们是为谁生长为谁开放呢? " -keyword_note = { "红药" = "红芍药花, 扬州繁华时期的名花" } - -["报任安书"] -note = [] -content = "报任安书/" -translation = "报任安书" -keyword_note = {} - -["古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉."] -note = ["摩: 通'磨'"] -content = "古者/富贵/而/名/摩灭/, 不可/胜记/, 唯/倜傥/非常/之/人称焉./" -translation = "古时候虽富贵但名字磨灭不传的人, 多得数不清, 只有那些卓异而不平常的人才在世上著称" -keyword_note = { "摩灭" = "磨灭", "胜记" = "尽记", "倜傥" = "卓越豪迈", "非常" = "非同寻常" } - -["盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;"] -note = [] -content = "盖/文王/拘/而/演/《周易》; /仲尼/厄/而/作/《春秋》; /屈原/放逐/, 乃/赋/《离骚》; /左丘/失明/, 厥/有/《国语》;/" -translation = "西伯姬昌被拘禁而扩写《周易》; 孔子受困窘而作《春秋》; 屈原被放逐, 才写了《离骚》; 左丘明失去视力, 才有《国语》" -keyword_note = { "拘" = "被拘禁", "演" = "推演", "厄" = "困厄", "放逐" = "被流放", "厥" = "才" } - -["孙子膑脚, 《兵法》修列; 不韦迁蜀, 世传《吕览》; 韩非囚秦, 《说难》《孤愤》;"] -note = ['膑脚: 名词作动词, 古代剔去膝盖骨的酷刑'] -content = "孙子/膑脚/, 《兵法》/修列; /不韦/迁蜀/, 世传/《吕览》; /韩非/囚秦/, 《说难》《孤愤》;/" -translation = "孙膑被截去膝盖骨, 《兵法》才撰写出来; 吕不韦被贬谪蜀地, 后世才流传着《吕览》; 韩非被囚禁在秦国, 写出《说难》《孤愤》" -keyword_note = { "膑脚" = "剔去膝盖骨", "修列" = "撰写出来", "迁蜀" = "被贬到蜀地" } - -["《诗》三百篇, 大底圣贤发愤之所为作也."] -note = ["底: 通'抵', 大抵, 大都"] -content = "《诗》/三百篇/, 大底/圣贤/发愤/之/所为作也./" -translation = "《诗经》三百篇, 大抵是一些圣贤们抒发愤懑而写作的" -keyword_note = { "大底" = "大抵, 大都", "发愤" = "抒发愤懑" } - -["此人皆意有所郁结, 不得通其道, 故述往事, 思来者."] -note = [] -content = "此人/皆/意/有/所郁结/, 不得/通其道/, 故/述往事/, 思来者./" -translation = "这些人都是心情郁结, 不能实现理想, 所以记述过去的事迹, 让将来的人了解自己的志向" -keyword_note = { "郁结" = "心情郁闷", "通其道" = "实现理想", "思来者" = "让后人思考" } - -["乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见."] -note = ["见: 通'现', 表现"] -content = "乃如/左丘/无目/, 孙子/断足/, 终/不可用/, 退而/论书策/, 以/舒其愤/, 思/垂空文/以/自见./" -translation = "就像左丘明没有了视力, 孙膑断了双脚, 终究不能为世所用, 便退而著书立说来抒发怨愤, 想让文章流传后世来表现自己的志向" -keyword_note = { "论书策" = "著书立说", "舒其愤" = "抒发怨愤", "垂空文" = "流传文章", "自见" = "表现自己" } - -["仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,"] -note = ["失: 通'佚', 散乱的文献"] -content = "仆/窃/不逊/, 近/自托/于/无能之辞/, 网罗/天下/放失旧闻/, 略/考其行事/, 综/其终始/, 稽/其成败兴坏之纪,/" -translation = "我私下里不自量力, 近来用我那不高明的文辞, 收集天下散失的历史传闻, 粗略地考订其事实, 综述其本末, 推究其成败盛衰的道理" -keyword_note = { "不逊" = "不自量力", "网罗" = "收集", "放失" = "散失", "稽" = "考察", "纪" = "规律" } - -["上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇."] -note = [] -content = "上计/轩辕/, 下/至于兹/, 为/十表/, 本纪十二/, 书八章/, 世家三十/, 列传七十/, 凡/百三十篇./" -translation = "上自黄帝, 下至当今, 写成表十篇, 本纪十二篇, 书八篇, 世家三十篇, 列传七十篇, 一共一百三十篇" -keyword_note = { "轩辕" = "黄帝", "兹" = "现在", "凡" = "总共" } - -["亦欲以究天人之际, 通古今之变, 成一家之言."] -note = [] -content = "亦欲/以/究天人之际/, 通/古今之变/, 成/一家之言./" -translation = "也就是想要探究自然和人间的关系, 弄通由古至今的变化规律, 自成一家之见解" -keyword_note = { "究" = "探究", "天人之际" = "自然与人的关系", "通" = "通晓" } - -["草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色."] -note = [] -content = "草创/未就/, 会/遭此祸/, 惜其/不成/, 是以/就极刑/而/无愠色./" -translation = "此书已经起草, 尚未完成, 就碰上这祸事, 惋惜它没有写成, 因此宁愿接受宫刑而没有怨怒的表情" -keyword_note = { "草创" = "起草", "未就" = "未完成", "会" = "恰逢", "极刑" = "宫刑", "愠色" = "怨怒表情" } - -["仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!"] -note = ["责: 通'债', 债务"] -content = "仆/诚/以/著此书/, 藏之/名山/, 传之/其人/, 通邑/大都/, 则/仆/偿前辱之责/, 虽/万被戮/, 岂有/悔哉!/" -translation = "我确实想完成这本书, 把它藏在名山之中, 传给可靠的人, 再让它流传进都市之中, 那么我就偿还了以前受辱的债, 即使一万次遭到杀戮, 哪里有后悔呢!" -keyword_note = { "诚" = "确实", "其人" = "可靠的人", "通邑" = "大都市", "偿" = "偿还", "戮" = "杀戮" } - -["然此可为智者道, 难为俗人言也!"] -note = [] -content = "然/此/可/为/智者道/, 难/为/俗人言也!/" -translation = "然而这些只能向有见识的人诉说, 却很难向世俗之人讲清楚啊!" -keyword_note = { "智者" = "有见识的人", "俗人" = "世俗之人" } - -["拟行路难·其四"] -note = [] -content = "拟行路难·其四/" -translation = "拟行路难·其四" -keyword_note = {} - -["泻水置平地, 各自东西南北流."] -note = [] -content = "泻水/置/平地/, 各自/东西/南北/流./" -translation = "往平地上倒水, 水会向不同方向流散" -keyword_note = { "泻水" = "倒水", "置" = "放置" } - -["人生亦有命, 安能行叹复坐愁?"] -note = [] -content = "人生/亦/有/命/, 安能/行叹/复/坐愁?/" -translation = "人生的际遇是既定的, 怎么能行止间叹息、惆怅呢? " -keyword_note = { "安能" = "怎么能", "行叹" = "行走时叹息", "坐愁" = "坐着发愁" } - -["酌酒以自宽, 举杯断绝歌路难."] -note = [] -content = "酌酒/以/自宽/, 举杯/断绝/歌/路难./" -translation = "喝点酒来自我宽慰, 因要饮酒而中断了《行路难》的歌唱" -keyword_note = { "酌酒" = "斟酒饮酒", "自宽" = "自我宽慰", "断绝" = "中断停止", "歌路难" = "歌唱《行路难》" } - -["心非木石岂无感, 吞声踯躅不敢言."] -note = [] -content = "心/非/木石/岂/无/感/, 吞声/踯躅/不敢/言./" -translation = "人心又不是草木, 怎么会没有感情? 欲说还休欲行又止不敢再多说什么" -keyword_note = { "木石" = "草木石头, 喻无情之物", "吞声" = "欲言又止", "踯躅" = "徘徊不前", "不敢言" = "不敢说出来" } - -["无衣"] -note = [] -content = "无衣/" -translation = "无衣" -keyword_note = {} - -["岂曰无衣? 与子同袍. 王于兴师, 修我戈矛, 与子同仇!"] -note = ['诗经·国风·秦风〔先秦〕'] -content = "岂曰/无衣? /与子/同袍. /王于/兴师/, 修我/戈矛/, 与子/同仇!/" -translation = "谁说没有衣服穿? 与你同穿战袍. 君王出兵打仗, 修整我那戈与矛, 与你共同对敌. " -keyword_note = { "袍" = "长袍, 即今之斗篷", "王" = "此指秦君. 一说指周天子", "于" = "语助词", "兴师" = "起兵", "同仇" = "共同对敌" } - -["岂曰无衣? 与子同泽. 王于兴师, 修我矛戟, 与子偕作!"] -note = [] -content = "岂曰/无衣? /与子/同泽. /王于/兴师/, 修我/矛戟/, 与子/偕作!/" -translation = "谁说没有衣服穿? 与你同穿内衣. 君王出兵打仗, 修整我那矛与戟, 与你一起出发. " -keyword_note = { "泽" = "通'襗', 内衣, 如今指汗衫", "偕作" = "一起出发" } - -["岂曰无衣? 与子同裳. 王于兴师, 修我甲兵, 与子偕行!"] -note = [] -content = "岂曰/无衣? /与子/同裳. /王于/兴师/, 修我/甲兵/, 与子/偕行!/" -translation = "谁说没有衣服穿? 与你同穿战裙. 君王出兵打仗, 修整甲胄与兵器, 杀敌与你共前进. " -keyword_note = { "裳" = "下衣, 此指战袍", "甲兵" = "铠甲与兵器", "偕行" = "一同前往" } - -["春江花月夜"] -note = [] -content = "春江花月夜/" -translation = "春江花月夜" -keyword_note = {} - -["春江潮水连海平, 海上明月共潮生."] -note = ['诗歌开篇描绘春江月夜的壮丽画面'] -content = "春江/潮水/连海/平/, 海上/明月/共潮/生./" -translation = "春天的江潮水势浩荡, 与大海连成一片, 一轮明月从海上升起, 好像与潮水一起涌出来. " -keyword_note = { "春江" = "春天的江水", "连海平" = "与海平面相连", "共潮生" = "与潮水一同升起" } - -["滟滟随波千万里, 何处春江无月明!"] -note = [] -content = "滟滟/随波/千万/里/, 何处/春江/无月/明!/" -translation = "月光照耀着春江, 随着波浪闪耀千万里, 所有地方的春江都有明亮的月光. " -keyword_note = { "滟滟" = "波光荡漾的样子", "随波" = "随着波浪", "何处" = "什么地方" } - -["江流宛转绕芳甸, 月照花林皆似霰."] -note = [] -content = "江流/宛转/绕芳/甸/, 月照/花林/皆似/霰./" -translation = "江水曲曲折折地绕着花草丛生的原野流淌, 月光照射着开遍鲜花的树林好像细密的雪珠在闪烁. " -keyword_note = { "宛转" = "曲折蜿蜒", "芳甸" = "芳草丰茂的原野", "霰" = "白色不透明的小冰粒, 形容月光下的花朵" } - -["空里流霜不觉飞, 汀上白沙看不见."] -note = [] -content = "空里/流霜/不觉/飞/, 汀上/白沙/看不/见./" -translation = "月色如霜, 所以霜飞无从觉察. 洲上的白沙和月色融合在一起, 看不分明. " -keyword_note = { "流霜" = "飞霜, 比喻月光皎洁", "汀" = "水边平地, 小洲", "看不见" = "看不分明" } - -["江天一色无纤尘, 皎皎空中孤月轮."] -note = [] -content = "江天/一色/无纤/尘/, 皎皎/空中/孤月/轮./" -translation = "江水、天空成一色, 没有一点微小灰尘, 明亮的天空中只有一轮孤月高悬空中. " -keyword_note = { "江天一色" = "江水和天空同一个颜色", "无纤尘" = "没有一点灰尘", "皎皎" = "明亮洁白", "孤月轮" = "孤独的月亮" } - -["江畔何人初见月? 江月何年初照人?"] -note = ['诗人开始哲学思考, 追问月亮与人类的关系'] -content = "江畔/何人/初见/月/? 江月/何年/初照/人?/" -translation = "江边上什么人最初看见月亮, 江上的月亮哪一年最初照耀着人? " -keyword_note = { "江畔" = "江边", "初见月" = "第一次看见月亮", "初照人" = "第一次照耀人间" } - -["人生代代无穷已, 江月年年望相似."] -note = [] -content = "人生/代代/无穷/已/, 江月/年年/望相/似./" -translation = "人生一代代地无穷无尽, 只有江上的月亮一年年地总是相像. " -keyword_note = { "代代" = "一代又一代", "无穷已" = "没有穷尽", "望相似" = "看起来相似" } - -["不知江月待何人, 但见长江送流水."] -note = [] -content = "不知/江月/待何/人/, 但见/长江/送流/水./" -translation = "不知江上的月亮等待着什么人, 只见长江不断地一直运输着流水. " -keyword_note = { "待何人" = "等待什么人", "但见" = "只见", "送流水" = "输送着流水" } - -["白云一片去悠悠, 青枫浦上不胜愁."] -note = ['转入游子思妇的离别相思之情'] -content = "白云/一片/去悠/悠/, 青枫/浦上/不胜/愁./" -translation = "游子像一片白云缓缓地离去, 只剩下思妇站在离别的青枫浦不胜忧愁. " -keyword_note = { "去悠悠" = "缓缓离去", "青枫浦" = "泛指离别的地方", "不胜愁" = "承受不住忧愁" } - -["谁家今夜扁舟子? 何处相思明月楼?"] -note = [] -content = "谁家/今夜/扁舟/子/? 何处/相思/明月/楼?/" -translation = "哪家的游子今晚坐着小船在漂流? 什么地方有人在明月照耀的楼上相思? " -keyword_note = { "谁家" = "哪一家", "扁舟子" = "漂泊江湖的游子", "明月楼" = "月夜下的闺楼" } - -["可怜楼上月徘徊, 应照离人妆镜台."] -note = [] -content = "可怜/楼上/月徘/徊/, 应照/离人/妆镜/台./" -translation = "可怜楼上不停移动的月光, 应该照耀着离人的梳妆台. " -keyword_note = { "可怜" = "可爱, 令人怜惜", "月徘徊" = "月光移动徘徊", "离人" = "离别的人, 指思妇", "妆镜台" = "梳妆台" } - -["玉户帘中卷不去, 捣衣砧上拂还来."] -note = [] -content = "玉户/帘中/卷不/去/, 捣衣/砧上/拂还/来./" -translation = "月光照进思妇的门帘, 卷不走, 照在她的捣衣砧上, 拂不掉. " -keyword_note = { "玉户" = "华美的门户", "卷不去" = "卷不走 (月光) ", "捣衣砧" = "捶布石", "拂还来" = "拂去了又回来" } - -["此时相望不相闻, 愿逐月华流照君."] -note = [] -content = "此时/相望/不相/闻/, 愿逐/月华/流照/君./" -translation = "这时互相望着月亮可是互相听不到声音, 我希望随着月光流去照耀着您. " -keyword_note = { "相望" = "互相望着", "不相闻" = "听不到彼此", "愿逐" = "愿意追随", "月华" = "月光" } - -["鸿雁长飞光不度, 鱼龙潜跃水成文."] -note = ['暗含鱼雁不能传信之意, 写月光之清澈无边'] -content = "鸿雁/长飞/光不/度/, 鱼龙/潜跃/水成/文./" -translation = "鸿雁不停地飞翔, 而不能飞出无边的月光; 月照江面, 鱼龙在水中跳跃, 激起阵阵波纹. " -keyword_note = { "鸿雁" = "大雁", "长飞" = "远飞", "光不度" = "飞不出月光", "潜跃" = "潜游跳跃", "水成文" = "水面形成波纹" } - -["昨夜闲潭梦落花, 可怜春半不还家."] -note = [] -content = "昨夜/闲潭/梦落/花/, 可怜/春半/不还/家./" -translation = "昨天夜里梦见花落闲潭, 可惜的是春天过了一半自己还不能回家. " -keyword_note = { "闲潭" = "幽静的水潭", "梦落花" = "梦见花落", "春半" = "春天过半", "不还家" = "不能回家" } - -["江水流春去欲尽, 江潭落月复西斜."] -note = [] -content = "江水/流春/去欲/尽/, 江潭/落月/复西/斜./" -translation = "江水带着春光将要流尽, 水潭上的月亮又要西落. " -keyword_note = { "流春" = "流淌着春光", "去欲尽" = "将要流尽", "复西斜" = "又向西倾斜" } - -["斜月沉沉藏海雾, 碣石潇湘无限路."] -note = ['碣石在北, 潇湘在南, 极言路途遥远'] -content = "斜月/沉沉/藏海/雾/, 碣石/潇湘/无限/路./" -translation = "斜月慢慢下沉, 藏在海雾里, 碣石与潇湘的离人距离无限遥远. " -keyword_note = { "沉沉" = "深沉, 慢慢下沉", "藏海雾" = "隐藏在海雾中", "碣石" = "山名, 在北方", "潇湘" = "水名, 在南方", "无限路" = "极远的道路" } - -["不知乘月几人归, 落月摇情满江树."] -note = ['以景结情, 余韵悠长'] -content = "不知/乘月/几人/归/, 落月/摇情/满江/树./" -translation = "不知有几人能趁着月光回家, 唯有那西落的月亮摇荡着离情, 洒满了江边的树林. " -keyword_note = { "乘月" = "趁着月光", "几人归" = "有几个人回家", "落月" = "西沉的月亮", "摇情" = "激荡情思", "满江树" = "洒满江边的树林" } - -["望海潮·东南形胜"] -note = [] -content = "望海潮·东南形胜/" -translation = "望海潮·东南形胜" -keyword_note = {} - -["东南形胜, 三吴都会, 钱塘自古繁华."] -note = ['开篇总写杭州的地理优势和繁华历史'] -content = "东南/形胜/, 三吴/都会/, 钱塘/自古/繁华./" -translation = "杭州地处东南方, 地理形势优越, 风景优美, 是三吴的都会, 这里自古以来就十分繁华. " -keyword_note = { "形胜" = "地理形势优越", "三吴" = "吴兴、吴郡、会稽三郡的合称", "钱塘" = "杭州的古称", "繁华" = "繁荣热闹" } - -["烟柳画桥, 风帘翠幕, 参差十万人家."] -note = [] -content = "烟柳/画桥/, 风帘/翠幕/, 参差/十万/人家./" -translation = "如烟一般的柳色、装饰华美的桥梁, 挡风的帘子、青绿色的帐幕, 楼阁高高低低, 大约有十万户人家. " -keyword_note = { "烟柳" = "如烟的柳色", "画桥" = "装饰华美的桥", "风帘" = "挡风的帘子", "翠幕" = "青绿色的帷幕", "参差" = "高低不齐的样子" } - -["云树绕堤沙, 怒涛卷霜雪, 天堑无涯."] -note = ['描写钱塘江的壮丽景色'] -content = "云树/绕/堤沙/, 怒涛/卷/霜雪/, 天堑/无涯./" -translation = "高耸入云的树, 环绕着钱塘江沙堤, 又高又急的潮头冲过来, 浪花像霜雪在滚动, 宽广的江面一望无涯. " -keyword_note = { "云树" = "高耸入云的树", "堤沙" = "江边的沙堤", "怒涛" = "汹涌的波涛", "卷霜雪" = "卷起霜雪般的浪花", "天堑" = "天然的壕沟, 指钱塘江", "无涯" = "无边无际" } - -["市列珠玑, 户盈罗绮, 竞豪奢."] -note = ['表现杭州的富庶和奢华'] -content = "市列/珠玑/, 户盈/罗绮/, 竞/豪奢./" -translation = "市场上陈列着琳琅满目的珠玉珍宝, 家家户户都存满了绫罗绸缎, 争相比奢华. " -keyword_note = { "市列" = "市场上陈列", "珠玑" = "珍珠和玉玑, 泛指珍宝", "户盈" = "家家户户充满", "罗绮" = "丝织品, 绫罗绸缎", "竞" = "竞争, 比赛", "豪奢" = "豪华奢侈" } - -["重湖叠𪩘清嘉, 有三秋桂子, 十里荷花."] -note = ['描写西湖的秀丽景色和四季美景'] -content = "重湖/叠𪩘/清嘉/, 有/三秋/桂子/, 十里/荷花./" -translation = "里湖、外湖与重重叠叠的山岭非常清秀美丽. 秋天桂花飘香, 夏季十里荷花. " -keyword_note = { "重湖" = "西湖分里湖和外湖", "叠𪩘" = "重叠的山峰", "清嘉" = "清秀美丽", "三秋" = "秋季, 农历九月", "桂子" = "桂花", "十里荷花" = "绵延十里的荷花" } - -["羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃."] -note = ['描绘杭州人民的游乐生活'] -content = "羌管/弄晴/, 菱歌/泛夜/, 嬉嬉/钓叟/莲娃./" -translation = "晴天欢快地吹奏羌笛, 夜晚划船采菱唱歌, 钓鱼的老翁、采莲的姑娘都喜笑颜开. " -keyword_note = { "羌管" = "羌笛, 泛指乐器", "弄晴" = "在晴日吹奏", "菱歌" = "采菱时唱的歌", "泛夜" = "在夜晚飘荡", "嬉嬉" = "喜笑颜开的样子", "钓叟" = "钓鱼的老翁", "莲娃" = "采莲的姑娘" } - -["千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞."] -note = ['描写孙何出巡的威仪和雅兴'] -content = "千骑/拥/高牙/, 乘醉/听/箫鼓/, 吟赏/烟霞./" -translation = "孙何外出时, 成群的马队簇拥着高高的牙旗, 缓缓而来, 声势煊赫. 在微醺中听着箫鼓管弦, 吟诗作词, 赞赏着美丽的水色山光. " -keyword_note = { "千骑" = "众多的骑从", "拥" = "簇拥", "高牙" = "高大的牙旗", "乘醉" = "趁着醉意", "箫鼓" = "箫和鼓, 泛指音乐", "吟赏" = "吟诗歌赏", "烟霞" = "山水景色" } - -["异日图将好景, 归去凤池夸."] -note = ['结尾表达祝愿之词'] -content = "异日/图将/好景/, 归去/凤池/夸./" -translation = "他日把这美好的景致画出来, 回京升官时向人们夸耀. " -keyword_note = { "异日" = "他日, 日后", "图将" = "描绘出来", "好景" = "美好景致", "归去" = "回去", "凤池" = "凤凰池, 指中书省, 代指朝廷", "夸" = "夸耀" } - -["朝天子·咏喇叭"] -note = [] -content = "朝天子·咏喇叭/" -translation = "朝天子·咏喇叭" -keyword_note = {} - -["喇叭, 唢呐, 曲儿小腔儿大"] -note = ['用喇叭唢呐比喻宦官, 表面写乐器, 实则讽刺宦官本事小却官腔十足'] -content = "喇叭/, 唢呐/, 曲儿/小/腔儿/大/" -translation = "喇叭和唢呐, 吹的曲子虽短, 声音却很响亮" -keyword_note = { "喇叭" = "铜制管乐器, 比喻宦官", "唢呐" = "管乐器, 同'锁呐'", "曲儿小" = "曲子很短", "腔儿大" = "声音很响, 暗指官腔十足" } - -["官船来往乱如麻, 全仗你抬声价"] -note = ['揭露宦官倚仗皇帝权势作威作福的丑态'] -content = "官船/来往/乱如麻/, 全仗/你/抬/声价/" -translation = "官船来往频繁乱如麻, 全凭借你抬高名誉地位" -keyword_note = { "官船" = "官府衙门的船只", "乱如麻" = "形容来往频繁", "仗" = "倚仗, 凭借", "声价" = "名誉地位, 同'身价'" } - -["军听了军愁, 民听了民怕"] -note = ['表现宦官监军扰民, 令军民都感到恐惧和忧愁'] -content = "军/听了/军愁/, 民/听了/民怕/" -translation = "军队听了军队发愁, 百姓听了百姓害怕" -keyword_note = { "军愁" = "军队因受宦官监军搅扰而发愁", "民怕" = "百姓害怕宦官的欺压" } - -["哪里去辨甚么真共假?"] -note = ['讽刺世人无法分辨宦官传达的旨意真假, 暗指宦官常常假传圣旨'] -content = "哪里/去辨/甚么/真共假?/" -translation = "哪里会去辨别什么真和假? " -keyword_note = { "辨" = "分辨、分别", "甚么" = "同'什么'", "真共假" = "真和假" } - -["眼见的吹翻了这家, 吹伤了那家,"] -note = ['具体描写宦官欺压百姓造成的严重后果'] -content = "眼见/的/吹翻了/这家/, 吹伤了/那家,/" -translation = "眼看着使有的人家倾家荡产, 有的人家元气大伤" -keyword_note = { "吹翻了" = "使倾家荡产", "吹伤了" = "使元气大伤" } - -["只吹的水尽鹅飞罢!"] -note = ['用比喻手法表现宦官欺压导致民穷财尽、家破人亡的悲惨结局'] -content = "只吹/的/水尽/鹅飞/罢!/" -translation = "直吹得江水枯竭鹅飞跑, 家破人亡啊! " -keyword_note = { "水尽鹅飞" = "比喻民穷财尽, 家破人亡", "罢" = "语气词, 表示完结" } - -["李凭箜篌引"] -note = [] -content = "李凭箜篌引/" -translation = "李凭箜篌引" -keyword_note = {} - -["吴丝蜀桐张高秋, 空山凝云颓不流."] -note = [] -content = "吴丝/蜀桐/张/高秋/, 空山/凝云/颓/不流./" -translation = "秋夜弹奏起吴丝蜀桐制成的精美箜篌, 听到美妙的乐声, 山上的白云都凝聚起来不再飘游" -keyword_note = { "吴丝蜀桐" = "吴地之丝, 蜀地之桐, 指制作箜篌的材料", "张" = "调好弦, 准备调奏", "高秋" = "指弹奏时间, 深秋天气", "空山" = "一作'空白', 指山中的行云" } - -["江娥啼竹素女愁, 李凭中国弹箜篌."] -note = [] -content = "江娥/啼竹/素女/愁/, 李凭/中国/弹/箜篌./" -translation = "湘娥把点点泪珠洒满斑竹, 九天素女也被牵动满腔忧愁; 这高妙的乐声从哪儿传出? 是乐工李凭在京城弹奏箜篌" -keyword_note = { "江娥" = "一作'湘娥', 指舜的妃子娥皇、女英", "素女" = "传说中的神女", "中国" = "即国之中央, 意谓在京城" } - -["昆山玉碎凤凰叫, 芙蓉泣露香兰笑."] -note = [] -content = "昆山/玉碎/凤凰/叫/, 芙蓉/泣露/香兰/笑./" -translation = "乐声清脆得就像昆仑山的美玉被击碎, 凤凰在鸣叫; 时而又像芙蓉在露水中饮泣, 像兰花迎风开放笑语轻柔" -keyword_note = { "昆山玉碎" = "昆仑玉碎, 形容乐音清脆", "凤凰叫" = "形容乐音和缓", "芙蓉泣露" = "形容乐声低回", "香兰笑" = "形容乐声轻快" } - -["十二门前融冷光, 二十三丝动紫皇."] -note = [] -content = "十二门/前/融/冷光/, 二十三丝/动/紫皇./" -translation = "笼罩整个长安城的月光变得温煦; 高弹轻拨箜篌, 帝王的心弦也被乐声打动" -keyword_note = { "十二门" = "长安城东西南北每一面各三门, 共十二门", "二十三丝" = "竖箜篌有二十三弦", "紫皇" = "道教称天上最尊的神, 这里用来指皇帝" } - -["女娲炼石补天处, 石破天惊逗秋雨."] -note = [] -content = "女娲/炼石/补天/处/, 石破/天惊/逗/秋雨./" -translation = "高亢的乐声直冲云霄, 冲上女娲炼石补过的天际; 好似补天的五彩石被击破, 引落了漫天绵绵秋雨" -keyword_note = { "女娲" = "中华上古之神, 人首蛇身", "石破天惊" = "补天的五色石被震破", "逗" = "引" } - -["梦入神山教神妪, 老鱼跳波瘦蛟舞."] -note = [] -content = "梦入/神山/教/神妪/, 老鱼/跳波/瘦蛟/舞./" -translation = "幻觉中仿佛看见乐工进入了神山, 把技艺向神女传授; 湖中老鱼兴奋得在波中跳跃, 潭中瘦蛟也翩翩起舞乐悠悠" -keyword_note = { "神妪" = "神仙老妇", "老鱼跳波" = "鱼随着乐声跳跃" } - -["吴质不眠倚桂树, 露脚斜飞湿寒兔."] -note = [] -content = "吴质/不眠/倚/桂树/, 露脚/斜飞/湿/寒兔./" -translation = "月宫中吴刚被乐声吸引, 彻夜不眠在桂树下徘徊逗留; 露滴斜斜坠落, 打湿了 (全神贯注聆听箜篌演奏的) 玉兔" -keyword_note = { "吴质" = "即吴刚", "露脚" = "露珠下滴的形象说法", "寒兔" = "指秋月, 传说月中有玉兔" } - -["桂枝香·金陵怀古"] -note = [] -content = "桂枝香·金陵怀古/" -translation = "桂枝香·金陵怀古" -keyword_note = {} - -["登临送目, 正故国晚秋, 天气初肃."] -note = [] -content = "登临/送目/, 正/故国/晚秋/, 天气/初肃./" -translation = "登山临水, 举目望远, 故都金陵正是深秋, 天气已变得飒爽清凉" -keyword_note = { "登临" = "登山临水", "送目" = "举目望远", "故国" = "旧时的都城, 指金陵", "初肃" = "开始变得飒爽清凉" } - -["千里澄江似练, 翠峰如簇."] -note = [] -content = "千里/澄江/似练/, 翠峰/如簇./" -translation = "奔腾千里的长江澄澈得像一匹长长的白绢, 青翠的山峰俊伟峭拔犹如一束束的箭簇" -keyword_note = { "澄江似练" = "清澈的长江像白绢. 语出谢朓《晚登三山还望京邑》", "如簇" = "像箭簇一样丛聚" } - -["归帆去棹残阳里, 背西风, 酒旗斜矗."] -note = ['归帆 一作: 征帆'] -content = "归帆/去棹/残阳里/, 背/西风/, 酒旗/斜矗./" -translation = "船只在夕阳下往来穿梭, 酒楼外斜插的酒旗随着西风飘扬" -keyword_note = { "归帆去棹" = "往来的船只", "酒旗" = "酒楼外悬挂的旗帜", "斜矗" = "斜插着" } - -["彩舟云淡, 星河鹭起, 画图难足."] -note = [] -content = "彩舟/云淡/, 星河/鹭起/, 画图/难足./" -translation = "华丽的画船如同在淡云中浮游, 江中洲上的白鹭时而停歇时而飞起, 这清丽的景色就是丹青妙笔也难描画" -keyword_note = { "彩舟" = "华丽的画船", "星河鹭起" = "白鹭从水中沙洲上飞起", "画图难足" = "用图画也难以完美地表现" } - -["念往昔, 繁华竞逐."] -note = [] -content = "念/往昔/, 繁华/竞逐./" -translation = "遥想当年, 达官贵人争着过豪华的生活" -keyword_note = { "繁华竞逐" = "争着过豪华的生活" } - -["叹门外楼头, 悲恨相续."] -note = [] -content = "叹/门外/楼头/, 悲恨/相续./" -translation = "可叹在朱雀门外结绮阁楼, 亡国的悲剧连续发生" -keyword_note = { "门外楼头" = "指南朝陈亡国惨剧. 语出杜牧《台城曲》", "悲恨相续" = "亡国悲剧连续发生" } - -["千古凭高对此, 谩嗟荣辱."] -note = [] -content = "千古/凭高/对此/, 谩嗟/荣辱./" -translation = "自古多少人在此登高怀古, 无不对历代荣辱喟叹感伤" -keyword_note = { "凭高" = "登高", "谩嗟荣辱" = "空叹什么荣耀耻辱" } - -["六朝旧事随流水, 但寒烟衰草凝绿."] -note = ['衰草 一作: 芳草'] -content = "六朝/旧事/随流水/, 但/寒烟/衰草/凝绿./" -translation = "六朝的风云变化全都随着流水消逝, 唯有江上的烟波与草上凝结的露珠常在" -keyword_note = { "六朝" = "指三国吴、东晋、南朝宋、齐、梁、陈六个朝代", "寒烟衰草" = "江上的烟波与衰败的草" } - -["至今商女, 时时犹唱, 后庭遗曲."] -note = [] -content = "至今/商女/, 时时/犹唱/, 后庭/遗曲./" -translation = "如今的商女, 还不知亡国的悲恨, 时时放声歌唱《玉树后庭花》" -keyword_note = { "商女" = "歌女", "后庭遗曲" = "指歌曲《玉树后庭花》, 传为陈后主所作, 被认为是亡国之音" } - -["梦游天姥吟留别"] -note = [] -content = "梦游天姥吟留别/" -translation = "梦游天姥吟留别" -keyword_note = {} - -["海客谈瀛洲, 烟涛微茫信难求; 越人语天姥, 云霞明灭或可睹."] -note = [] -content = "海客/谈/瀛洲/, 烟涛/微茫/信/难求; /越人/语/天姥/, 云霞/明灭/或/可睹./" -translation = "听海外来客们谈起瀛洲, 烟波渺茫实在难以寻求. 越中来人说起天姥山, 在云雾忽明忽暗间有时能看见. " -keyword_note = { "海客" = "海外来客", "瀛洲" = "古代传说中的东海三座仙山之一", "烟涛" = "波涛渺茫, 远看像烟雾笼罩的样子", "微茫" = "景象模糊不清", "信" = "确实, 实在", "越人" = "指浙江一带的人", "天姥" = "天姥山, 在浙江新昌东面", "明灭" = "忽明忽暗", "或" = "有时", "睹" = "看见" } - -["天姥连天向天横, 势拔五岳掩赤城."] -note = [] -content = "天姥/连天/向天/横/, 势/拔/五岳/掩/赤城./" -translation = "天姥山仿佛连接着天遮断了天空, 山势高峻超过五岳, 遮掩过赤城山. " -keyword_note = { "向天横" = "遮蔽天空", "拔" = "超出", "五岳" = "指东岳泰山、西岳华山、中岳嵩山、北岳恒山、南岳衡山", "掩" = "遮掩", "赤城" = "山名, 在今浙江天台北部" } - -["天台四万八千丈, 对此欲倒东南倾."] -note = [] -content = "天台/四万/八千/丈/, 对此/欲倒/东南/倾./" -translation = "天台山虽高四万八千丈, 面对着它好像要向东南倾斜拜倒一样. " -keyword_note = { "天台" = "山名, 在今浙江天台北部", "四万八千丈" = "极言其高", "对此" = "对着天姥山", "欲" = "好像要", "东南倾" = "向东南方向倾斜" } - -["我欲因之梦吴越, 一夜飞度镜湖月."] -note = [] -content = "我/欲/因之/梦/吴越/, 一夜/飞度/镜湖/月./" -translation = "我想依据越人说的话梦游到吴越, 一天夜晚飞渡过明月映照下的镜湖. " -keyword_note = { "因之" = "依据越人的话", "梦" = "梦游", "吴越" = "指越地", "飞度" = "飞渡", "镜湖" = "又名鉴湖, 在浙江绍兴南面" } - -["湖月照我影, 送我至剡溪."] -note = [] -content = "湖月/照/我影/, 送我/至/剡溪./" -translation = "镜湖上的月光照着我的身影, 一直送我到了剡溪. " -keyword_note = { "湖月" = "镜湖上的月光", "照我影" = "照着我的身影", "剡溪" = "水名, 在浙江嵊州南面" } - -["谢公宿处今尚在, 渌水荡漾清猿啼."] -note = [] -content = "谢公/宿处/今/尚在/, 渌水/荡漾/清猿/啼./" -translation = "谢灵运住的地方如今还在, 清澈的湖水荡漾, 猿猴凄清啼叫. " -keyword_note = { "谢公" = "指南朝诗人谢灵运", "宿处" = "住宿的地方", "尚" = "还", "渌水" = "清澈的水", "荡漾" = "水波摇动的样子", "清猿" = "叫声凄清的猿猴" } - -["脚著谢公屐, 身登青云梯."] -note = [] -content = "脚/著/谢公/屐/, 身/登/青云/梯./" -translation = "我脚上穿着谢公当年特制的木鞋, 攀登直上云霄的山路. " -keyword_note = { "著" = "穿", "谢公屐" = "谢灵运特制的木屐", "青云梯" = "指直上云霄的山路" } - -["半壁见海日, 空中闻天鸡."] -note = [] -content = "半壁/见/海日/, 空中/闻/天鸡./" -translation = "上到半山腰就看见了从海上升起的太阳, 空中传来天鸡报晓的啼鸣之声. " -keyword_note = { "半壁" = "半山腰", "海日" = "从海上升起的太阳", "天鸡" = "古代传说中的神鸡" } - -["千岩万转路不定, 迷花倚石忽已暝."] -note = [] -content = "千岩/万转/路/不定/, 迷花/倚石/忽/已暝./" -translation = "无数山岩重叠, 山道曲折, 盘旋变化不定. 迷恋着花, 依倚着石, 不觉天色已晚. " -keyword_note = { "千岩万转" = "山岩重叠, 道路曲折", "不定" = "变化不定", "迷花" = "迷恋花草", "倚石" = "倚靠石头", "忽" = "忽然", "暝" = "天黑" } - -["熊咆龙吟殷岩泉, 栗深林兮惊层巅."] -note = [] -content = "熊咆/龙吟/殷/岩泉/, 栗/深林/兮/惊/层巅./" -translation = "熊在怒吼, 龙在长鸣, 岩中的泉水在震响, 使深林战栗, 使高耸而重叠的山峰惊颤. " -keyword_note = { "熊咆" = "熊的怒吼", "龙吟" = "龙的鸣叫", "殷" = "震响", "岩泉" = "山岩中的泉水", "栗" = "使...战栗", "惊" = "使...惊颤", "层巅" = "重叠的山峰" } - -["云青青兮欲雨, 水澹澹兮生烟."] -note = [] -content = "云/青青/兮/欲雨/, 水/澹澹/兮/生烟./" -translation = "云层黑沉沉的, 像是要下雨, 水波动荡生起了薄薄的烟雾. " -keyword_note = { "青青" = "黑沉沉的样子", "欲雨" = "将要下雨", "澹澹" = "水波荡漾的样子", "生烟" = "产生烟雾" } - -["列缺霹雳, 丘峦崩摧."] -note = [] -content = "列缺/霹雳/, 丘峦/崩摧./" -translation = "电光闪闪, 雷声轰鸣, 山峰好像要崩塌似的. " -keyword_note = { "列缺" = "闪电", "霹雳" = "雷声", "丘峦" = "山峰", "崩摧" = "崩塌" } - -["洞天石扉, 訇然中开."] -note = [] -content = "洞天/石扉/, 訇然/中开./" -translation = "仙府的石门, “訇”的一声从中间打开. " -keyword_note = { "洞天" = "仙人居住的洞府", "石扉" = "石门", "訇然" = "巨大的响声", "中开" = "从中间打开" } - -["青冥浩荡不见底, 日月照耀金银台."] -note = [] -content = "青冥/浩荡/不见/底/, 日月/照耀/金银/台./" -translation = "洞中蔚蓝的天空广阔无际, 看不到尽头, 日月照耀着金银做的宫阙. " -keyword_note = { "青冥" = "天空", "浩荡" = "广阔无边的样子", "不见底" = "看不到尽头", "金银台" = "金银铸成的宫阙" } - -["霓为衣兮风为马, 云之君兮纷纷而来下."] -note = [] -content = "霓/为衣/兮/风/为马/, 云之/君兮/纷纷/而来下./" -translation = "用彩虹做衣裳, 将风作为马来乘, 云中的神仙们纷纷下来. " -keyword_note = { "霓" = "彩虹", "为衣" = "做衣裳", "为马" = "作为马", "云之君" = "云中的神仙", "纷纷" = "众多的样子", "来下" = "下来" } - -["虎鼓瑟兮鸾回车, 仙之人兮列如麻."] -note = [] -content = "虎/鼓瑟/兮/鸾/回车/, 仙之/人兮/列/如麻./" -translation = "老虎弹奏着琴瑟, 鸾鸟驾着车. 仙人们排成列, 密密麻麻. " -keyword_note = { "鼓瑟" = "弹奏琴瑟", "鸾" = "传说中的神鸟", "回车" = "驾车", "列如麻" = "排列得像麻一样密集" } - -["忽魂悸以魄动, 恍惊起而长嗟."] -note = [] -content = "忽/魂悸/以/魄动/, 恍/惊起/而/长嗟./" -translation = "忽然魂魄惊动, 我猛然惊醒, 不禁长声叹息. " -keyword_note = { "魂悸" = "魂魄惊动", "魄动" = "精神震动", "恍" = "恍然", "惊起" = "惊醒坐起", "长嗟" = "长声叹息" } - -["惟觉时之枕席, 失向来之烟霞."] -note = [] -content = "惟/觉时/之/枕席/, 失/向来/之/烟霞./" -translation = "醒来时只有身边的枕席, 刚才梦中所见的烟雾云霞全都消失了. " -keyword_note = { "惟" = "只有", "觉时" = "醒来时", "向来" = "刚才", "烟霞" = "指梦中的仙境景象" } - -["世间行乐亦如此, 古来万事东流水."] -note = [] -content = "世间/行乐/亦/如此/, 古来/万事/东流/水./" -translation = "人世间的欢乐也是像梦中的幻境这样, 自古以来万事都像东流的水一样一去不复返. " -keyword_note = { "行乐" = "人世欢乐", "如此" = "像这样", "古来" = "自古以来", "东流水" = "向东流去的水" } - -["别君去兮何时还? 且放白鹿青崖间, 须行即骑访名山."] -note = [] -content = "别君/去兮/何时/还? /且/放/白鹿/青崖/间/, 须/行/即骑/访/名山./" -translation = "告别诸君, 此番远去不知何时才能回来? 暂且把白鹿放牧在青崖间, 等到要远行时就骑上它寻访名山. " -keyword_note = { "别君" = "告别诸君", "去兮" = "离去啊", "还" = "回来", "且" = "暂且", "白鹿" = "传说神仙或隐士多骑白鹿", "青崖" = "青翠的山崖", "须" = "等待", "即" = "就", "访" = "寻访" } - -["安能摧眉折腰事权贵, 使我不得开心颜?"] -note = [] -content = "安能/摧眉/折腰/事/权贵/, 使我/不得/开心/颜?/" -translation = "岂能卑躬屈膝去侍奉权贵, 让自己不能有舒心畅意的笑颜! " -keyword_note = { "安能" = "怎么能", "摧眉折腰" = "低头弯腰", "事" = "侍奉", "权贵" = "有权势的贵族", "开心颜" = "心情愉快, 笑逐颜开" } - -["永遇乐·京口北固亭怀古"] -note = [] -content = "永遇乐·京口北固亭怀古/" -translation = "永遇乐·京口北固亭怀古" -keyword_note = {} - -["千古江山, 英雄无觅, 孙仲谋处."] -note = [] -content = "千古/江山/, 英雄/无觅/, 孙仲谋/处./" -translation = "历经千古的江山, 再也难以寻觅到像孙权那样的英雄" -keyword_note = { "千古" = "年代久远", "无觅" = "难以寻找", "孙仲谋" = "三国时的吴王孙权, 字仲谋" } - -["舞榭歌台, 风流总被, 雨打风吹去."] -note = [] -content = "舞榭/歌台/, 风流/总被/, 雨打/风吹/去./" -translation = "当年的舞榭歌台还在, 英雄人物却早已随着岁月的流逝不复存在了" -keyword_note = { "舞榭歌台" = "歌舞的台榭", "风流" = "指英雄的流风余韵" } - -["斜阳草树, 寻常巷陌, 人道寄奴曾住."] -note = [] -content = "斜阳/草树/, 寻常/巷陌/, 人道/寄奴/曾住./" -translation = "斜阳照着长满草树的普通街道, 人们说那里是刘裕曾经住过的地方" -keyword_note = { "寻常" = "普通", "巷陌" = "街道", "寄奴" = "南朝宋武帝刘裕小名" } - -["想当年, 金戈铁马, 气吞万里如虎."] -note = [] -content = "想/当年/, 金戈/铁马/, 气吞/万里/如虎./" -translation = "遥想当年, 他指挥着强劲精良的兵马, 气吞骄虏一如猛虎" -keyword_note = { "金戈铁马" = "指精锐的部队", "气吞万里" = "形容气势磅礴" } - -["元嘉草草, 封狼居胥, 赢得仓皇北顾."] -note = [] -content = "元嘉/草草/, 封/狼居胥/, 赢得/仓皇/北顾./" -translation = "宋文帝兴兵北伐多么轻率鲁莽, 想建立不朽战功封狼居胥, 却落得仓皇逃命, 北望追兵泪下无数的结果" -keyword_note = { "元嘉" = "刘裕子刘义隆年号", "草草" = "轻率", "封狼居胥" = "指立大功", "赢得" = "剩得, 落得" } - -["四十三年, 望中犹记, 烽火扬州路."] -note = [] -content = "四十/三年/, 望中/犹记/, 烽火/扬州/路./" -translation = "四十三年过去了, 如今瞭望长江北岸, 仍然记得当年扬州地区金兵南侵时烽火连天的情景" -keyword_note = { "四十三年" = "作者于1162年南归, 到写该词时正好为四十三年", "烽火" = "战火", "扬州路" = "扬州地区" } - -["可堪回首, 佛狸祠下, 一片神鸦社鼓."] -note = [] -content = "可堪/回首/, 佛狸/祠下/, 一片/神鸦/社鼓./" -translation = "不堪回首, 拓跋焘的行宫下, 神鸦叫声应和着喧闹的社鼓" -keyword_note = { "可堪" = "怎能忍受", "佛狸祠" = "北魏太武帝拓跋焘小名佛狸, 在瓜步山上建立的行宫", "神鸦" = "在庙里吃祭品的乌鸦", "社鼓" = "祭祀时的鼓声" } - -["凭谁问: 廉颇老矣, 尚能饭否?"] -note = [] -content = "凭谁/问:/ 廉颇/老矣/, 尚能/饭否?/" -translation = "还有谁会询问, 廉颇将军已老, 他的身体是否强健如故" -keyword_note = { "廉颇" = "战国时赵国名将", "尚能饭否" = "还能吃饭吗 (指身体是否强健) " } - -["江城子·乙卯正月二十日夜记梦"] -note = [] -content = "江城子·乙卯正月二十日夜记梦/" -translation = "江城子·乙卯正月二十日夜记梦" -keyword_note = {} - -["十年生死两茫茫, 不思量, 自难忘"] -note = [] -content = "十年/生死/两/茫茫/, 不/思量/, 自/难忘/" -translation = "你我夫妻诀别已经整整十年, 强忍不去思念可终究难以忘怀" -keyword_note = { "十年" = "指结发妻子王弗去世已十年", "思量" = "想念", "茫茫" = "模糊不清的样子" } - -["千里孤坟, 无处话凄凉"] -note = [] -content = "千里/孤坟/, 无处/话/凄凉/" -translation = "你的坟墓远在千里之外, 没有地方能诉说我心中的悲伤凄凉" -keyword_note = { "千里" = "王弗葬地四川眉山与苏轼任所山东密州, 相隔遥远", "孤坟" = "其妻王氏之墓", "凄凉" = "悲伤寂寞" } - -["纵使相逢应不识, 尘满面, 鬓如霜"] -note = [] -content = "纵使/相逢/应/不识/, 尘/满面/, 鬓/如霜/" -translation = "即使你我夫妻相逢怕是也认不出我来了, 我四处奔波早已是灰尘满面两鬓如霜" -keyword_note = { "纵使" = "即使", "尘满面" = "形容奔波劳碌", "鬓如霜" = "两鬓斑白如霜" } - -["夜来幽梦忽还乡, 小轩窗, 正梳妆"] -note = [] -content = "夜来/幽梦/忽/还乡/, 小轩窗/, 正/梳妆/" -translation = "昨夜在梦中回到了家乡, 看见你正在小室的窗前对镜梳妆" -keyword_note = { "幽梦" = "梦境隐约, 故云幽梦", "小轩窗" = "指小室的窗前", "梳妆" = "梳洗打扮" } - -["相顾无言, 惟有泪千行"] -note = [] -content = "相顾/无言/, 惟有/泪/千行/" -translation = "你我二人默默相对无言, 只有泪落千行" -keyword_note = { "相顾" = "互相看着", "无言" = "没有说话", "泪千行" = "形容泪水极多" } - -["料得年年肠断处, 明月夜, 短松冈"] -note = [] -content = "料得/年年/肠断/处/, 明月夜/, 短松冈/" -translation = "料想你年年都为我柔肠寸断, 在那凄冷的月明之夜, 在那长满矮松的山冈上" -keyword_note = { "料得" = "预料到", "肠断" = "形容极度悲痛", "短松冈" = "苏轼葬妻之地, 矮小的松树山冈" } - -["涉江采芙蓉"] -note = [] -content = "涉江采芙蓉/" -translation = "涉江采芙蓉" -keyword_note = {} - -["涉江采芙蓉, 兰泽多芳草."] -note = [] -content = "涉江/采芙蓉/, 兰泽/多芳草./" -translation = "我涉过江水去采荷花, 生有兰草的水泽中长满了香草" -keyword_note = { "芙蓉" = "荷花的别名", "兰泽" = "生有兰草的沼泽地" } - -["采之欲遗谁? 所思在远道."] -note = [] -content = "采之/欲遗谁/? 所思/在远道./" -translation = "采了荷花想要送给谁呢? 想要送给远方的爱人" -keyword_note = { "遗" = "赠", "远道" = "远方" } - -["还顾望旧乡, 长路漫浩浩."] -note = [] -content = "还顾/望旧乡/, 长路/漫浩浩./" -translation = "回头看那一起生活过的故乡, 路途遥远没有尽头" -keyword_note = { "还顾" = "回顾, 回头看", "旧乡" = "故乡", "漫浩浩" = "形容路途的遥远无尽头, 形容无边无际" } - -["同心而离居, 忧伤以终老."] -note = [] -content = "同心/而离居/, 忧伤/以终老./" -translation = "两心相爱却要分隔两地不能在一起, 愁苦忧伤以至终老异乡" -keyword_note = { "同心" = "古代习用的成语, 多用于男女之间的爱情或夫妇感情融洽指感情深厚", "终老" = "度过晚年直至去世" } - -["燕歌行"] -note = [] -content = "燕歌行/" -translation = "燕歌行" -keyword_note = {} - -["开元二十六年, 客有从元戎出塞而还者, 作《燕歌行》以示, 适感征戍之事, 因而和焉."] -note = ['序言部分'] -content = "开元/二十六年/, 客/有/从/元戎/出塞/而还/者/, 作/《燕歌行》/以/示/, 适/感/征戍/之事/, 因而/和/焉./" -translation = "唐玄宗开元二十六年, 有个随从主帅出塞回来的人, 写了一首《燕歌行》给我看. 我感慨于边疆戍守的事, 因而写了这首《燕歌行》应和他. " -keyword_note = { "元戎" = "军事元帅", "征戍" = "边疆戍守", "和" = "应和" } - -["汉家烟尘在东北, 汉将辞家破残贼."] -note = [] -content = "汉家/烟尘/在/东北/, 汉将/辞家/破/残贼./" -translation = "汉朝东北边境战事又起, 将军离家前去征讨贼寇. " -keyword_note = { "汉家" = "汉朝, 唐人诗中经常借汉说唐", "烟尘" = "代指战争", "残贼" = "凶残的敌人" } - -["男儿本自重横行, 天子非常赐颜色."] -note = [] -content = "男儿/本自/重/横行/, 天子/非常/赐/颜色./" -translation = "男儿本来就看重驰骋沙场, 杀敌打仗, 皇帝又特别给予他们丰厚的赏赐. " -keyword_note = { "横行" = "任意驰走, 无所阻挡", "非常赐颜色" = "超过平常的厚赐礼遇" } - -["摐金伐鼓下榆关, 旌旆逶迤碣石间."] -note = [] -content = "摐金/伐鼓/下/榆关/, 旌旆/逶迤/碣石/间./" -translation = "擂响金鼓, 军队浩浩荡荡开出山海关外, 旌旗舒展飘扬在碣石山间. " -keyword_note = { "摐金" = "撞击金属乐器", "伐鼓" = "敲击战鼓", "榆关" = "山海关", "旌旆" = "各种旗帜", "逶迤" = "舒展的样子" } - -["校尉羽书飞瀚海, 单于猎火照狼山."] -note = [] -content = "校尉/羽书/飞/瀚海/, 单于/猎火/照/狼山./" -translation = "校尉飞奔过浩瀚沙海, 紧急传递文书, 匈奴单于打猎时点燃的火光已照到我狼山. " -keyword_note = { "校尉" = "次于将军的武官", "羽书" = "插有鸟羽的紧急文书", "瀚海" = "沙漠", "单于" = "匈奴首领", "猎火" = "打猎时点燃的火光" } - -["山川萧条极边土, 胡骑凭陵杂风雨."] -note = [] -content = "山川/萧条/极/边土/, 胡骑/凭陵/杂/风雨./" -translation = "山河荒芜多萧条, 满目凄凉到边土, 胡人的骑兵来势凶猛, 如风雨交加. " -keyword_note = { "极" = "穷尽", "凭陵" = "仗势侵凌", "杂风雨" = "如风雨交加般凶猛" } - -["战士军前半死生, 美人帐下犹歌舞!"] -note = [] -content = "战士/军前/半/死生/, 美人/帐下/犹/歌舞!/" -translation = "战士在前线杀得昏天黑地, 不辨死生; 将军们依然逍遥自在地在营帐中观赏美人的歌舞! " -keyword_note = { "半死生" = "半生半死, 伤亡惨重" } - -["大漠穷秋塞草腓, 孤城落日斗兵稀."] -note = [] -content = "大漠/穷秋/塞草/腓/, 孤城/落日/斗兵/稀./" -translation = "深秋季节, 塞外沙漠上草木枯萎; 日落时分, 边城孤危, 作战的士兵越打越少. " -keyword_note = { "穷秋" = "深秋", "腓" = "枯萎", "斗兵稀" = "作战的士兵越打越少" } - -["身当恩遇常轻敌, 力尽关山未解围."] -note = ['常轻敌 一作: 恒轻敌'] -content = "身当/恩遇/常/轻敌/, 力尽/关山/未/解围./" -translation = "身受朝廷恩宠厚遇的主将常常不畏惧强敌, 战士筋疲力尽仍难解关山之围. " -keyword_note = { "身当恩遇" = "主将受朝廷的恩宠厚遇" } - -["铁衣远戍辛勤久, 玉箸应啼别离后."] -note = [] -content = "铁衣/远戍/辛勤/久/, 玉箸/应啼/别离/后./" -translation = "身披铁甲的征夫, 不知道守卫边疆多少年了, 那家中的思妇自丈夫被征走后, 应该一直在悲痛啼哭吧. " -keyword_note = { "铁衣" = "铁甲, 代指征夫", "玉箸" = "玉筷, 比喻思妇的泪水如注" } - -["少妇城南欲断肠, 征人蓟北空回首."] -note = [] -content = "少妇/城南/欲/断肠/, 征人/蓟北/空/回首./" -translation = "思妇独守故乡, 悲苦地牵肠挂肚, 征夫在边疆遥望家园空自回头. " -keyword_note = { "城南" = "京城长安的住宅区", "蓟北" = "唐朝东北边地" } - -["边庭飘飖那可度, 绝域苍茫无所有."] -note = ['飘飖 一作: 飘摇; 无所 一作: 更何'] -content = "边庭/飘飖/那/可/度/, 绝域/苍茫/无/所有./" -translation = "边塞战场动荡不安哪里能够轻易归来, 更遥远的边陲更加荒凉不毛. " -keyword_note = { "边庭" = "边塞战场", "飘飖" = "动荡不安", "绝域" = "更遥远的边陲", "无所有" = "更加荒凉不毛" } - -["杀气三时作阵云, 寒声一夜传刁斗."] -note = [] -content = "杀气/三时/作/阵云/, 寒声/一夜/传/刁斗./" -translation = "从早到晚杀气腾腾战云密布, 整夜里只听到巡更的刁斗声声悲伤. " -keyword_note = { "三时" = "晨、午、晚, 从早到夜", "阵云" = "战场上象征杀气的云", "刁斗" = "军中巡更报时和煮饭的两用铜器" } - -["相看白刃血纷纷, 死节从来岂顾勋!"] -note = ['血 一作: 雪'] -content = "相看/白刃/血/纷纷/, 死节/从来/岂/顾/勋!/" -translation = "战士们互相对望, 雪亮的战刀上染满了斑斑血迹; 坚守节操, 为国捐躯, 岂是为了个人的名利功勋? " -keyword_note = { "死节" = "为国捐躯", "岂顾勋" = "难道还顾及自己的功勋" } - -["君不见沙场征战苦, 至今犹忆李将军."] -note = [] -content = "君/不见/沙场/征战/苦/, 至今/犹忆/李将军./" -translation = "你没看见拼杀在沙场战斗多惨苦, 现在还在思念有勇有谋的李将军. " -keyword_note = { "李将军" = "指汉朝李广, 他能捍御强敌, 爱抚士卒" } - -["琵琶行"] -note = [] -content = "琵琶行/" -translation = "琵琶行" -keyword_note = {} - -["浔阳江头夜送客, 枫叶荻花秋瑟瑟."] -note = [] -content = "浔阳/江头/夜/送客/, 枫叶/荻花/秋/瑟瑟./" -translation = "夜晚到浔阳江头送别客人, 枫树、芦荻被秋风吹得飒飒作响" -keyword_note = { "浔阳江" = "万里长江流经江西省九江市北的一段", "瑟瑟" = "形容枫树、芦荻被秋风吹动的声音" } - -["主人下马客在船, 举酒欲饮无管弦."] -note = [] -content = "主人/下马/客/在船/, 举酒/欲饮/无/管弦./" -translation = "我和客人下马在船上设宴饯别, 举起酒杯想要饮酒却无助兴的音乐" -keyword_note = { "管弦" = "指音乐" } - -["醉不成欢惨将别, 别时茫茫江浸月."] -note = [] -content = "醉/不成欢/惨/将别/, 别时/茫茫/江/浸月./" -translation = "酒喝得不痛快更伤心将要分别, 临别时茫茫江水中浸着一轮冷月" -keyword_note = { "不成欢" = "不痛快", "江浸月" = "月亮倒映在江水中" } - -["忽闻水上琵琶声, 主人忘归客不发."] -note = [] -content = "忽闻/水上/琵琶/声/, 主人/忘归/客/不发./" -translation = "忽然听见江面传来阵阵琵琶声, 我忘却了回归, 客人也不想动身" -keyword_note = { "不发" = "不动身" } - -["寻声暗问弹者谁, 琵琶声停欲语迟."] -note = [] -content = "寻声/暗问/弹者/谁/, 琵琶/声停/欲语/迟./" -translation = "寻着声源探问弹琵琶的是何人? 琵琶声停了许久却迟迟不语" -keyword_note = { "暗问" = "轻声询问", "欲语迟" = "想说又迟疑" } - -["移船相近邀相见, 添酒回灯重开宴."] -note = [] -content = "移船/相近/邀/相见/, 添酒/回灯/重/开宴./" -translation = "我们移船靠近邀请她出来相见, 重新拨亮灯光再添酒摆开宴席" -keyword_note = { "回灯" = "重新拨亮灯光" } - -["千呼万唤始出来, 犹抱琵琶半遮面."] -note = [] -content = "千呼/万唤/始/出来/, 犹抱/琵琶/半/遮面./" -translation = "千呼万唤她才缓缓地走出来, 用怀里抱着的琵琶半遮着面" -keyword_note = { "始" = "才", "犹" = "还" } - -["转轴拨弦三两声, 未成曲调先有情."] -note = [] -content = "转轴/拨弦/三两/声/, 未成/曲调/先/有情./" -translation = "她拧转弦轴, 拨动弦丝, 试弹了几声, 还没弹成曲调却先有了感情" -keyword_note = { "转轴拨弦" = "调弦校音" } - -["弦弦掩抑声声思, 似诉平生不得志."] -note = [] -content = "弦弦/掩抑/声声/思/, 似诉/平生/不得/志./" -translation = "一弦弦凄楚悲切的声音隐含着深长的情思, 似乎在诉说着她一生的不如意" -keyword_note = { "掩抑" = "声音低沉", "思" = "深长的情思" } - -["低眉信手续续弹, 说尽心中无限事."] -note = [] -content = "低眉/信手/续续/弹/, 说尽/心中/无限/事./" -translation = "她低着眉头随手慢慢地连续弹奏, 尽情地倾诉心底无限的伤心事" -keyword_note = { "信手" = "随手", "续续" = "连续" } - -["轻拢慢捻抹复挑, 初为《霓裳》后《六幺》."] -note = [] -content = "轻拢/慢捻/抹/复挑/, 初为/《霓裳》/后/《六幺》./" -translation = "轻轻抚拢慢慢捻揉下抹又上挑, 初弹《霓裳羽衣曲》接着再弹《六幺》" -keyword_note = { "拢" = "扣弦", "捻" = "揉弦", "抹" = "顺手下拨", "挑" = "反手回拨", "《霓裳》" = "《霓裳羽衣曲》", "《六幺》" = "大曲名" } - -["大弦嘈嘈如急雨, 小弦切切如私语."] -note = [] -content = "大弦/嘈嘈/如/急雨/, 小弦/切切/如/私语./" -translation = "大弦声音沉重抑扬如暴风骤雨, 小弦细促轻幽、急切细碎, 如人窃窃私语" -keyword_note = { "大弦" = "最粗的弦", "嘈嘈" = "声音沉重抑扬", "小弦" = "最细的弦", "切切" = "细促轻幽" } - -["嘈嘈切切错杂弹, 大珠小珠落玉盘."] -note = [] -content = "嘈嘈/切切/错杂/弹/, 大珠/小珠/落/玉盘./" -translation = "嘈嘈声切切声互为交错地弹奏, 就像大珠小珠一颗颗掉落玉盘" -keyword_note = { "错杂" = "交错" } - -["间关莺语花底滑, 幽咽泉流冰下难."] -note = [] -content = "间关/莺语/花底/滑/, 幽咽/泉流/冰下/难./" -translation = "一会儿像黄鹂在花下啼鸣婉转流利, 一会儿又像泉水在冰下流动滞涩不畅" -keyword_note = { "间关" = "鸟鸣声", "幽咽" = "遏塞不畅状" } - -["冰泉冷涩弦凝绝, 凝绝不通声暂歇."] -note = [] -content = "冰泉/冷涩/弦/凝绝/, 凝绝/不通/声/暂歇./" -translation = "好像冰泉冷涩琵琶声开始凝滞, 凝滞而不通畅声音渐渐地停歇" -keyword_note = { "凝绝" = "凝滞" } - -["别有幽愁暗恨生, 此时无声胜有声."] -note = [] -content = "别有/幽愁/暗恨/生/, 此时/无声/胜/有声./" -translation = "像另有一种愁思幽恨暗暗滋生, 此时闷闷无声却比有声更动人" -keyword_note = { "幽愁" = "深藏的愁思", "暗恨" = "隐秘的怨恨" } - -["银瓶乍破水浆迸, 铁骑突出刀枪鸣."] -note = [] -content = "银瓶/乍破/水浆/迸/, 铁骑/突出/刀枪/鸣./" -translation = "突然间好像银瓶撞破水浆四溅, 又好像铁甲骑兵厮杀刀枪齐鸣" -keyword_note = { "乍破" = "突然破裂", "迸" = "溅射" } - -["曲终收拨当心画, 四弦一声如裂帛."] -note = [] -content = "曲终/收拨/当心/画/, 四弦/一声/如/裂帛./" -translation = "一曲终了拨子从弦索中间划过四弦, 一声轰鸣好像撕裂了布帛" -keyword_note = { "收拨" = "结束弹奏", "当心画" = "在琵琶中部划过四弦" } - -["东船西舫悄无言, 唯见江心秋月白."] -note = [] -content = "东船/西舫/悄/无言/, 唯见/江心/秋月/白./" -translation = "东西面的画舫、游船都静悄悄的, 只看见江心之中映着的秋月泛着白光" -keyword_note = { "舫" = "船" } - -["沉吟放拨插弦中, 整顿衣裳起敛容."] -note = [] -content = "沉吟/放拨/插/弦中/, 整顿/衣裳/起/敛容./" -translation = "她沉吟着收起拨片插在琴弦中; 然后整理一下衣服起身站立, 收敛面部表情" -keyword_note = { "敛容" = "收敛表情" } - -["自言本是京城女, 家在虾蟆陵下住."] -note = [] -content = "自言/本是/京城/女/, 家在/虾蟆陵/下/住./" -translation = "她说她本是京城负有盛名的歌女, 老家住在长安城东南的虾蟆陵" -keyword_note = { "虾蟆陵" = "在长安城东南, 是当时有名的游乐地区" } - -["十三学得琵琶成, 名属教坊第一部."] -note = [] -content = "十三/学得/琵琶/成/, 名属/教坊/第一/部./" -translation = "十三岁就已学会弹奏琵琶技艺, 名字登记在教坊乐团的第一部里" -keyword_note = { "教坊" = "唐代官办管领音乐杂技、教练歌舞的机关" } - -["曲罢曾教善才服, 妆成每被秋娘妒."] -note = [] -content = "曲罢/曾教/善才/服/, 妆成/每被/秋娘/妒./" -translation = "每曲弹罢都令艺术大师们叹服, 每次妆成都被同行歌伎们嫉妒" -keyword_note = { "善才" = "对琵琶师或曲师的通称", "秋娘" = "唐代歌妓女伶的通称" } - -["五陵年少争缠头, 一曲红绡不知数."] -note = [] -content = "五陵/年少/争/缠头/, 一曲/红绡/不知/数./" -translation = "京城的富贵子弟争着赠送财物, 每当一曲弹罢, 不知要给多少彩绸" -keyword_note = { "五陵" = "在长安城外, 汉代五个皇帝的陵墓", "缠头" = "送给歌舞妓女的财物", "红绡" = "精细轻美的丝织品" } - -["钿头银篦击节碎, 血色罗裙翻酒污."] -note = [] -content = "钿头/银篦/击节/碎/, 血色/罗裙/翻酒/污./" -translation = "打拍子敲碎了镶嵌着花钿的篦形发饰, 吃美酒染污了红色罗裙" -keyword_note = { "钿头银篦" = "镶嵌着花钿的篦形发饰", "击节" = "打拍子" } - -["今年欢笑复明年, 秋月春风等闲度."] -note = [] -content = "今年/欢笑/复/明年/, 秋月/春风/等闲/度./" -translation = "年复一年都在欢笑打闹中度过, 秋去春来美好的时光白白消磨" -keyword_note = { "等闲" = "随便, 轻易" } - -["弟走从军阿姨死, 暮去朝来颜色故."] -note = [] -content = "弟走/从军/阿姨/死/, 暮去/朝来/颜色/故./" -translation = "教坊的兄弟参军去了, 当家的阿姨也死了, 暮去朝来我也年老色衰" -keyword_note = { "颜色故" = "容貌衰老" } - -["门前冷落鞍马稀, 老大嫁作商人妇."] -note = [] -content = "门前/冷落/鞍马/稀/, 老大/嫁作/商人/妇./" -translation = "门前车马减少, 光顾者寥寥, 年岁大了我只得嫁给商人为妻" -keyword_note = { "老大" = "年纪大了" } - -["商人重利轻别离, 前月浮梁买茶去."] -note = [] -content = "商人/重利/轻/别离/, 前月/浮梁/买茶/去./" -translation = "商人重利不重情常常轻易别离, 上个月他到浮梁买茶办货去了" -keyword_note = { "浮梁" = "古县名, 在今江西省景德镇市, 盛产茶叶" } - -["去来江口守空船, 绕船月明江水寒."] -note = [] -content = "去来/江口/守/空船/, 绕船/月明/江水/寒./" -translation = "他去了留下我在江口孤守空船, 只有秋月与我作伴, 绕船的秋水凄寒" -keyword_note = { "去来" = "走了以后" } - -["夜深忽梦少年事, 梦啼妆泪红阑干."] -note = [] -content = "夜深/忽梦/少年/事/, 梦啼/妆泪/红/阑干./" -translation = "深夜常常梦到少年时作乐狂欢, 梦中哭醒涕泪纵横污损了粉颜" -keyword_note = { "梦啼妆泪" = "梦中啼哭, 匀过脂粉的脸上带着泪痕", "阑干" = "纵横散乱的样子" } - -["我闻琵琶已叹息, 又闻此语重唧唧."] -note = [] -content = "我闻/琵琶/已/叹息/, 又闻/此语/重/唧唧./" -translation = "我听了琵琶声早已摇头叹息, 又听到她这番诉说更加歔欷" -keyword_note = { "唧唧" = "叹息声" } - -["同是天涯沦落人, 相逢何必曾相识!"] -note = [] -content = "同是/天涯/沦落/人/, 相逢/何必/曾/相识!/" -translation = "同样都是天涯沦落的可怜人, 今日相逢何必问曾经是否相识" -keyword_note = { "天涯" = "指远离家乡的地方", "沦落" = "流落, 漂泊" } - -["我从去年辞帝京, 谪居卧病浔阳城."] -note = [] -content = "我从/去年/辞/帝京/, 谪居/卧病/浔阳/城./" -translation = "自从去年我离开繁华长安京城, 被贬居住在浔阳江畔便一直因病卧床" -keyword_note = { "帝京" = "指长安", "谪居" = "被贬官后居住" } - -["浔阳地僻无音乐, 终岁不闻丝竹声."] -note = [] -content = "浔阳/地僻/无/音乐/, 终岁/不闻/丝竹/声./" -translation = "浔阳这地方荒凉偏僻没有音乐, 一年到头也听不见管弦奏鸣" -keyword_note = { "丝竹" = "指音乐" } - -["住近湓江地低湿, 黄芦苦竹绕宅生."] -note = [] -content = "住近/湓江/地/低湿/, 黄芦/苦竹/绕宅/生./" -translation = "居住在湓江附近, 低洼潮湿, 院子周围, 尽长些黄芦苦竹" -keyword_note = { "湓江" = "河流名", "黄芦" = "芦苇", "苦竹" = "竹的一种" } - -["其间旦暮闻何物? 杜鹃啼血猿哀鸣."] -note = [] -content = "其间/旦暮/闻/何物/? 杜鹃/啼血/猿/哀鸣./" -translation = "在这里早晚能听到的是什么呢? 尽是杜鹃猿猴那些悲凄的哀鸣" -keyword_note = { "杜鹃啼血" = "杜鹃鸟啼声悲切" } - -["春江花朝秋月夜, 往往取酒还独倾."] -note = [] -content = "春江/花朝/秋月/夜/, 往往/取酒/还/独倾./" -translation = "在春天江边花儿开放的早上, 或在秋天明月高悬的夜晚, 我常常取酒独酌独饮" -keyword_note = { "花朝" = "花开的早晨", "独倾" = "独自饮酒" } - -["岂无山歌与村笛, 呕哑嘲哳难为听."] -note = [] -content = "岂无/山歌/与/村笛/, 呕哑/嘲哳/难为/听./" -translation = "难道这里就没有山歌和村笛吗? 只是那音调嘶哑粗涩实在难听" -keyword_note = { "呕哑嘲哳" = "形容声音噪杂" } - -["今夜闻君琵琶语, 如听仙乐耳暂明."] -note = [] -content = "今夜/闻君/琵琶/语/, 如听/仙乐/耳/暂明./" -translation = "今晚我听你弹奏琵琶诉说衷情, 就像听到了天上的仙乐, 让我的耳朵暂时得到了清明" -keyword_note = { "琵琶语" = "琵琶声, 琵琶所弹奏的乐曲", "暂" = "突然" } - -["莫辞更坐弹一曲, 为君翻作《琵琶行》."] -note = [] -content = "莫辞/更坐/弹/一曲/, 为君/翻作/《琵琶行》./" -translation = "请你不要推辞坐下来再弹一曲; 我要为你创作一首新诗《琵琶行》" -keyword_note = { "翻作" = "创作" } - -["感我此言良久立, 却坐促弦弦转急."] -note = [] -content = "感我/此言/良久/立/, 却坐/促弦/弦/转急./" -translation = "被我的话所感动她站立了好久; 回身坐下再转紧琴弦拨出急声" -keyword_note = { "却坐" = "退回原处坐下", "促弦" = "把弦拧紧" } - -["凄凄不似向前声, 满座重闻皆掩泣."] -note = [] -content = "凄凄/不似/向前/声/, 满座/重闻/皆/掩泣./" -translation = "凄凄切切不似刚才奏过的单调, 在座的人重听都掩面哭泣不停" -keyword_note = { "向前声" = "刚才奏过的单调", "掩泣" = "掩面哭泣" } - -["座中泣下谁最多? 江州司马青衫湿."] -note = [] -content = "座中/泣下/谁/最多/? 江州/司马/青衫/湿./" -translation = "要问在座之中谁流的眼泪最多? 江州司马的青衫已被泪水浸湿" -keyword_note = { "青衫" = "唐朝八品、九品文官的服色" } - -["登岳阳楼"] -note = [] -content = "登岳阳楼/" -translation = "登岳阳楼" -keyword_note = {} - -["昔闻洞庭水, 今上岳阳楼."] -note = [] -content = "昔闻/洞庭水/, 今上/岳阳楼./" -translation = "以前就听说洞庭湖波澜壮阔, 今日终于如愿登上岳阳楼" -keyword_note = { "洞庭水" = "即洞庭湖, 在今湖南北部, 长江南岸, 是中国第二淡水湖" } - -["吴楚东南坼, 乾坤日夜浮."] -note = [] -content = "吴楚/东南/坼/, 乾坤/日夜/浮./" -translation = "浩瀚的湖水把吴楚两地分隔开来, 整个天地仿似在湖中日夜浮动" -keyword_note = { "坼" = "分裂", "乾坤" = "天地, 或指日月", "浮" = "日月星辰和大地昼夜都飘浮在洞庭湖上" } - -["亲朋无一字, 老病有孤舟."] -note = [] -content = "亲朋/无/一字/, 老病/有/孤舟./" -translation = "亲朋好友音信全无, 年老多病唯有孤舟一叶飘零无定" -keyword_note = { "一字" = "音讯全无, 这里指书信", "老病" = "杜甫时年五十七岁, 身患肺病, 风痹, 右耳已聋", "孤舟" = "唯有孤舟一叶飘零无定" } - -["戎马关山北, 凭轩涕泗流."] -note = [] -content = "戎马/关山/北/, 凭轩/涕泗/流./" -translation = "北方边境的战争仍未止息, 凭栏遥望, 胸怀家国泪水横流" -keyword_note = { "戎马" = "指战争", "关山北" = "北方边境", "凭轩" = "凭栏", "涕泗流" = "眼泪禁不住地流淌" } - -["登快阁"] -note = [] -content = "登快阁/" -translation = "登快阁" -keyword_note = {} - -["痴儿了却公家事, 快阁东西倚晚晴."] -note = [] -content = "痴儿/了却/公家事/, 快阁/东西/倚/晚晴./" -translation = "我办完了公事, 登上快阁, 在这晚晴的余辉里倚栏远眺" -keyword_note = { "痴儿" = "作者自指", "了却" = "完成", "东西" = "东边和西边, 指在阁中四处周览", "倚" = "倚靠" } - -["落木千山天远大, 澄江一道月分明."] -note = [] -content = "落木/千山/天/远大/, 澄江/一道/月/分明./" -translation = "远望秋山无数, 落叶飘零, 天地更加辽远阔大. 朗朗明月下澄江淙淙流过, 月光下显得更加空明澄澈" -keyword_note = { "落木" = "落叶", "澄江" = "指赣江, 澄澈清澈" } - -["朱弦已为佳人绝, 青眼聊因美酒横."] -note = [] -content = "朱弦/已为/佳人/绝/, 青眼/聊因/美酒/横./" -translation = "友人远离, 早已没有弄弦吹箫的兴致了, 只有见到美酒, 眼中才流露出喜色" -keyword_note = { "朱弦" = "这里指琴", "佳人" = "美人, 引申为知己、知音", "青眼" = "黑色的眼珠在眼眶中间, 表示对人的喜爱或重视", "聊" = "姑且" } - -["万里归船弄长笛, 此心吾与白鸥盟."] -note = [] -content = "万里/归船/弄/长笛/, 此心/吾与/白鸥/盟./" -translation = "我从万里之外的远地乘船归来, 在船上吹起长笛; 我的这颗心, 将愿与白鸥结为朋友" -keyword_note = { "弄" = "演奏", "与白鸥盟" = "指无利禄之心, 借指归隐" } - -["登泰山记"] -note = [] -content = "登泰山记/" -translation = "登泰山记" -keyword_note = {} - -["泰山之阳, 汶水西流; 其阴, 济水东流."] -note = [] -content = "泰山/之阳/, 汶水/西流; /其阴/, 济水/东流./" -translation = "泰山的南面, 汶水向西流; 它的北面, 济水向东流" -keyword_note = { "阳" = "山的南面", "汶水" = "也叫汶河, 发源于山东莱芜东北原山", "西流" = "向西流 (西: 名词作状语) ", "阴" = "山的北面", "济水" = "发源于河南省济源市王屋山" } - -["阳谷皆入汶, 阴谷皆入济."] -note = [] -content = "阳谷/皆入/汶/, 阴谷/皆入/济./" -translation = "南面山谷的水都流入汶水, 北面山谷的水都流入济水" -keyword_note = { "阳谷" = "指山南面谷中的水", "阴谷" = "指山北面谷中的水" } - -["当其南北分者, 古长城也."] -note = [] -content = "当其/南北/分者/, 古长城/也./" -translation = "在那南北山谷分界的地方, 是古长城" -keyword_note = { "当其南北分者" = "在那 (阳谷和阴谷) 南北分界处的", "古长城" = "指春秋时期齐国所筑长城的遗址" } - -["最高日观峰, 在长城南十五里."] -note = [] -content = "最高/日观峰/, 在/长城/南/十五里./" -translation = "最高处的日观峰, 在古长城南面十五里" -keyword_note = { "日观峰" = "在山顶东岩, 是泰山观日出的地方" } - -["余以乾隆三十九年十二月, 自京师乘风雪, 历齐河、长清, 穿泰山西北谷, 越长城之限, 至于泰安."] -note = [] -content = "余/以/乾隆/三十九年/十二月/, 自/京师/乘/风雪/, 历/齐河/、长清/, 穿/泰山/西北/谷/, 越/长城/之限/, 至于/泰安./" -translation = "我在乾隆三十九年十二月, 从京城冒着风雪启程, 经过齐河、长清两县, 穿过泰山西北面的山谷, 越过长城的城墙, 到了泰安" -keyword_note = { "以" = "在", "乾隆三十九年" = "即1774年", "乘" = "趁, 这里有'冒着'的意思", "限" = "门槛, 这里指像一道门槛的城墙", "至于" = "到, 到达 (古今异义) " } - -["是月丁未, 与知府朱孝纯子颍由南麓登."] -note = [] -content = "是月/丁未/, 与/知府/朱孝纯/子颍/由/南麓/登./" -translation = "这月丁未日, 我同知府朱孝纯从南面的山脚上山" -keyword_note = { "丁未" = "丁未日 (十二月二十八日) ", "朱孝纯子颍" = "朱孝纯, 字子颖. 当时是泰安府的知府" } - -["四十五里, 道皆砌石为磴, 其级七千有余."] -note = [] -content = "四十五里/, 道/皆/砌石/为磴/, 其级/七千/有余./" -translation = "四十五里长的路上, 都是石头砌的台阶, 有七千多级" -keyword_note = { "磴" = "石阶", "级" = "石级", "有" = "通'又', 用来连接整数和零数" } - -["泰山正南面有三谷."] -note = [] -content = "泰山/正南面/有/三谷./" -translation = "泰山正南面有三个山谷" -keyword_note = {} - -["中谷绕泰安城下, 郦道元所谓环水也."] -note = [] -content = "中谷/绕/泰安/城下/, 郦道元/所谓/环水/也./" -translation = "中谷的水环绕泰安城, 这就是郦道元书中所说的环水" -keyword_note = { "环水" = "即中溪, 俗称梳洗河, 流出泰山" } - -["余始循以入, 道少半, 越中岭, 复循西谷, 遂至其巅."] -note = [] -content = "余/始/循/以入/, 道/少半/, 越/中岭/, 复/循/西谷/, 遂/至/其巅./" -translation = "我起初沿着中间的山谷进山, 走了一小半段, 越过中岭, 又沿着西面的山谷走, 就到了山顶" -keyword_note = { "循以入" = "顺着 (中谷) 进去", "道少半" = "路不到一半", "中岭" = "即黄岘岭, 又名中溪山", "复" = "再, 又 (古今异义) " } - -["古时登山, 循东谷入, 道有天门."] -note = [] -content = "古时/登山/, 循/东谷/入/, 道/有/天门./" -translation = "古时候登泰山, 是沿着东面的山谷进去, 路上有个天门" -keyword_note = { "天门" = "泰山峰名" } - -["东谷者, 古谓之天门溪水, 余所不至也."] -note = [] -content = "东谷者/, 古/谓之/天门/溪水/, 余/所/不至/也./" -translation = "这东边的山谷, 古时候称它为'天门溪水', 我没有到过那里" -keyword_note = {} - -["今所经中岭及山巅, 崖限当道者, 世皆谓之天门云."] -note = [] -content = "今/所经/中岭/及/山巅/, 崖限/当道者/, 世/皆谓/之/天门/云./" -translation = "现在 (我) 经过的中岭和山顶, 有山崖像门槛一样横在路上的, 人们都叫它天门" -keyword_note = { "崖限当道者" = "挡在路上的像门槛一样的山崖 (限: 名词作状语) ", "云" = "语气助词" } - -["道中迷雾冰滑, 磴几不可登."] -note = [] -content = "道中/迷雾/冰滑/, 磴/几/不可/登./" -translation = "一路上大雾弥漫、冰冻溜滑, 石阶几乎无法攀登" -keyword_note = { "几" = "几乎" } - -["及既上, 苍山负雪, 明烛天南."] -note = [] -content = "及/既上/, 苍山/负雪/, 明烛/天南./" -translation = "等到已经登上山顶, 只见青山上覆盖着白雪, (雪) 光照亮了南面的天空" -keyword_note = { "负" = "背", "烛" = "动词, 照" } - -["望晚日照城郭, 汶水、徂徕如画, 而半山居雾若带然."] -note = [] -content = "望/晚日/照/城郭/, 汶水/、徂徕/如画/, 而/半山/居雾/若带/然./" -translation = "远望夕阳映照着泰安城, 汶水、徂徕山就像是一幅美丽的山水画, 停留在半山腰处的云雾, 又像是一条舞动的飘带似的" -keyword_note = { "徂徕" = "山名, 在泰安东南", "居" = "停留" } - -["戊申晦, 五鼓, 与子颍坐日观亭, 待日出."] -note = [] -content = "戊申/晦/, 五鼓/, 与/子颍/坐/日观亭/, 待/日出./" -translation = "戊申这一天是月底, 五更的时候, 我和子颍坐在日观亭里, 等待日出" -keyword_note = { "戊申晦" = "戊申这一天是月底. 晦: 农历每月最后一天 (古今异义) ", "五鼓" = "五更", "日观亭" = "亭名, 在日观峰上" } - -["大风扬积雪击面."] -note = [] -content = "大风/扬/积雪/击面./" -translation = "这时大风扬起的积雪扑面打来" -keyword_note = {} - -["亭东自足下皆云漫."] -note = [] -content = "亭东/自/足下/皆/云漫./" -translation = "日观亭东面从脚底往下一片云雾弥漫" -keyword_note = { "漫" = "弥漫" } - -["稍见云中白若樗蒱数十立者, 山也."] -note = [] -content = "稍见/云中/白若/樗蒱/数十/立者/, 山/也./" -translation = "依稀可见云中几十个白色的像骰子似的东西, 那是山峰" -keyword_note = { "樗蒲" = "古代的一种赌博游戏, 这里指博戏用的'五木'. 五木两头尖, 中间广平, 立起来很像山峰" } - -["极天云一线异色, 须臾成五采."] -note = [] -content = "极天/云/一线/异色/, 须臾/成/五采./" -translation = "天边的云彩形成一条线 (呈现出) 奇异的颜色, 一会儿又变成五颜六色的" -keyword_note = { "极天" = "天边", "采" = "通'彩'" } - -["日上, 正赤如丹, 下有红光动摇承之."] -note = [] -content = "日上/, 正赤/如丹/, 下/有/红光/动摇/承之./" -translation = "太阳升上来了, 红的像朱砂一样, 下面有红光晃动摇荡着托着它" -keyword_note = { "丹" = "朱砂" } - -["或曰, 此东海也."] -note = [] -content = "或曰/, 此/东海/也./" -translation = "有人说, 这是东海" -keyword_note = { "东海" = "泛指东面的海. 这里是想象, 实际上在泰山顶上看不见东海" } - -["回视日观以西峰, 或得日或否, 绛皓驳色, 而皆若偻."] -note = [] -content = "回视/日观/以西/峰/, 或/得日/或否/, 绛皓/驳色/, 而/皆/若偻./" -translation = "回头看日观峰以西的山峰, 有的被日光照到, 有的没照到, 或红或白, 颜色错杂, 都像弯腰曲背鞠躬致敬的样子" -keyword_note = { "或得日或否" = "有的被日光照着, 有的没有照着", "绛皓驳色" = "或红或白, 颜色错杂. 绛, 大红. 皓: 白色. 驳: 杂", "若偻" = "像脊背弯曲的样子. 引申为鞠躬、致敬的样子" } - -["亭西有岱祠, 又有碧霞元君祠."] -note = [] -content = "亭西/有/岱祠/, 又/有/碧霞/元君/祠./" -translation = "日观亭西面有岱祠, 还有碧霞元君祠" -keyword_note = { "岱祠" = "东岳大帝庙", "碧霞元君" = "传说是东岳大帝的女儿" } - -["皇帝行宫在碧霞元君祠东."] -note = [] -content = "皇帝/行宫/在/碧霞/元君/祠/东./" -translation = "皇帝的行宫在碧霞元君祠的东面" -keyword_note = { "行宫" = "皇帝出外巡行时居住的住所" } - -["是日观道中石刻, 自唐显庆以来, 其远古刻尽漫失."] -note = [] -content = "是日/观/道中/石刻/, 自/唐/显庆/以来/, 其/远古/刻/尽/漫失./" -translation = "这一天, (还) 观看了路上的石刻, 都是从唐朝显庆年间以来的, 那些更古老的石碑都已经模糊或缺失了" -keyword_note = { "显庆" = "唐高宗的年号", "漫失" = "模糊或缺失. 漫: 磨灭" } - -["僻不当道者, 皆不及往."] -note = [] -content = "僻/不当/道者/, 皆/不及/往./" -translation = "那些偏僻不对着道路的石刻, 都赶不上去看了" -keyword_note = { "僻不当道者" = "偏僻, 不在道路附近的", "不及" = "赶不上" } - -["山多石, 少土."] -note = [] -content = "山/多石/, 少土./" -translation = "山上石头多, 泥土少" -keyword_note = {} - -["石苍黑色, 多平方, 少圜."] -note = [] -content = "石/苍黑色/, 多/平方/, 少/圜./" -translation = "山石都呈青黑色, 大多是平的、方形的, 很少有圆形的" -keyword_note = { "平方" = "方方整整的, 指山石 (古今异义) ", "圜" = "通'圆'" } - -["少杂树, 多松, 生石罅, 皆平顶."] -note = [] -content = "少/杂树/, 多/松/, 生/石罅/, 皆/平顶./" -translation = "杂树很少, 多是松树, 松树都生长在石头的缝隙里, 树顶是平的" -keyword_note = { "石罅" = "石缝" } - -["冰雪, 无瀑水, 无鸟兽音迹."] -note = [] -content = "冰雪/, 无/瀑水/, 无/鸟兽/音迹./" -translation = "冰天雪地, 没有瀑布, 没有飞鸟走兽的声音和踪迹" -keyword_note = { "瀑水" = "瀑布" } - -["至日观数里内无树, 而雪与人膝齐."] -note = [] -content = "至/日观/数里/内/无树/, 而/雪/与/人膝/齐./" -translation = "日观峰附近几里以内没有树木, 积雪厚得同人的膝盖一样平齐" -keyword_note = {} - -["桐城姚鼐记."] -note = [] -content = "桐城/姚鼐/记./" -translation = "桐城姚鼐记述" -keyword_note = { "姚鼐" = "字姬传, 一字梦谷, 室名惜抱轩, 清代桐城人. 桐城派古文家" } - -["登高"] -note = [] -content = "登高/" -translation = "登高" -keyword_note = {} - -["风急天高猿啸哀, 渚清沙白鸟飞回."] -note = ['诗题一作《九日登高》. 古代农历九月九日有登高习俗. 选自《杜诗详注》. 作于唐代宗大历二年 (767) 秋天的重阳节./'] -content = "风急/天高/猿啸哀/, 渚清/沙白/鸟飞回./" -translation = "风急天高猿猴啼叫显得十分悲哀, 水清沙白的河洲上有鸟儿在急风中飞舞盘旋. " -keyword_note = { "猿啸哀" = "猿凄厉的叫声. 《水经注·江水》引民谣云: '巴东三峡巫峡长, 猿鸣三声泪沾裳. '", "渚" = "水中的小洲; 水中的小块陆地", "鸟飞回" = "鸟在急风中飞舞盘旋. 回: 回旋" } - -["无边落木萧萧下, 不尽长江滚滚来."] -note = [] -content = "无边/落木/萧萧下/, 不尽/长江/滚滚来./" -translation = "无边无际的树木萧萧地飘下落叶, 望不到头的长江水滚滚奔腾而来. " -keyword_note = { "落木" = "指秋天飘落的树叶", "萧萧" = "模拟草木飘落的声音" } - -["万里悲秋常作客, 百年多病独登台."] -note = [] -content = "万里/悲秋/常作客/, 百年/多病/独登台./" -translation = "悲对秋景感慨远离故乡长期漂泊, 晚年疾病缠身今日独上高台. " -keyword_note = { "万里" = "指远离故乡", "常作客" = "长期漂泊他乡", "百年" = "犹言一生, 这里借指晚年" } - -["艰难苦恨繁霜鬓, 潦倒新停浊酒杯."] -note = [] -content = "艰难/苦恨/繁霜鬓/, 潦倒/新停/浊酒杯./" -translation = "艰难至极, 愁苦繁多, 苍白鬓发如霜雪; 生活潦倒失意, 刚停下手里装着浊酒的酒杯. " -keyword_note = { "艰难" = "兼指国运和自身命运", "苦恨" = "极恨, 极其遗憾. 苦, 极", "繁霜鬓" = "像浓霜一样的鬓发", "潦倒" = "衰颓, 失意. 这里指衰老多病, 志不得伸", "新停" = "刚刚停止. 重阳登高, 按惯例应当喝酒. 可杜甫晚年因肺病戒酒, 所以说'新停'" } - -["短歌行"] -note = [] -content = "短歌行/" -translation = "短歌行" -keyword_note = {} - -["对酒当歌, 人生几何!"] -note = ['开篇抒发人生短暂的感慨'] -content = "对酒/当歌/, 人生/几何!/" -translation = "一边喝着酒, 一边唱着歌, 人生的岁月有多少. " -keyword_note = { "对酒" = "面对着酒", "当歌" = "应当唱歌", "几何" = "多少 (指岁月) " } - -["譬如朝露, 去日苦多."] -note = [] -content = "譬如/朝露/, 去日/苦多./" -translation = "好比晨露转瞬即逝, 已经逝去的时光实在太多! " -keyword_note = { "譬如" = "比如, 好比", "朝露" = "早晨的露水", "去日" = "逝去的日子", "苦多" = "实在太多" } - -["慨当以慷, 忧思难忘."] -note = [] -content = "慨当/以慷/, 忧思/难忘./" -translation = "宴会上的歌声激昂慷慨, 心中的忧愁却难以遗忘. " -keyword_note = { "慨当以慷" = "慷慨激昂", "忧思" = "忧愁思绪", "难忘" = "难以忘怀" } - -["何以解忧? 唯有杜康."] -note = ['杜康代指酒, 用具体代抽象'] -content = "何以/解忧/? 唯有/杜康./" -translation = "靠什么来排解忧闷? 唯有豪饮美酒. " -keyword_note = { "何以" = "用什么", "解忧" = "解除忧愁", "杜康" = "传说中造酒的人, 代指酒" } - -["青青子衿, 悠悠我心."] -note = ['化用《诗经》诗句, 表达对贤才的思慕'] -content = "青青/子衿/, 悠悠/我心./" -translation = "有学识的才子们啊, 你们令我朝夕思慕. " -keyword_note = { "子衿" = "读书人的衣领", "青青" = "青色的", "悠悠" = "长久的思念" } - -["但为君故, 沉吟至今."] -note = [] -content = "但为/君故/, 沉吟/至今./" -translation = "只是因为你们的缘故, 让我沉痛吟诵至今. " -keyword_note = { "但为" = "只因为", "君" = "您, 指贤才", "沉吟" = "深沉地吟诵" } - -["呦呦鹿鸣, 食野之苹."] -note = ['再次化用《诗经》, 表达礼遇贤才的诚意'] -content = "呦呦/鹿鸣/, 食野/之苹./" -translation = "阳光下鹿群呦呦欢鸣, 在原野吃着艾蒿. " -keyword_note = { "呦呦" = "鹿鸣声", "食野" = "在野外吃草", "苹" = "艾蒿" } - -["我有嘉宾, 鼓瑟吹笙."] -note = [] -content = "我有/嘉宾/, 鼓瑟/吹笙./" -translation = "一旦四方贤才光临舍下, 我将奏瑟吹笙宴请嘉宾. " -keyword_note = { "嘉宾" = "尊贵的客人", "鼓瑟" = "弹奏瑟", "吹笙" = "吹奏笙" } - -["明明如月, 何时可掇?"] -note = ['以明月喻贤才, 表达求贤若渴的心情'] -content = "明明/如月/, 何时/可掇?/" -translation = "高悬夜空的明月哟, 什么时候可以摘取呢? " -keyword_note = { "明明" = "明亮", "如月" = "像月亮", "可掇" = "可以摘取" } - -["忧从中来, 不可断绝."] -note = [] -content = "忧从/中来/, 不可/断绝./" -translation = "心中深深的忧思, 喷涌而出不能停止. " -keyword_note = { "忧" = "忧愁", "中" = "心中", "断绝" = "停止" } - -["越陌度阡, 枉用相存."] -note = [] -content = "越陌/度阡/, 枉用/相存./" -translation = "远方宾客穿越纵横交错的小路, 屈驾前来探望我. " -keyword_note = { "越陌度阡" = "穿过纵横小路", "枉用" = "屈驾", "相存" = "探望我" } - -["契阔谈讌, 心念旧恩."] -note = [] -content = "契阔/谈讌/, 心念/旧恩./" -translation = "久别重逢谈心宴饮, 重温那往日的恩情. " -keyword_note = { "契阔" = "久别", "谈讌" = "谈心宴饮", "旧恩" = "往日的情谊" } - -["月明星稀, 乌鹊南飞."] -note = ['以乌鹊南飞喻贤才寻找明主'] -content = "月明/星稀/, 乌鹊/南飞./" -translation = "月光明亮星光稀疏, 一群寻巢的喜鹊向南飞去. " -keyword_note = { "月明" = "月光明亮", "星稀" = "星星稀少", "乌鹊" = "乌鸦喜鹊" } - -["绕树三匝, 何枝可依?"] -note = [] -content = "绕树/三匝/, 何枝/可依?/" -translation = "环绕着树反复盘旋, 哪里才有它们栖身之处? " -keyword_note = { "绕树" = "绕着树飞", "三匝" = "三圈", "何枝" = "哪个树枝", "可依" = "可以依靠" } - -["山不厌高, 海不厌深."] -note = ['以山海为喻, 表达广纳贤才的胸怀'] -content = "山不/厌高/, 海不/厌深./" -translation = "高山不辞土石才见巍峨, 大海不弃涓流才见壮阔. " -keyword_note = { "厌" = "满足", "山不厌高" = "山不嫌高", "海不厌深" = "海不嫌深" } - -["周公吐哺, 天下归心."] -note = ['用周公典故, 表明自己礼贤下士的决心'] -content = "周公/吐哺/, 天下/归心./" -translation = "我愿如周公一般礼贤下士, 愿天下的英杰都真心归顺于我. " -keyword_note = { "周公" = "周文王之子", "吐哺" = "吐出食物 (接待贤士) ", "归心" = "真心归顺" } - -["石钟山记"] -note = [] -content = "石钟山记/" -translation = "石钟山记" -keyword_note = {} - -['《水经》云:"彭蠡之口有石钟山焉"'] -note = [] -content = '《水经》/云:/"彭蠡/之口/有/石钟山/焉/"/' -translation = "《水经》中说: '鄱阳湖的湖口有一座石钟山在那里. '" -keyword_note = { "彭蠡" = "鄱阳湖的又一名称", "焉" = "兼词, 相当于'于此', 在那里" } - -["郦元以为下临深潭, 微风鼓浪, 水石相搏, 声如洪钟"] -note = [] -content = "郦元/以为/下临/深潭/, 微风/鼓浪/, 水石/相搏/, 声如/洪钟/" -translation = "郦道元认为石钟山下面靠近深潭, 微风振动波浪, 水和石头互相拍打, 发出的声音好像大钟一般. " -keyword_note = { "郦元" = "即郦道元, 《水经注》的作者", "鼓" = "振动", "搏" = "击, 拍", "洪钟" = "大钟" } - -["是说也, 人常疑之"] -note = [] -content = "是/说/也/, 人/常/疑之/" -translation = "这个说法, 人们常常怀疑它. " -keyword_note = { "是说" = "这个说法", "疑之" = "怀疑它" } - -["今以钟磬置水中, 虽大风浪不能鸣也, 而况石乎"] -note = [] -content = "今/以/钟磬/置/水中/, 虽/大风浪/不能/鸣/也/, 而况/石乎/" -translation = "现在如果把钟磬放在水中, 即使大风大浪也不能使它发出声响, 何况是石头呢! " -keyword_note = { "磬" = "古代打击乐器, 形状像曲尺, 用玉或石制成", "鸣" = "使...鸣响 (使动用法) " } - -["至唐李渤始访其遗踪, 得双石于潭上"] -note = [] -content = "至/唐/李渤/始/访/其/遗踪/, 得/双石/于/潭上/" -translation = "到了唐代李渤才访求石钟山的旧址. 在深潭边找到两块山石. " -keyword_note = { "李渤" = "唐朝洛阳人, 写过一篇《辨石钟山记》", "遗踪" = "旧址, 陈迹. 这里指所在地" } - -["扣而聆之, 南声函胡, 北音清越, 桴止响腾, 余韵徐歇"] -note = [] -content = "扣/而/聆之/, 南声/函胡/, 北音/清越/, 桴止/响腾/, 余韵/徐歇/" -translation = "敲击它们, 聆听它们的声音, 南边那座山石的声音重浊而模糊, 北边那座山石的声音清脆而响亮, 鼓槌停止了敲击, 声音还在传播, 余音慢慢地消失. " -keyword_note = { "函胡" = "通'含糊', 重浊而模糊", "清越" = "清脆而响亮", "桴" = "鼓槌", "响腾" = "声音传播", "余韵" = "余音", "徐歇" = "慢慢消失" } - -["自以为得之矣"] -note = [] -content = "自以为/得之/矣/" -translation = "他自己认为找到了这个石钟山命名的原因. " -keyword_note = { "得之" = "找到了这个 (原因) " } - -["然是说也, 余尤疑之"] -note = [] -content = "然/是/说/也/, 余/尤/疑之/" -translation = "但是这个说法, 我更加怀疑. " -keyword_note = { "尤" = "更加" } - -["石之铿然有声者, 所在皆是也"] -note = [] -content = "石之/铿然/有声/者/, 所在/皆是/也/" -translation = "敲击后能发出声响的石头, 到处都是这样. " -keyword_note = { "铿然" = "敲击金石所发出的响亮的声音", "所在皆是" = "到处都 (是) 这样" } - -["而此独以钟名, 何哉"] -note = [] -content = "而/此/独/以/钟/名/, 何哉/" -translation = "可唯独这座山用钟来命名, 这是为什么呢? " -keyword_note = { "名" = "命名, 取名 (名词作动词) " } - -["元丰七年六月丁丑, 余自齐安舟行适临汝"] -note = [] -content = "元丰/七年/六月/丁丑/, 余/自/齐安/舟行/适/临汝/" -translation = "元丰七年六月丁丑日, 我从齐安坐船到临汝去. " -keyword_note = { "元丰" = "宋神宗的年号", "六月丁丑" = "农历六月初九", "齐安" = "在今湖北黄州", "舟行" = "乘船行走 (名词作状语) ", "适" = "往" } - -["而长子迈将赴饶之德兴尉, 送之至湖口"] -note = [] -content = "而/长子/迈/将/赴/饶之/德兴/尉/, 送之/至/湖口/" -translation = "大儿子苏迈将要去就任饶州德兴县的县尉, 我送他到湖口. " -keyword_note = { "赴" = "赴任、就职", "湖口" = "今江西湖口" } - -["因得观所谓石钟者"] -note = [] -content = "因/得/观/所谓/石钟者/" -translation = "因而能够观察这座称为'石钟'的山. " -keyword_note = { "因" = "因而", "得" = "能够" } - -["寺僧使小童持斧, 于乱石间择其一二扣之, 硿硿焉"] -note = [] -content = "寺僧/使/小童/持斧/, 于/乱石间/择其/一二/扣之/, 硿硿/焉/" -translation = "庙里的和尚叫小孩拿着斧头, 在乱石中间选一两处敲打它, 硿硿地发出的响声. " -keyword_note = { "硿硿焉" = "硿硿地 (发出响声) . 焉, 相当于'然'" } - -["余固笑而不信也"] -note = [] -content = "余/固/笑/而/不信/也/" -translation = "我本来就觉得可笑, 并不相信. " -keyword_note = { "固" = "本来" } - -["至暮夜月明, 独与迈乘小舟, 至绝壁下"] -note = [] -content = "至/暮夜/月明/, 独/与/迈/乘/小舟/, 至/绝壁/下/" -translation = "到了晚上, 月光明亮, 我独自和苏迈坐着小船来到绝壁下面. " -keyword_note = { "暮夜" = "晚上", "独" = "独自" } - -["大石侧立千尺, 如猛兽奇鬼, 森然欲搏人"] -note = [] -content = "大石/侧立/千尺/, 如/猛兽/奇鬼/, 森然/欲/搏人/" -translation = "巨大的山石在旁边耸立着, 高达千尺, 好像凶猛的野兽和奇异的鬼怪, 阴森森地要向人扑过来. " -keyword_note = { "侧立" = "在旁边耸立 (名词作状语) ", "森然" = "阴森森的样子", "搏人" = "扑向人" } - -["而山上栖鹘, 闻人声亦惊起, 磔磔云霄间"] -note = [] -content = "而/山上/栖鹘/, 闻/人声/亦/惊起/, 磔磔/云霄间/" -translation = "山上宿巢的老鹰听到人声, 也受惊飞起来, 在云霄中磔磔地鸣叫. " -keyword_note = { "栖鹘" = "宿巢的老鹰. 鹘, 鹰的一种", "磔磔" = "鸟鸣声" } - -["又有若老人咳且笑于山谷中者, 或曰此鹳鹤也"] -note = [] -content = "又有/若/老人/咳/且/笑/于/山谷中/者/, 或曰/此/鹳鹤/也/" -translation = "又有像老人在山谷中边咳边笑的声音, 有人说这是鹳鹤. " -keyword_note = { "鹳鹤" = "水鸟名, 似鹤而顶不红, 颈和嘴都比鹤长" } - -["余方心动欲还, 而大声发于水上"] -note = [] -content = "余/方/心动/欲还/, 而/大声/发/于/水上/" -translation = "我正心惊想要回去, 忽然巨大的声音从水上发出. " -keyword_note = { "方" = "正", "心动" = "内心惊恐", "欲还" = "想要回去" } - -["噌吰如钟鼓不绝"] -note = [] -content = "噌吰/如/钟鼓/不绝/" -translation = "噌地响着像钟鼓的声音连续不断. " -keyword_note = { "噌吰" = "形容钟声洪亮" } - -["舟人大恐"] -note = [] -content = "舟人/大恐/" -translation = "船夫非常害怕. " -keyword_note = { "舟人" = "船夫" } - -["徐而察之, 则山下皆石穴罅"] -note = [] -content = "徐/而/察之/, 则/山下/皆/石穴/罅/" -translation = "我慢慢地观察, 原来山脚下都是石头的洞穴和裂缝. " -keyword_note = { "徐" = "慢慢地", "察" = "观察", "罅" = "裂缝" } - -["不知其浅深, 微波入焉, 涵澹澎湃而为此也"] -note = [] -content = "不知/其/浅深/, 微波/入焉/, 涵澹/澎湃/而/为此/也/" -translation = "不知它们的深浅, 微微的水波涌进洞穴和裂缝, 激荡撞击便产生这样的声音. " -keyword_note = { "浅深" = "深度 (形容词作名词) ", "涵澹澎湃" = "波浪激荡", "为此" = "形成这种声音" } - -["舟回至两山间, 将入港口, 有大石当中流"] -note = [] -content = "舟/回/至/两山间/, 将/入/港口/, 有/大石/当/中流/" -translation = "船绕到两山之间, 将要进入港口, 有块大石头挡在水流的中央. " -keyword_note = { "中流" = "水流的中心" } - -["可坐百人, 空中而多窍"] -note = [] -content = "可/坐/百人/, 空中/而/多窍/" -translation = "上面可坐百来个人, 中间是空的, 而且有许多窟窿. " -keyword_note = { "空中" = "中间是空的", "窍" = "窟窿" } - -["与风水相吞吐, 有窾坎镗鞳之声"] -note = [] -content = "与/风水/相/吞吐/, 有/窾坎/镗鞳/之/声/" -translation = "把风浪吞进去又吐出来, 发出窾坎镗鞳的声音. " -keyword_note = { "窾坎镗鞳" = "击物声和钟鼓声" } - -["与向之噌吰者相应, 如乐作焉"] -note = [] -content = "与/向之/噌吰者/相应/, 如/乐作/焉/" -translation = "同先前噌吰的声音相互应和, 好像音乐演奏. " -keyword_note = { "向" = "先前", "相应" = "相互应和", "乐作" = "音乐演奏" } - -['因笑谓迈曰:"汝识之乎"'] -note = [] -content = '因/笑/谓/迈/曰:/"汝/识之/乎/"/' -translation = "我于是笑着对苏迈说: '你知道吗? '" -keyword_note = { "因" = "于是", "识" = "知道" } - -["噌吰者, 周景王之无射也"] -note = [] -content = "噌吰/者/, 周景王/之/无射/也/" -translation = "那噌吰的响声, 是周景王无射钟的声音. " -keyword_note = { "无射" = "周景王所铸钟名" } - -["窾坎镗鞳者, 魏庄子之歌钟也"] -note = [] -content = "窾坎/镗鞳/者/, 魏庄子/之/歌钟/也/" -translation = "窾坎镗鞳的响声, 是魏庄子歌钟的声音. " -keyword_note = { "歌钟" = "古乐器" } - -["古之人不余欺也"] -note = [] -content = "古之/人/不余欺/也/" -translation = "古人没有欺骗我啊! " -keyword_note = { "不余欺" = "不欺余 (宾语前置) " } - -["事不目见耳闻, 而臆断其有无, 可乎"] -note = [] -content = "事/不/目见/耳闻/, 而/臆断/其/有无/, 可乎/" -translation = "凡事不亲眼看到亲耳听到, 却根据主观猜测去来判断它的有或没有, 可以吗? " -keyword_note = { "目见" = "用眼睛看 (名词作状语) ", "耳闻" = "用耳朵听 (名词作状语) ", "臆断" = "根据主观猜测来判断" } - -["郦元之所见闻殆与余同, 而言之不详"] -note = [] -content = "郦元/之/所见闻/殆/与/余/同/, 而/言/之/不详/" -translation = "郦道元见到和听到的, 大概和我一样, 但是说得不详细. " -keyword_note = { "殆" = "大概" } - -["士大夫终不肯以小舟夜泊绝壁之下"] -note = [] -content = "士大夫/终/不肯/以/小舟/夜泊/绝壁/之下/" -translation = "士大夫终究不愿夜晚乘着小船停靠在悬崖绝壁下面. " -keyword_note = { "终" = "终究", "夜泊" = "在夜晚停泊 (名词作状语) " } - -["故莫能知"] -note = [] -content = "故/莫/能知/" -translation = "所以不能知道真相. " -keyword_note = { "莫" = "没有人" } - -["而渔工水师虽知而不能言"] -note = [] -content = "而/渔工/水师/虽/知/而/不能/言/" -translation = "而渔人和船工, 虽然知道却又不能用文字表达、记载. " -keyword_note = { "渔工水师" = "渔人和船工", "言" = "用文字表述、记载" } - -["此世所以不传也"] -note = [] -content = "此/世/所以/不传/也/" -translation = "这就是世上没有流传下来 (石钟山得名由来) 的缘故. " -keyword_note = { "所以" = "...的缘故" } - -["而陋者乃以斧斤考击而求之"] -note = [] -content = "而/陋者/乃/以/斧斤/考击/而/求之/" -translation = "而浅陋的人用斧头敲打石头的办法来寻求 (石钟山得名的) 原因. " -keyword_note = { "陋者" = "浅陋的人", "斧斤" = "斧头", "考击" = "敲击" } - -["自以为得其实"] -note = [] -content = "自以为/得/其实/" -translation = "自以为得到了事情的真相. " -keyword_note = { "其实" = "那事情的真相" } - -["余是以记之"] -note = [] -content = "余/是以/记之/" -translation = "我因此记下以上的经过. " -keyword_note = { "是以" = "以是, 因此 (宾语前置) " } - -["盖叹郦元之简, 而笑李渤之陋也"] -note = [] -content = "盖/叹/郦元/之/简/, 而/笑/李渤/之/陋/也/" -translation = "是因为叹惜郦道元的解释过于简略, 也嘲笑李渤的解释太浅陋了. " -keyword_note = { "盖" = "表原因", "叹" = "叹惜", "简" = "简略", "笑" = "嘲笑", "陋" = "浅陋" } - -["离骚"] -note = [] -content = "离骚/" -translation = "离骚" -keyword_note = {} - -["帝高阳之苗裔兮, 朕皇考曰伯庸."] -note = ['高阳: 传说中的古代帝王颛顼', '朕: 我', '皇考: 对已故父亲的美称'] -content = "帝/高阳/之/苗裔/兮/, 朕/皇考/曰/伯庸./" -translation = "我是古帝高阳氏的子孙, 我已去世的父亲字伯庸" -keyword_note = { "高阳" = "颛顼帝", "苗裔" = "远代子孙", "朕" = "我", "皇考" = "对已故父亲的美称" } - -["摄提贞于孟陬兮, 惟庚寅吾以降."] -note = ["摄提: 即'摄提格', 寅年的别称", '孟陬: 孟春正月, 是寅月'] -content = "摄提/贞/于/孟陬/兮/, 惟/庚寅/吾/以/降./" -translation = "摄提那年正当孟陬啊, 就在庚寅那天我降生" -keyword_note = { "摄提" = "寅年的别称", "贞" = "当、正当", "孟陬" = "孟春正月", "降" = "降生" } - -["皇览揆余初度兮, 肇锡余以嘉名."] -note = ["皇: '皇考'的简称", '览揆: 观察衡量'] -content = "皇/览/揆/余/初度/兮/, 肇/锡/余/以/嘉名./" -translation = "父亲仔细揣度我的生辰, 于是赐予我贞祥的美名" -keyword_note = { "皇" = "皇考的简称", "览揆" = "观察衡量", "初度" = "出生时的情况", "肇" = "开始", "锡" = "赐给", "嘉名" = "美名" } - -["名余曰正则兮, 字余曰灵均."] -note = [] -content = "名/余/曰/正则/兮/, 字/余/曰/灵均./" -translation = "父亲把我的名取为正则, 同时把我的字叫作灵均" -keyword_note = { "正则" = "屈原的名", "灵均" = "屈原的字" } - -["纷吾既有此内美兮, 又重之以修能."] -note = ['修能: 美好的容态, 一说指优秀的才能'] -content = "纷/吾/既/有/此/内美/兮/, 又/重之/以/修能./" -translation = "天赋给我很多良好素质, 我不断加强自己的修养" -keyword_note = { "纷" = "盛多", "内美" = "内在的美好品质", "重" = "加", "修能" = "美好的容态" } - -["扈江离与辟芷兮, 纫秋兰以为佩."] -note = ['扈: 楚地方言, 披', '辟芷: 生于幽僻之处的白芷'] -content = "扈/江离/与/辟芷/兮/, 纫/秋兰/以为/佩./" -translation = "我把江离芷草披在肩上, 把秋兰结成索佩挂身旁" -keyword_note = { "扈" = "披", "江离" = "一种香草", "辟芷" = "幽僻处的白芷", "纫" = "连缀", "秋兰" = "秋天的兰花" } - -["汩余若将不及兮, 恐年岁之不吾与."] -note = ['汩: 水流很快的样子, 比喻时间过得飞快'] -content = "汩/余/若将/不及/兮/, 恐/年岁/之/不吾与./" -translation = "光阴似箭我好像跟不上, 岁月不等待人令我心慌" -keyword_note = { "汩" = "水流很快的样子", "不吾与" = "不等待我" } - -["朝搴阰之木兰兮, 夕揽洲之宿莽."] -note = ['搴: 拔取', '宿莽: 一种香草'] -content = "朝/搴/阰/之/木兰/兮/, 夕/揽/洲/之/宿莽./" -translation = "早晨我在大坡采集木兰, 傍晚在小洲中摘取宿莽" -keyword_note = { "朝搴" = "早晨采集", "夕揽" = "傍晚摘取", "木兰" = "一种香木", "宿莽" = "一种香草" } - -["日月忽其不淹兮, 春与秋其代序."] -note = [] -content = "日月/忽/其/不淹/兮/, 春/与/秋/其/代序./" -translation = "时光迅速逝去不能久留, 四季更相代谢变化有常" -keyword_note = { "忽" = "迅速", "淹" = "久留", "代序" = "时序更替" } - -["惟草木之零落兮, 恐美人之迟暮."] -note = ['美人: 代指有才德、有作为的人'] -content = "惟/草木/之/零落/兮/, 恐/美人/之/迟暮./" -translation = "我想到草木已由盛到衰, 恐怕自己身体逐渐衰老" -keyword_note = { "惟" = "想到", "零落" = "凋零", "美人" = "有才德的人", "迟暮" = "衰老" } - -["不抚壮而弃秽兮, 何不改此度?"] -note = [] -content = "不/抚壮/而/弃秽/兮/, 何/不/改/此/度?/" -translation = "何不利用盛时扬弃秽政, 为何还不改变这些法度" -keyword_note = { "抚壮" = "把握壮年", "弃秽" = "抛弃污秽", "度" = "法度" } - -["乘骐骥以驰骋兮, 来吾道夫先路!"] -note = [] -content = "乘/骐骥/以/驰骋/兮/, 来/吾/道/夫/先路!/" -translation = "乘上千里马纵横驰骋吧, 来呀, 我在前引导开路" -keyword_note = { "骐骥" = "千里马", "道" = "同'导', 引导", "先路" = "前驱" } - -["长太息以掩涕兮, 哀民生之多艰."] -note = ['太息: 叹息', '掩涕: 掩面而泣'] -content = "长/太息/以/掩涕/兮/, 哀/民生/之/多艰./" -translation = "长长地叹息而掩面拭泪, 哀叹人生道路多么艰难" -keyword_note = { "太息" = "叹息", "掩涕" = "掩面拭泪", "民生" = "人生", "多艰" = "多艰难" } - -["余虽好修姱以鞿羁兮, 謇朝谇而夕替."] -note = ['修姱: 美好', '鞿羁: 束缚、约束'] -content = "余/虽/好/修姱/以/鞿羁/兮/, 謇/朝谇/而/夕替./" -translation = "我虽爱好修洁严于责己, 早晨直言进谏晚上就被罢免" -keyword_note = { "修姱" = "美好", "鞿羁" = "束缚", "謇" = "助词无实义", "朝谇" = "早上进谏", "夕替" = "晚上被罢免" } - -["既替余以蕙纕兮, 又申之以揽茝."] -note = ['蕙纕: 用香蕙作的佩带'] -content = "既/替/余/以/蕙纕/兮/, 又/申之/以/揽茝./" -translation = "他们攻击我佩带蕙草啊, 又指责我爱好采集茝兰" -keyword_note = { "替" = "贬黜", "蕙纕" = "香蕙佩带", "申" = "加上", "揽茝" = "采摘白芷" } - -["亦余心之所善兮, 虽九死其犹未悔."] -note = [] -content = "亦/余心/之/所善/兮/, 虽/九死/其/犹未悔./" -translation = "我真心爱好修身洁行, 即使死多次也不会后悔" -keyword_note = { "所善" = "所爱好的", "九死" = "死多次", "未悔" = "不后悔" } - -["怨灵修之浩荡兮, 终不察夫民心."] -note = ['灵修: 指楚怀王', '浩荡: 荒唐'] -content = "怨/灵修/之/浩荡/兮/, 终/不察/夫/民心./" -translation = "怨就怨楚王这样糊涂啊, 他始终不体察别人心情" -keyword_note = { "灵修" = "楚怀王", "浩荡" = "荒唐", "民心" = "人心" } - -["众女嫉余之蛾眉兮, 谣诼谓余以善淫."] -note = ['众女: 喻指小人', '蛾眉: 喻指美好的品德'] -content = "众女/嫉/余/之/蛾眉/兮/, 谣诼/谓/余/以/善淫./" -translation = "那些小人妒忌我的丰姿, 造谣诬蔑说我妖艳好淫" -keyword_note = { "众女" = "小人", "蛾眉" = "美好品德", "谣诼" = "毁谤", "善淫" = "好做淫邪之事" } - -["固时俗之工巧兮, 偭规矩而改错."] -note = [] -content = "固/时俗/之/工巧/兮/, 偭/规矩/而/改错./" -translation = "庸人本来善于投机取巧, 背弃规矩而又改变政策" -keyword_note = { "时俗" = "世俗", "工巧" = "善于取巧", "偭" = "违背", "规矩" = "规则", "改错" = "改变措施" } - -["背绳墨以追曲兮, 竞周容以为度."] -note = ['绳墨: 木匠画直线用的工具, 喻指准绳'] -content = "背/绳墨/以/追曲/兮/, 竞/周容/以/为度./" -translation = "违背是非标准追求邪曲, 争着苟合取悦作为法则" -keyword_note = { "绳墨" = "准绳", "追曲" = "追随邪佞", "周容" = "迎合讨好", "度" = "法度" } - -["忳郁邑余侘傺兮, 吾独穷困乎此时也."] -note = ['忳郁邑: 忧愁烦闷', '侘傺: 失意的样子'] -content = "忳/郁邑/余/侘傺/兮/, 吾/独/穷困/乎/此时/也./" -translation = "忧愁烦闷啊我失意不安, 现在孤独穷困多么艰难" -keyword_note = { "忳郁邑" = "忧愁烦闷", "侘傺" = "失意", "穷困" = "走投无路" } - -["宁溘死以流亡兮, 余不忍为此态也!"] -note = ['溘: 突然', '此态: 指迎合讨好他人的丑态'] -content = "宁/溘死/以/流亡/兮/, 余/不忍/为/此态/也!/" -translation = "宁可马上死去魂魄离散, 媚俗取巧啊我坚决不干" -keyword_note = { "溘死" = "突然死去", "流亡" = "随流水消逝", "此态" = "丑态" } - -["鸷鸟之不群兮, 自前世而固然."] -note = ['鸷鸟: 凶猛的鸟, 指鹰、雕等'] -content = "鸷鸟/之/不群/兮/, 自/前世/而/固然./" -translation = "雄鹰不与那些燕雀同群, 原本自古以来就是这般" -keyword_note = { "鸷鸟" = "猛禽", "不群" = "不与凡鸟同群", "固然" = "本来如此" } - -["何方圜之能周兮, 夫孰异道而相安?"] -note = ['方圜: 方枘和圆凿'] -content = "何/方圜/之/能周/兮/, 夫/孰/异道/而/相安?/" -translation = "哪有方枘和圆凿能够相合, 哪有道不同却能够相互安处的" -keyword_note = { "方圜" = "方枘圆凿", "周" = "相合", "异道" = "不同道路", "相安" = "相互安处" } - -["屈心而抑志兮, 忍尤而攘诟."] -note = ['尤: 责备', '攘: 容忍', '诟: 辱骂'] -content = "屈心/而/抑志/兮/, 忍/尤/而/攘诟./" -translation = "宁愿委曲心志压抑情感, 宁把斥责咒骂统统承担" -keyword_note = { "屈心" = "委屈心志", "抑志" = "压抑情感", "忍尤" = "忍受责备", "攘诟" = "容忍辱骂" } - -["伏清白以死直兮, 固前圣之所厚."] -note = ["伏: 同'服', 保持"] -content = "伏/清白/以/死直/兮/, 固/前圣/之/所厚./" -translation = "保持清白节操死于直道, 这本为古代圣贤所称赞" -keyword_note = { "伏" = "保持", "死直" = "死于直道", "前圣" = "古代圣贤", "所厚" = "所推崇" } - -["悔相道之不察兮, 延伫乎吾将反."] -note = ['相: 观察', '延伫: 久立'] -content = "悔/相道/之/不察/兮/, 延伫/乎/吾/将反./" -translation = "后悔选择道路时没有看清, 我久久伫立而想返回" -keyword_note = { "相道" = "观察道路", "不察" = "没有看清", "延伫" = "久立", "将反" = "想返回" } - -["回朕车以复路兮, 及行迷之未远."] -note = [] -content = "回/朕车/以/复路/兮/, 及/行迷/之/未远./" -translation = "掉转我的车子返回原路, 趁着迷路还不算远的时候" -keyword_note = { "回" = "掉转", "复路" = "回原路", "及" = "趁着", "行迷" = "走入迷途" } - -["步余马于兰皋兮, 驰椒丘且焉止息."] -note = ['步: 缓行', '皋: 水边地'] -content = "步/余马/于/兰皋/兮/, 驰/椒丘/且/焉/止息./" -translation = "让我的马缓缓走在长着兰草的水边, 驱马疾行到长着椒树的山冈暂且在那里休息" -keyword_note = { "步" = "缓行", "兰皋" = "长兰草的水边", "驰" = "疾行", "椒丘" = "长椒树的山冈", "止息" = "休息" } - -["进不入以离尤兮, 退将复修吾初服."] -note = ['不入: 不被容纳', '初服: 出仕前的服饰, 比喻原先的志向'] -content = "进/不入/以/离尤/兮/, 退/将/复修/吾/初服./" -translation = "到朝廷做官不被接纳而又遭受指责, 退下来重新整理我当初的衣服" -keyword_note = { "不入" = "不被容纳", "离尤" = "遭受指责", "复修" = "重新整理", "初服" = "原先的志向" } - -["制芰荷以为衣兮, 集芙蓉以为裳."] -note = ['芰荷: 菱叶与荷叶'] -content = "制/芰荷/以/为衣/兮/, 集/芙蓉/以/为裳./" -translation = "我要把菱叶裁剪成上衣, 我并用荷花把下裳织就" -keyword_note = { "制" = "裁剪", "芰荷" = "菱叶荷叶", "集" = "收集", "芙蓉" = "荷花" } - -["不吾知其亦已兮, 苟余情其信芳."] -note = [] -content = "不/吾知/其/亦已/兮/, 苟/余情/其/信芳./" -translation = "没有人了解我也就罢了, 只要内心真正馥郁芳柔" -keyword_note = { "不吾知" = "不了解我", "亦已" = "也就算了", "苟" = "只要", "信芳" = "确实美好" } - -["高余冠之岌岌兮, 长余佩之陆离."] -note = ['岌岌: 高耸的样子', '陆离: 修长的样子'] -content = "高/余冠/之/岌岌/兮/, 长/余佩/之/陆离./" -translation = "把我的帽子加得高高的, 把我的佩带增得长悠悠" -keyword_note = { "高" = "加高", "岌岌" = "高耸", "长" = "加长", "陆离" = "修长" } - -["芳与泽其杂糅兮, 唯昭质其犹亏."] -note = ['昭质: 光明纯洁的本质'] -content = "芳/与/泽/其/杂糅/兮/, 唯/昭质/其/犹亏./" -translation = "虽然芳洁污垢混杂一起, 只有纯洁品质不会腐朽" -keyword_note = { "芳" = "芳香", "泽" = "润泽", "杂糅" = "混杂", "昭质" = "光明纯洁的本质", "亏" = "减损" } - -["忽反顾以游目兮, 将往观乎四荒."] -note = ['游目: 放眼观看'] -content = "忽/反顾/以/游目/兮/, 将/往观/乎/四荒./" -translation = "我忽然回头啊纵目远望, 我将游观四面遥远地方" -keyword_note = { "反顾" = "回头", "游目" = "纵目远望", "往观" = "去观看", "四荒" = "四方遥远之地" } - -["佩缤纷其繁饰兮, 芳菲菲其弥章."] -note = ['菲菲: 香气浓烈', "章: 同'彰'"] -content = "佩/缤纷/其/繁饰/兮/, 芳/菲菲/其/弥章./" -translation = "佩着五彩缤纷华丽装饰, 散发出一阵阵浓郁清香" -keyword_note = { "缤纷" = "五彩缤纷", "繁饰" = "华丽装饰", "菲菲" = "香气浓烈", "弥章" = "更加显著" } - -["民生各有所乐兮, 余独好修以为常."] -note = [] -content = "民生/各/有/所乐/兮/, 余/独/好修/以/为常./" -translation = "人们各有自己的爱好啊, 我独爱好修饰习以为常" -keyword_note = { "民生" = "人生", "所乐" = "所爱好的", "好修" = "爱好修饰", "为常" = "习以为常" } - -["虽体解吾犹未变兮, 岂余心之可惩?"] -note = ['惩: 因受创而戒止'] -content = "虽/体解/吾/犹未变/兮/, 岂/余心/之/可惩?/" -translation = "即使粉身碎骨也不改变, 难道我能受警戒而彷徨" -keyword_note = { "体解" = "肢解", "未变" = "不改变", "余心" = "我的心", "可惩" = "会因惩罚而停止" } - -["种树郭橐驼传"] -note = [] -content = "种树郭橐驼传/" -translation = "种树郭橐驼传" -keyword_note = {} - -["郭橐驼, 不知始何名."] -note = [] -content = "郭橐驼/, 不知/始/何名./" -translation = "郭橐驼, 不知道他起初叫什么名字. " -keyword_note = {} - -["病瘘, 隆然伏行, 有类橐驼者, 故乡人号之'驼'."] -note = [] -content = "病瘘/, 隆然/伏行/, 有类/橐驼者/, 故/乡人/号之/'驼'./" -translation = "他患了脊背弯曲的病, 脊背突起而弯腰行走, 就像骆驼一样, 所以乡里人称呼他叫'橐驼'. " -keyword_note = { "病瘘" = "患了脊背弯曲的病", "隆然" = "脊背突起的样子", "伏行" = "弯腰行走", "橐驼" = "骆驼" } - -["驼闻之, 曰:'甚善.名我固当.'"] -note = [] -content = "驼/闻之/, 曰:/'甚善./名我/固当.'/" -translation = "橐驼听说后, 说: '这个名字很好啊, 这样称呼我确实恰当. '" -keyword_note = { "固当" = "确实恰当" } - -["因舍其名, 亦自谓橐驼云."] -note = [] -content = "因/舍其名/, 亦/自谓/橐驼/云./" -translation = "于是他舍弃了他原来的名字, 也自称起'橐驼'来. " -keyword_note = {} - -["其乡曰丰乐乡, 在长安西."] -note = [] -content = "其乡/曰/丰乐乡/, 在/长安西./" -translation = "他的家乡叫丰乐乡, 在长安城西边. " -keyword_note = {} - -["驼业种树, 凡长安豪富人为观游及卖果者, 皆争迎取养."] -note = [] -content = "驼/业种树/, 凡/长安/豪富人/为观游/及/卖果者/, 皆/争迎取养./" -translation = "郭橐驼以种树为职业, 凡是长安城里的富豪人家, 从事园林游览和做水果买卖的人, 都争着迎接他, 雇佣他. " -keyword_note = { "业种树" = "以种树为职业", "观游" = "园林游览", "争迎取养" = "争着迎接雇佣" } - -["视驼所种树, 或移徙, 无不活, 且硕茂, 早实以蕃."] -note = [] -content = "视/驼/所种树/, 或/移徙/, 无不活/, 且/硕茂/, 早实/以蕃./" -translation = "观察橐驼种的树, 即使是移植来的, 也没有不成活的; 而且长得高大茂盛, 结果实早而且多. " -keyword_note = { "硕茂" = "高大茂盛", "早实以蕃" = "结果实早而且多" } - -["他植者虽窥伺效慕, 莫能如也."] -note = [] -content = "他植者/虽/窥伺效慕/, 莫能/如也./" -translation = "其他种树的人即使暗中观察, 羡慕效仿, 也没有谁能比得上. " -keyword_note = { "窥伺效慕" = "暗中观察羡慕效仿" } - -["有问之, 对曰:'橐驼非能使木寿且孳也, 能顺木之天, 以致其性焉尔.'"] -note = [] -content = "有问之/, 对曰:/'橐驼/非能/使木/寿且孳也/, 能/顺木之天/, 以/致其性/焉尔.'/" -translation = "有人问他种树种得好的原因, 他回答说: '橐驼我不是能够使树木活得长久而且长得很快, 只不过能够顺应树木的天性, 来实现其自身的习性罢了. '" -keyword_note = { "寿且孳" = "活得长久而且长得很快", "顺木之天" = "顺应树木的天性", "致其性" = "实现其习性" } - -["凡植木之性, 其本欲舒, 其培欲平, 其土欲故, 其筑欲密."] -note = [] -content = "凡/植木之性/, 其本/欲舒/, 其培/欲平/, 其土/欲故/, 其筑/欲密./" -translation = "但凡种树的方法, 它的树根要舒展, 它的培土要平匀, 它根下的土要用原来培育树苗的土, 它捣土要结实. " -keyword_note = { "本欲舒" = "树根要舒展", "培欲平" = "培土要平匀", "土欲故" = "用原来的土", "筑欲密" = "捣土要结实" } - -["既然已, 勿动勿虑, 去不复顾."] -note = [] -content = "既然已/, 勿动/勿虑/, 去/不复顾./" -translation = "已经这样做了, 就不要再动, 不要再忧虑它, 离开它不再回顾. " -keyword_note = {} - -["其莳也若子, 其置也若弃, 则其天者全而其性得矣."] -note = [] -content = "其莳也/若子/, 其置也/若弃/, 则/其天者全/而/其性得矣./" -translation = "栽种时要像对待孩子一样细心, 栽好后置于一旁要像抛弃了它们一样, 那么树木的天性就得以保全, 它的习性就得以实现. " -keyword_note = { "莳" = "栽种", "若子" = "像对待孩子一样", "若弃" = "像抛弃了一样" } - -["故吾不害其长而已, 非有能硕茂之也; 不抑耗其实而已, 非有能早而蕃之也."] -note = [] -content = "故/吾/不害其长/而已/, 非有能/硕茂之也/; 不抑耗/其实/而已/, 非有能/早而蕃之也./" -translation = "所以我只不过不妨害它的生长罢了, 并不是有能使它长得高大茂盛的办法; 只不过不抑制、减少它的结果罢了, 也并不是有能使它果实结得早又多的办法. " -keyword_note = { "不害其长" = "不妨害它的生长", "抑耗" = "抑制减少" } - -["他植者则不然, 根拳而土易, 其培之也, 若不过焉则不及."] -note = [] -content = "他植者/则不然/, 根拳/而/土易/, 其培之也/, 若/不过焉/则不及./" -translation = "别的种树人却不是这样, 树根拳曲又换了生土; 他培土的时候, 不是过紧就是太松. " -keyword_note = { "根拳" = "树根拳曲", "土易" = "换了生土" } - -["苟有能反是者, 则又爱之太恩, 忧之太勤, 旦视而暮抚, 已去而复顾,"] -note = [] -content = "苟/有能/反是者/, 则又/爱之太恩/, 忧之太勤/, 旦视/而/暮抚/, 已去/而/复顾,/" -translation = "如果有能够和这种做法相反的人, 就又太过于吝惜它们了, 在早晨去看了, 在晚上又去摸摸, 已经离开了, 又回头去看看. " -keyword_note = { "反是者" = "和这种做法相反的人", "爱之太恩" = "太过于吝惜它们", "忧之太勤" = "担心得太勤" } - -["甚者爪其肤以验其生枯, 摇其本以观其疏密, 而木之性日以离矣."] -note = [] -content = "甚者/爪其肤/以验/其生枯/, 摇其本/以观/其疏密/, 而/木之性/日以离矣./" -translation = "更严重的, 甚至掐破树皮来观察它是死是活着, 摇晃树干来看它是否栽结实了, 这样树木的天性就一天天远去了. " -keyword_note = { "爪其肤" = "掐破树皮", "验其生枯" = "观察它是死是活", "摇其本" = "摇晃树干", "日以离" = "一天天远去" } - -["虽曰爱之, 其实害之; 虽曰忧之, 其实仇之, 故不我若也."] -note = [] -content = "虽曰/爱之/, 其实/害之/; 虽曰/忧之/, 其实/仇之/, 故/不我若也./" -translation = "虽然说是喜爱它, 这实际上是害了它, 虽说是担心它, 这实际上是仇恨它. 所以他们都不如我. " -keyword_note = { "不我若" = "不如我" } - -["吾又何能为哉!"] -note = [] -content = "吾/又何能为哉!/" -translation = "我又能做什么呢? '" -keyword_note = {} - -["问者曰:'以子之道, 移之官理, 可乎?'"] -note = [] -content = "问者曰:/'以子之道/, 移之/官理/, 可乎?'/" -translation = "问的人说: '把你种树的方法, 转用到做官治民上, 可行吗? '" -keyword_note = { "官理" = "做官治民" } - -["驼曰:'我知种树而已, 官理, 非吾业也."] -note = [] -content = "驼曰:/'我知/种树/而已/, 官理/, 非吾业也./" -translation = "橐驼说: '我只知道种树罢了, 做官治民,不是我的职业. " -keyword_note = {} - -["然吾居乡, 见长人者好烦其令, 若甚怜焉, 而卒以祸.'"] -note = [] -content = "然/吾居乡/, 见/长人者/好烦其令/, 若/甚怜焉/, 而/卒以祸.'/" -translation = "但是我住在乡里, 看见那些官吏喜欢不断地发号施令, 好像是很怜爱(百姓)啊, 但百姓最终反因此受到祸害. '" -keyword_note = { "长人者" = "官吏", "好烦其令" = "喜欢不断地发号施令", "甚怜" = "很怜爱", "卒以祸" = "最终受到祸害" } - -["旦暮吏来而呼曰:'官命促尔耕, 勖尔植, 督尔获, 早缫而绪, 早织而缕, 字而幼孩, 遂而鸡豚.'"] -note = [] -content = "旦暮/吏来/而呼曰:/'官命/促尔耕/, 勖尔植/, 督尔获/, 早缫/而绪/, 早织/而缕/, 字/而幼孩/, 遂/而鸡豚.'/" -translation = "在早上在晚上那些小吏跑来大喊: '长官命令: 催促你们耕地, 勉励你们种植, 督促你们收获, 早些煮茧抽丝, 早些织你们的布, 养育你们的小孩, 喂大你们的鸡和猪. '" -keyword_note = { "促尔耕" = "催促你们耕地", "勖尔植" = "勉励你们种植", "督尔获" = "督促你们收获", "早缫而绪" = "早些煮茧抽丝", "早织而缕" = "早些织布", "字而幼孩" = "养育你们的小孩", "遂而鸡豚" = "喂大你们的鸡和猪" } - -["'鸣鼓而聚之, 击木而召之.'"] -note = [] -content = "'鸣鼓/而聚之/, 击木/而召之.'/" -translation = "'一会儿打鼓招聚大家, 一会儿鼓梆召集大家, '" -keyword_note = {} - -["吾小人辍飧饔以劳吏者, 且不得暇, 又何以蕃吾生而安吾性耶?"] -note = [] -content = "吾/小人/辍/飧饔/以劳吏者/, 且/不得暇/, 又/何以/蕃吾生/而/安吾性/耶?/" -translation = "我们这些小百姓停止吃早、晚饭去慰劳那些小吏尚且不得空暇, 又怎能使我们繁衍生息, 民心安定呢? " -keyword_note = { "小人" = "小百姓", "辍飧饔" = "停止吃早晚饭", "劳吏" = "慰劳官吏", "蕃吾生" = "使我们繁衍生息", "安吾性" = "使民心安定" } - -["故病且怠."] -note = [] -content = "故/病且怠./" -translation = "所以我们既困苦又疲乏," -keyword_note = { "病且怠" = "困苦又疲乏" } - -["若是, 则与吾业者其亦有类乎?'"] -note = [] -content = "若是/, 则/与吾业者/其/亦有类乎?'/" -translation = "像这样 (治民反而扰民) , 它与我种树的行当大概也有相似的地方吧? '" -keyword_note = {} - -["问者曰:'嘻, 不亦善夫!吾问养树, 得养人术.'"] -note = [] -content = "问者曰:/'嘻/, 不亦/善夫!/吾/问养树/, 得/养人术.'/" -translation = "问的人说: '不也是很好吗! 我问种树的方法, 得到了治民的方法. '" -keyword_note = { "养人术" = "治民的方法" } - -["传其事以为官戒."] -note = [] -content = "传其事/以为/官戒./" -translation = "我记录这件事把它作为官吏们的警戒. " -keyword_note = { "官戒" = "官吏们的警戒" } - -["答司马谏议书"] -note = [] -content = "答司马谏议书/" -translation = "答司马谏议书" -keyword_note = {} - -["某启: 昨日蒙教, 窃以为与君实游处相好之日久, 而议事每不合, 所操之术多异故也."] -note = ['某: 自称', '启: 写信说明事情', '君实: 司马光的字'] -content = "某/启: /昨日/蒙教/, 窃/以为/与/君实/游处/相好/之/日/久/, 而/议事/每/不合/, 所操之术/多异/故也./" -translation = "鄙人王安石请启: 昨天承蒙 (您来信) 指教, 我私下认为与君实您交往相好的日子很久了, 但是议论起政事来 (意见) 常常不一致, (这是因为我们) 所持的政治主张和方法大多不同的缘故啊" -keyword_note = { "蒙教" = "承蒙指教", "窃" = "私下, 谦词", "游处" = "同游共处, 即同事交往", "所操之术" = "所持的政治主张和方法" } - -["虽欲强聒, 终必不蒙见察, 故略上报, 不复一一自辨."] -note = ["辨通'辩', 辩解"] -content = "虽/欲/强聒/, 终/必/不蒙/见察/, 故/略/上报/, 不复/一一/自辨./" -translation = "虽然想要勉强劝说几句, 最终也必定不被您所谅解, 所以只简单地给您回信, 不再逐一替自己辩护" -keyword_note = { "强聒" = "硬在耳边啰嗦, 强作解说", "见察" = "被谅解", "上报" = "写回信", "自辨" = "自我辩护" } - -["重念蒙君实视遇厚, 于反覆不宜卤莽, 故今具道所以, 冀君实或见恕也."] -note = ["卤通'鲁', 粗鲁", "具通'俱', 详细"] -content = "重念/蒙/君实/视遇/厚/, 于/反覆/不宜/卤莽/, 故/今/具道/所以/, 冀/君实/或/见恕/也./" -translation = "后来又考虑到蒙您一向看重和厚待我, 在书信往来上不宜马虎草率, 所以我现在详细地说出我这样做的原因, 希望您看后或许能谅解我吧" -keyword_note = { "重念" = "再三想想", "视遇厚" = "看重", "反覆" = "书信往来", "具道" = "详细说明", "所以" = "原因", "冀" = "希望", "见恕" = "原谅我" } - -["盖儒者所争, 尤在于名实, 名实已明, 而天下之理得矣."] -note = [] -content = "盖/儒者/所争/, 尤/在/于/名实/, 名实/已明/, 而/天下/之/理/得/矣./" -translation = "读书人所争辩的, 尤其在于名气是否符合 (实际) , 名气符合实际后, 天下之间的道理就清晰了" -keyword_note = { "儒者" = "读书人", "名实" = "名义和实际" } - -["今君实所以见教者, 以为侵官、生事、征利、拒谏, 以致天下怨谤也."] -note = [] -content = "今/君实/所以/见教/者/, 以为/侵官/、生事/、征利/、拒谏/, 以/致/天下/怨谤/也./" -translation = "如今您来指教我的, 是认为我的做法侵犯了官吏们的职权, 惹是生非制造事端, 聚敛钱财与民争利, 拒不接受意见, 因此招致天下人的怨恨和指责" -keyword_note = { "见教" = "指教我", "侵官" = "侵犯官权", "生事" = "惹是生非", "征利" = "聚敛钱财", "拒谏" = "拒不接受意见", "怨谤" = "怨恨和指责" } - -["某则以谓受命于人主, 议法度而修之于朝廷, 以授之于有司, 不为侵官;"] -note = [] -content = "某/则/以谓/受命/于/人主/, 议/法度/而/修之/于/朝廷/, 以/授之/于/有司/, 不为/侵官;/" -translation = "我却认为从皇帝那里接受命令, 在朝堂上公开议订法令制度并在朝廷上修改, 把它交给有关部门官吏去执行, 这不属侵犯官权" -keyword_note = { "人主" = "皇帝", "法度" = "法令制度", "有司" = "有关部门官吏" } - -["举先王之政, 以兴利除弊, 不为生事; 为天下理财, 不为征利;"] -note = [] -content = "举/先王/之政/, 以/兴利/除弊/, 不为/生事; /为/天下/理财/, 不为/征利;/" -translation = "效法先皇的贤明政治, 用来兴办好事, 革除弊端, 这不是惹是生非; 替国家理财政, 这不是搜刮钱财" -keyword_note = { "举" = "效法", "兴利除弊" = "兴办好事, 革除弊端", "理财" = "管理财政" } - -["辟邪说, 难壬人, 不为拒谏."] -note = [] -content = "辟/邪说/, 难/壬人/, 不为/拒谏./" -translation = "驳斥错误言论, 责难奸佞小人, 这不是拒听意见" -keyword_note = { "辟邪说" = "批驳不正确的言论", "难壬人" = "排斥巧辩的佞人" } - -["至于怨诽之多, 则固前知其如此也."] -note = [] -content = "至于/怨诽/之/多/, 则/固/前知/其/如此/也./" -translation = "至于那么多的怨恨和诽谤, 那本来预料到它会这样的" -keyword_note = { "怨诽" = "怨恨和诽谤", "固" = "本来", "前知" = "预料" } - -["人习于苟且非一日, 士大夫多以不恤国事、同俗自媚于众为善, 上乃欲变此, 而某不量敌之众寡, 欲出力助上以抗之, 则众何为而不汹汹然?"] -note = [] -content = "人/习于/苟且/非/一日/, 士大夫/多/以/不恤/国事/、同俗/自媚/于众/为/善/, 上/乃/欲/变此/, 而/某/不量/敌之/众寡/, 欲/出力/助上/以/抗之/, 则/众/何为/而/不/汹汹/然?/" -translation = "人们习惯于苟且偷安、得过且过 (已) 不是一天 (的事) 了. 士大夫们多数把不顾国家大事、附和世俗 (的见解) , 向众人献媚讨好当做好事, (因而) 陛下才要改变这种 (不良) 风气, 那么我不去估量反对者的多少, 想拿出 (自己的) 力量帮助陛下来抵制这股势力, (这样一来) 那么那些人又为什么不 (对我) 大吵大闹呢" -keyword_note = { "苟且" = "苟且偷安", "不恤国事" = "不顾国家大事", "同俗自媚于众" = "附和世俗, 向众人献媚", "上" = "陛下", "汹汹" = "大吵大闹" } - -["盘庚之迁, 胥怨者民也, 非特朝廷士大夫而已;"] -note = [] -content = "盘庚/之/迁/, 胥怨/者/民/也/, 非特/朝廷/士大夫/而已;/" -translation = "盘庚迁都 (的时候) , 连老百姓都抱怨啊, (并) 不只是朝廷上的士大夫 (加以反对) " -keyword_note = { "盘庚之迁" = "盘庚迁都", "胥怨" = "相怨, 指百姓抱怨", "非特" = "不只是" } - -["盘庚不为怨者故改其度, 度义而后动, 是而不见可悔故也."] -note = [] -content = "盘庚/不/为/怨者/故/改/其/度/, 度义/而/后/动/, 是/而/不见/可悔/故/也./" -translation = "盘庚不因为有人怨恨的缘故就改变自己的计划; (这是他) 考虑到 (迁都) 合理, 然后坚决行动; 认为对 (就) 看不出有什么可以后悔的缘故啊" -keyword_note = { "度" = "计划", "度义" = "考虑是否合理", "是" = "认为正确" } - -["如君实责我以在位久, 未能助上大有为, 以膏泽斯民, 则某知罪矣;"] -note = ['膏泽: 名词作动词, 施加恩惠'] -content = "如/君实/责我/以/在位/久/, 未能/助上/大有为/, 以/膏泽/斯民/, 则/某/知罪/矣;/" -translation = "如果君实您责备我因为 (我) 在位任职很久, 没能帮助陛下干一番大事业, 使这些老百姓得到好处, 那么我承认 (自己是) 有罪的" -keyword_note = { "大有为" = "干大事业", "膏泽斯民" = "给百姓施加恩惠" } - -["如曰今日当一切不事事, 守前所为而已, 则非某之所敢知."] -note = ["事事: 前一'事'字是动词, 后一'事'字是名词"] -content = "如曰/今日/当/一切/不/事事/, 守前/所为/而已/, 则/非/某之/所敢知./" -translation = "如果说现在应该什么事都不去做, 墨守前人的陈规旧法就是了, 那就不是我敢领教的了" -keyword_note = { "事事" = "做事", "守前所为" = "墨守前人的作法", "所敢知" = "敢领教的" } - -["无由会晤, 不任区区向往之至!"] -note = [] -content = "无由/会晤/, 不任/区区/向往/之至!/" -translation = "没有机会 (与您) 见面, 内心不胜仰慕至极" -keyword_note = { "无由" = "没有机会", "不任" = "不胜", "区区" = "谦称自己", "向往之至" = "仰慕到极点" } - -["苏幕遮·燎沉香"] -note = [] -content = "苏幕遮·燎沉香/" -translation = "苏幕遮·燎沉香" -keyword_note = {} - -["燎沉香, 消溽暑"] -note = ['描写夏日焚香消暑的雅致生活场景'] -content = "燎/沉香/, 消/溽暑/" -translation = "焚烧沉香, 来消除夏日潮湿的暑气" -keyword_note = { "燎" = "烧", "沉香" = "一种名贵香料, 置水中则下沉", "溽暑" = "潮湿的暑气" } - -["鸟雀呼晴, 侵晓窥檐语"] -note = ['通过鸟雀欢鸣表现雨后初晴的喜悦气氛'] -content = "鸟雀/呼晴/, 侵晓/窥檐/语/" -translation = "快天亮的时候, 鸟雀都在屋檐下叫个不停, 欢呼天已放晴" -keyword_note = { "呼晴" = "唤晴, 鸟鸣可占晴雨", "侵晓" = "快天亮的时候", "窥檐语" = "在屋檐下窥视鸣叫" } - -["叶上初阳干宿雨, 水面清圆, 一一风荷举"] -note = ["描绘晨光中荷叶挺立的生动画面, '举'字用得极妙"] -content = "叶上/初阳/干/宿雨/, 水面/清圆/, 一一/风荷/举/" -translation = "初出的阳光晒干了荷叶上昨夜的雨滴, 水面上的荷叶清润圆正, 迎着晨风, 每一片都挺出水面" -keyword_note = { "初阳" = "初出的阳光", "宿雨" = "昨夜下的雨", "清圆" = "清润圆正", "风荷举" = "荷叶迎着晨风挺出水面" } - -["故乡遥, 何日去?"] -note = ['由景生情, 转入思乡之情的抒发'] -content = "故乡/遥/, 何日/去?/" -translation = "想到那遥远的故乡, 什么时候才能回去啊? " -keyword_note = { "故乡遥" = "故乡遥远", "何日去" = "何时能够回去" } - -["家住吴门, 久作长安旅"] -note = ['点明作者江南人的身份和长期客居京城的境遇'] -content = "家住/吴门/, 久作/长安/旅/" -translation = "我家本在江南一带, 却长久地客居汴京" -keyword_note = { "吴门" = "泛指江南一带, 今江苏苏州", "长安" = "借指北宋都城汴京", "旅" = "客居" } - -["五月渔郎相忆否?"] -note = ['用反问句式表达对故乡亲友的深切思念'] -content = "五月/渔郎/相忆/否?/" -translation = "又到五月, 不知家乡的朋友是否也在思念我? " -keyword_note = { "渔郎" = "指故乡的钓鱼朋友", "相忆" = "相互思念" } - -["小楫轻舟, 梦入芙蓉浦"] -note = ['以梦境作结, 表现归乡不得只能在梦中重返故地的惆怅'] -content = "小楫/轻舟/, 梦入/芙蓉/浦/" -translation = "在梦中, 我划着一叶小舟, 又闯入那西湖的荷花塘中" -keyword_note = { "小楫" = "短桨, 指划船用具", "轻舟" = "轻快的小船", "芙蓉浦" = "有荷花的水边, 指杭州西湖" } - -["菩萨蛮·书江西造口壁"] -note = [] -content = "菩萨蛮·书江西造口壁/" -translation = "菩萨蛮·书江西造口壁" -keyword_note = {} - -["郁孤台下清江水, 中间多少行人泪."] -note = [] -content = "郁孤台下/清江水/, 中间/多少/行人泪./" -translation = "郁孤台下这赣江的流水, 水中有多少苦难之人的眼泪" -keyword_note = { "郁孤台" = "今江西省赣州市城区西北部贺兰山顶, 又称望阙台", "清江" = "赣江与袁江合流处旧称清江", "行人泪" = "指逃难民众的泪水" } - -["西北望长安, 可怜无数山."] -note = [] -content = "西北/望/长安/, 可怜/无数山./" -translation = "我举头眺望西北的长安, 可惜只看到无数青山" -keyword_note = { "长安" = "今陕西省西安市, 为汉唐故都. 此处代指宋都汴京", "可怜" = "可惜", "无数山" = "很多座山" } - -["青山遮不住, 毕竟东流去."] -note = [] -content = "青山/遮不住/, 毕竟/东流去./" -translation = "但青山怎能把江水挡住? 浩浩江水终于还是向东流去" -keyword_note = { "遮不住" = "阻挡不了", "东流去" = "向东流去" } - -["江晚正愁余, 山深闻鹧鸪."] -note = ['愁余 一作: 愁予'] -content = "江晚/正/愁余/, 山深/闻/鹧鸪./" -translation = "江边日晚我正满怀愁绪, 听到深山传来声声鹧鸪悲鸣" -keyword_note = { "愁余" = "使我发愁", "鹧鸪" = "鸟名. 传说其叫声如云'行不得也哥哥', 啼声凄苦" } - -["菩萨蛮·小山重叠金明灭"] -note = [] -content = "菩萨蛮·小山重叠金明灭/" -translation = "菩萨蛮·小山重叠金明灭" -keyword_note = {} - -["鬓云欲度香腮雪"] -note = [] -content = "鬓云/欲度/香腮/雪/" -translation = "她那散乱如云的鬓发, 在如雪的面庞上轻拂" -keyword_note = { "鬓云" = "像云朵似的鬓发", "欲度" = "将掩未掩的样子", "香腮雪" = "雪白的面颊" } - -["懒起画蛾眉, 弄妆梳洗迟"] -note = [] -content = "懒起/画/蛾眉/, 弄妆/梳洗/迟/" -translation = "懒懒地起身描画蛾眉, 慢慢地梳妆打扮, 修饰仪容" -keyword_note = { "蛾眉" = "女子的眉毛细长弯曲像蚕蛾的触须", "弄妆" = "梳妆打扮, 修饰仪容" } - -["照花前后镜, 花面交相映"] -note = [] -content = "照花/前后/镜/, 花面/交相/映/" -translation = "簪花时置放前后双镜, 花容和人的娇颜交相辉映" -keyword_note = { "照花" = "对镜簪花", "花面" = "花容和人的娇颜" } - -["新帖绣罗襦, 双双金鹧鸪"] -note = ['帖 一作: 贴'] -content = "新帖/绣/罗襦/, 双双/金/鹧鸪/" -translation = "身穿崭新的丝绸短袄, 衣上贴绣的鹧鸪似欲飞动; 那金线绣成的鹧鸪成双, 又撩起她相思的柔情" -keyword_note = { "帖绣" = "苏绣中的一种工艺", "罗襦" = "丝绸短袄", "金鹧鸪" = "用金线绣的鹧鸪图案" } - -["虞美人"] -note = [] -content = "虞美人/" -translation = "虞美人" -keyword_note = {} - -["春花秋月何时了, 往事知多少."] -note = [] -content = "春花/秋月/何时/了/, 往事/知/多少./" -translation = "春天的花, 秋天的月, 什么时候才能了结? 往事又能知道有多少! " -keyword_note = { "了" = "了结, 完结", "往事" = "过去的事情" } - -["小楼昨夜又东风, 故国不堪回首月明中."] -note = [] -content = "小楼/昨夜/又/东风/, 故国/不堪/回首/月明/中./" -translation = "昨夜小楼上又吹来了春风, 在这皓月当空的夜晚, 怎承受得了回忆故国的伤痛. " -keyword_note = { "东风" = "春风", "故国" = "指南唐故都金陵", "不堪" = "不能忍受", "回首" = "回忆" } - -["雕阑玉砌应犹在, 只是朱颜改."] -note = [] -content = "雕阑/玉砌/应/犹在/, 只是/朱颜/改./" -translation = "精雕细刻的栏杆、玉石砌成的台阶应该还在, 只是所怀念的人已衰老. " -keyword_note = { "雕阑玉砌" = "指远在金陵的南唐故宫", "应犹" = "应该还", "朱颜改" = "指所怀念的人已衰老" } - -["问君能有几多愁, 恰是一江春水向东流."] -note = [] -content = "问君/能/有/几多/愁/, 恰是/一江/春水/向/东流./" -translation = "要问我心中有多少哀愁, 就像这不尽的滔滔春水滚滚东流. " -keyword_note = { "君" = "作者自称", "能" = "或作'都'、'那'、'还'、'却'", "几多" = "多少", "恰是" = "正像是" } - -["蜀相"] -note = [] -content = "蜀相/" -translation = "蜀相" -keyword_note = {} - -["丞相祠堂何处寻? 锦官城外柏森森."] -note = [] -content = "丞相/祠堂/何处/寻? /锦官/城外/柏/森森./" -translation = "去哪里寻找武侯诸葛亮的祠堂? 在成都城外那柏树茂密的地方. " -keyword_note = { "丞相祠堂" = "即诸葛武侯祠, 在现在成都, 晋李雄初建", "锦官城" = "成都的别名", "柏森森" = "柏树茂盛繁密的样子" } - -["映阶碧草自春色, 隔叶黄鹂空好音."] -note = [] -content = "映阶/碧草/自/春色/, 隔叶/黄鹂/空/好音./" -translation = "碧草映照石阶, 不过自为春色; 隔着树叶的黄鹂, 亦不过空作好音. " -keyword_note = { "自" = "白白的, 徒然", "空" = "白白的, 徒然", "好音" = "美妙的声音" } - -["三顾频烦天下计, 两朝开济老臣心."] -note = [] -content = "三顾/频烦/天下/计/, 两朝/开济/老臣/心./" -translation = "刘备为统一天下而三顾茅庐, 问计于诸葛亮, 辅佐两代君主的老臣忠心耿耿. " -keyword_note = { "三顾" = "刘备三顾茅庐", "频烦" = "频繁, 多次", "两朝" = "刘备、刘禅父子两朝", "开济" = "开创帝业, 扶助朝政" } - -["出师未捷身先死, 长使英雄泪满襟."] -note = [] -content = "出师/未捷/身/先死/, 长使/英雄/泪/满襟./" -translation = "可惜出师伐魏还没有取得最后的胜利就先去世了, 常使后代英雄感慨泪湿衣襟! " -keyword_note = { "出师" = "出兵", "未捷" = "没有取得胜利", "长使" = "常使", "泪满襟" = "泪湿衣襟" } - -["蜀道难"] -note = [] -content = "蜀道难/" -translation = "蜀道难" -keyword_note = {} - -["噫吁嚱, 危乎高哉!"] -note = ['惊叹声, 蜀方言, 表示惊讶的声音'] -content = "噫吁嚱/, 危乎/高哉!/" -translation = "唉呀呀! 多么高峻伟岸! " -keyword_note = { "噫吁嚱" = "惊叹声, 蜀方言" } - -["蜀道之难, 难于上青天!"] -note = [] -content = "蜀道/之难/, 难于/上青天!/" -translation = "蜀道难以攀越, 简直难于上青天. " -keyword_note = {} - -["蚕丛及鱼凫, 开国何茫然!"] -note = ['蚕丛、鱼凫: 传说中古蜀国两位国王的名字'] -content = "蚕丛/及/鱼凫/, 开国/何/茫然!/" -translation = "传说中蚕丛和鱼凫建立了蜀国, 开国的年代实在久远无法详谈. " -keyword_note = { "蚕丛" = "古蜀国国王", "鱼凫" = "古蜀国国王", "茫然" = "渺茫遥远的样子" } - -["尔来四万八千岁, 不与秦塞通人烟."] -note = [] -content = "尔来/四万八千岁/, 不与/秦塞/通人烟./" -translation = "从那时至今约有四万八千年了吧, 秦蜀被秦岭所阻从不沟通往返. " -keyword_note = { "尔来" = "从那时以来", "秦塞" = "秦的关塞, 指秦地", "通人烟" = "人员往来" } - -["西当太白有鸟道, 可以横绝峨眉巅."] -note = [] -content = "西当/太白/有/鸟道/, 可以/横绝/峨眉巅./" -translation = "西边太白山高峻无路只有飞鸟可通行, 此山可以直通峨眉山巅. " -keyword_note = { "西当" = "西对", "太白" = "太白山", "鸟道" = "只有鸟能飞过的山路", "横绝" = "横越", "峨眉巅" = "峨眉顶峰" } - -["地崩山摧壮士死, 然后天梯石栈相钩连."] -note = [] -content = "地崩/山摧/壮士死/, 然后/天梯/石栈/相钩连./" -translation = "山崩地裂, 埋葬了五位开山英雄壮士, 这样以后高险的山路和栈道才相互勾连. " -keyword_note = { "天梯" = "陡峭的山路", "石栈" = "栈道" } - -["上有六龙回日之高标, 下有冲波逆折之回川."] -note = [] -content = "上有/六龙/回日/之/高标/, 下有/冲波/逆折/之/回川./" -translation = "蜀中上有挡住太阳神六龙车的山巅, 下有激浪排空迂回曲折的大川. " -keyword_note = { "高标" = "最高峰", "冲波" = "激流", "逆折" = "水流回旋", "回川" = "有漩涡的河流" } - -["黄鹤之飞尚不得过, 猿猱欲度愁攀援."] -note = [] -content = "黄鹤/之飞/尚/不得过/, 猿猱/欲度/愁/攀援./" -translation = "善于高飞的黄鹤尚且无法飞过, 即使猢狲要想翻过也愁于攀援. " -keyword_note = { "黄鹤" = "善飞的大鸟", "尚" = "尚且", "猿猱" = "善攀援的猴类" } - -["青泥何盘盘, 百步九折萦岩峦."] -note = ['青泥: 青泥岭'] -content = "青泥/何/盘盘/, 百步/九折/萦/岩峦./" -translation = "青泥岭的泥路曲曲弯弯, 百步九折萦绕着山峦. " -keyword_note = { "青泥" = "青泥岭", "盘盘" = "曲折回旋", "百步九折" = "百步内拐九道弯", "萦" = "盘绕", "岩峦" = "山峰" } - -["扪参历井仰胁息, 以手抚膺坐长叹."] -note = ['参、井: 星宿名, 参星为蜀之分野, 井星为秦之分野'] -content = "扪参/历井/仰/胁息/, 以手/抚膺/坐/长叹./" -translation = "屏住呼吸仰头就可触摸参星和井星, 紧张得透不过气来, 用手抚胸惊恐不已徒长吁短叹. " -keyword_note = { "扪参历井" = "触摸参星经过井星", "胁息" = "屏气不敢呼吸", "膺" = "胸", "坐" = "徒, 空" } - -["问君西游何时还? 畏途巉岩不可攀."] -note = [] -content = "问君/西游/何时/还? /畏途/巉岩/不可/攀./" -translation = "好朋友呵请问你西游何时回还? 这蜀道的峭岩险道实在难以登攀! " -keyword_note = { "畏途" = "可怕的路途", "巉岩" = "险恶陡峭的山壁" } - -["但见悲鸟号古木, 雄飞雌从绕林间."] -note = [] -content = "但见/悲鸟/号/古木/, 雄飞/雌从/绕/林间./" -translation = "只见那悲鸟在古树上哀鸣啼叫; 雄雌相随飞翔在茂密树丛之间. " -keyword_note = { "但见" = "只听见", "号古木" = "在古树木中大声啼鸣", "从" = "跟随" } - -["又闻子规啼夜月, 愁空山."] -note = [] -content = "又闻/子规/啼/夜月/, 愁/空山./" -translation = "月夜又听到杜鹃凄凉悲啼, 在空山中传响回荡, 令人愁思绵绵无穷尽! " -keyword_note = { "子规" = "杜鹃鸟" } - -["蜀道之难, 难于上青天, 使人听此凋朱颜!"] -note = [] -content = "蜀道/之难/, 难于/上青天/, 使人/听此/凋/朱颜!/" -translation = "蜀道难以攀越, 简直难于上青天, 使人听到这些怎么不脸色突变? " -keyword_note = { "凋朱颜" = "红颜带忧色, 如花凋谢" } - -["连峰去天不盈尺, 枯松倒挂倚绝壁."] -note = [] -content = "连峰/去天/不盈尺/, 枯松/倒挂/倚/绝壁./" -translation = "山峰座座相连离天还不到一尺, 枯松老枝倒挂倚贴在绝壁之间. " -keyword_note = { "去" = "距离", "盈" = "满" } - -["飞湍瀑流争喧豗, 砯崖转石万壑雷."] -note = [] -content = "飞湍/瀑流/争/喧豗/, 砯崖/转石/万壑/雷./" -translation = "漩涡飞转瀑布飞泻争相喧闹着, 飞流撞击着巨石在山谷中滚动像万壑鸣雷一般. " -keyword_note = { "飞湍" = "飞奔而下的急流", "喧豗" = "喧闹声", "砯崖" = "水冲击石壁", "壑" = "山谷" } - -["其险也如此, 嗟尔远道之人胡为乎来哉!"] -note = [] -content = "其险/也/如此/, 嗟/尔/远道/之人/胡为乎/来哉!/" -translation = "这样危险的地方, 唉呀呀你这个远方而来的客人, 为什么非要来这里不可呀? " -keyword_note = { "嗟" = "感叹声", "尔" = "你", "胡为" = "为什么" } - -["剑阁峥嵘而崔嵬, 一夫当关, 万夫莫开."] -note = ['剑阁: 剑门关'] -content = "剑阁/峥嵘/而/崔嵬/, 一夫/当关/, 万夫/莫开./" -translation = "剑阁所在崇峻巍峨高入云端, 只要一人把守千军万马难攻占. " -keyword_note = { "剑阁" = "剑门关", "峥嵘崔嵬" = "山势高大雄峻", "一夫当关" = "一人守关", "万夫莫开" = "万人不能打开" } - -["所守或匪亲, 化为狼与豺."] -note = [] -content = "所守/或/匪亲/, 化为/狼/与/豺./" -translation = "驻守的官员倘若不是可信赖的人, 难免要变为豺狼, 据险作乱. " -keyword_note = { "所守" = "把守关口的人", "或匪亲" = "倘若不是可信赖的人" } - -["朝避猛虎, 夕避长蛇, 磨牙吮血, 杀人如麻."] -note = [] -content = "朝/避/猛虎/, 夕/避/长蛇/, 磨牙/吮血/, 杀人/如麻./" -translation = "每日每夜都要躲避猛虎和长蛇, 它们磨牙吮血, 杀人如麻. " -keyword_note = { "朝" = "早上", "吮" = "吸" } - -["锦城虽云乐, 不如早还家."] -note = ['锦城: 成都'] -content = "锦城/虽/云/乐/, 不如/早/还家./" -translation = "锦官城虽然说是个快乐的所在, 如此险恶还不如早早地把家还. " -keyword_note = { "锦城" = "成都" } - -["蜀道之难, 难于上青天, 侧身西望长咨嗟!"] -note = [] -content = "蜀道/之难/, 难于/上青天/, 侧身/西望/长/咨嗟!/" -translation = "蜀道难以攀越, 简直难于上青天, 侧身西望令人不免感慨与长叹! " -keyword_note = { "咨嗟" = "叹息" } - -["论语·侍坐"] -note = [] -content = "论语·侍坐/" -translation = "论语·侍坐" -keyword_note = {} - -["子路、曾皙、冉有、公西华侍坐"] -note = ['选自《论语》'] -content = "子路/、曾皙/、冉有/、公西华/侍坐/" -translation = "子路、曾皙、冉有、公西华侍奉 (孔子) 而坐" -keyword_note = { "侍坐" = "执弟子之礼, 侍奉老师而坐" } - -["子曰: 以吾一日长乎尔, 毋吾以也. 居则曰: 不吾知也. 如或知尔, 则何以哉?"] -note = [] -content = "子曰/: 以吾一日长乎尔/, 毋吾以也. /居则曰/: 不吾知也. /如或知尔/, 则何以哉?/" -translation = "孔子说: 因为我年纪比你们大一点, 你们不要凭这个原因就不敢说话了. (你们) 平日在家的时候常说: 没有人了解我呀! 如果有人了解你们, 那 (你们) 打算怎么做呢? " -keyword_note = { "以吾一日长乎尔" = "因为我年纪比你们大一点", "毋吾以也" = "宾语前置, 正常的语序是'毋以吾也'", "居则曰" = "平日在家的时候说", "不吾知也" = "宾语前置, 即'不知吾也'", "如或" = "如果有人", "何以" = "用什么 (去实现自己的抱负) " } - -["子路率尔而对曰: 千乘之国, 摄乎大国之间, 加之以师旅, 因之以饥馑; 由也为之, 比及三年, 可使有勇, 且知方也"] -note = [] -content = "子路率尔而对曰/: 千乘之国/, 摄乎大国之间/, 加之以师旅/, 因之以饥馑; /由也为之/, 比及三年/, 可使有勇/, 且知方也/" -translation = "子路不假思索地回答道: 一个拥有千辆兵车的诸侯国, 夹在大国之间, 有 (别国) 军队来侵略它, 接着 (国内) 又遇上饥荒; 如果让我治理这个国家, 等到第三年, 就可以使人人勇敢善战, 而且还懂得道理" -keyword_note = { "率尔" = "不假思索的样子", "千乘之国" = "有一千辆兵车的诸侯国", "摄乎大国之间" = "夹在大国之间", "加之以师旅" = "有军队来攻打它", "因之以饥馑" = "接连下来 (国内) 又有饥荒", "比及" = "等到", "方" = "道, 合乎礼义的行事准则" } - -["夫子哂之"] -note = [] -content = "夫子哂之/" -translation = "孔子听了微微一笑" -keyword_note = { "哂" = "微笑, 这里略带讥讽" } - -["求! 尔何如?"] -note = [] -content = "求/! /尔何如?/" -translation = "冉有, 你怎么样? " -keyword_note = { "尔何如" = "你怎么样" } - -["对曰: 方六七十, 如五六十, 求也为之, 比及三年, 可使足民. 如其礼乐, 以俟君子"] -note = [] -content = "对曰/: 方六七十/, 如五六十/, 求也为之/, 比及三年/, 可使足民. /如其礼乐/, 以俟君子/" -translation = "冉有回答说: 一个纵横六七十里、或者五六十里的地方, 如果让我去治理, 等到三年, 就可以使百姓富足. 至于修明礼乐, 那就只有等待贤人君子了" -keyword_note = { "方" = "见方, 纵横", "如" = "或者", "足民" = "使百姓富足", "如其礼乐" = "至于修明礼乐", "俟" = "等待" } - -["赤! 尔何如?"] -note = [] -content = "赤/! /尔何如?/" -translation = "公西华, 你怎么样? " -keyword_note = {} - -["对曰: 非曰能之, 愿学焉. 宗庙之事, 如会同, 端章甫, 愿为小相焉"] -note = [] -content = "对曰/: 非曰能之/, 愿学焉. /宗庙之事/, 如会同/, 端章甫/, 愿为小相焉/" -translation = "公西华回答说: 我不敢说胜任什么, 但愿意学习做这些. 宗庙祭祀的工作, 或者是诸侯会盟及朝见天子的时候, 我愿意穿戴好礼服礼帽做一个小相" -keyword_note = { "能" = "胜任", "焉" = "这里作指示代词兼语气词, 指代下文'小相'这种工作", "宗庙之事" = "宗庙祭祀的工作", "会同" = "诸侯会盟及朝见天子", "端章甫" = "穿着礼服, 戴着礼帽", "相" = "在祭祀、会盟或朝见天子时主持赞礼和司仪的人" } - -["点! 尔何如?"] -note = [] -content = "点/! /尔何如?/" -translation = "曾皙, 你怎么样? " -keyword_note = {} - -["鼓瑟希, 铿尔, 舍瑟而作, 对曰: 异乎三子者之撰"] -note = [] -content = "鼓瑟希/, 铿尔/, 舍瑟而作/, 对曰/: 异乎三子者之撰/" -translation = " (曾皙) 弹瑟的声音逐渐稀疏了, 接着铿的一声, 他放下瑟直起身子回答说: 我和他们三人的才能不一样" -keyword_note = { "鼓瑟希" = "弹瑟的声音逐渐稀疏了, 希同'稀'", "铿尔" = "铿的一声", "舍瑟而作" = "放下瑟直起身子", "撰" = "才具, 才能" } - -["子曰: 何伤乎? 亦各言其志也"] -note = ['何伤 一作: 何妨'] -content = "子曰/: 何伤乎? /亦各言其志也/" -translation = "孔子说: 有什么妨害呢? 不过是各自谈谈自己的志向" -keyword_note = { "何伤" = "何妨", "亦" = "不过是, 只不过" } - -["曰: 莫春者, 春服既成, 冠者五六人, 童子六七人, 浴乎沂, 风乎舞雩, 咏而归"] -note = ['莫 通: 暮'] -content = "曰/: 莫春者/, 春服既成/, 冠者五六人/, 童子六七人/, 浴乎沂/, 风乎舞雩/, 咏而归/" -translation = "曾皙说: 暮春时节, 春天的衣服已经穿上了. 和几个成年人、几个孩童到沂水里沐浴, 在舞雩台上吹吹风, 一路唱着歌儿回来" -keyword_note = { "莫春" = "暮春, 指农历三月, 莫同'暮'", "春服既成" = "春天的衣服已经穿上了", "冠者" = "成年人", "浴乎沂" = "在沂水里沐浴", "风乎舞雩" = "在舞雩台上吹风", "咏" = "唱歌" } - -["夫子喟然叹曰: 吾与点也!"] -note = [] -content = "夫子喟然叹曰/: 吾与点也!/" -translation = "孔子长叹一声说: 我赞同曾皙的想法呀! " -keyword_note = { "喟然" = "叹息的样子", "与" = "赞成" } - -["三子者出, 曾皙后. 曾皙曰: 夫三子者之言何如?"] -note = [] -content = "三子者出/, 曾皙后. /曾皙曰/: 夫三子者之言何如?/" -translation = "子路、冉有、公西华都出去了, 曾皙最后走. 曾皙问孔子: 他们三个人的话怎么样? " -keyword_note = { "后" = "动词, 后出", "夫三子者之言何如" = "那三个人的话怎么样" } - -["子曰: 亦各言其志也已矣"] -note = [] -content = "子曰/: 亦各言其志也已矣/" -translation = "孔子说: 也不过是各自谈谈自己的志向罢了! " -keyword_note = { "也已矣" = "罢了, 语气词连用" } - -["曰: 夫子何哂由也?"] -note = [] -content = "曰/: 夫子何哂由也?/" -translation = "曾皙说: 您为什么笑仲由呢? " -keyword_note = { "何" = "为什么" } - -["曰: 为国以礼, 其言不让, 是故哂之"] -note = [] -content = "曰/: 为国以礼/, 其言不让/, 是故哂之/" -translation = " (孔子) 说: 治国要用礼, 可是他 (子路) 的话毫不谦逊, 所以我笑他" -keyword_note = { "为国以礼" = "治国要用礼", "让" = "礼让, 谦逊", "是故" = "所以" } - -["唯求则非邦也与?"] -note = [] -content = "唯求则非邦也与?/" -translation = "难道冉有讲的不是国家大事吗? " -keyword_note = { "唯" = "用于句首, 表示语气", "邦" = "国家, 指国家大事", "与" = "同'欤', 疑问语气词" } - -["安见方六七十如五六十而非邦也者?"] -note = [] -content = "安见方六七十如五六十而非邦也者?/" -translation = "怎见得方圆六七十里或者五六十里的地方就不是国家呢? " -keyword_note = { "安见" = "怎见得" } - -["唯赤则非邦也与?"] -note = [] -content = "唯赤则非邦也与?/" -translation = "难道公西华讲的不是诸侯的大事吗? " -keyword_note = {} - -["宗庙会同, 非诸侯而何? 赤也为之小, 孰能为之大?"] -note = [] -content = "宗庙会同/, 非诸侯而何? /赤也为之小/, 孰能为之大?/" -translation = "宗庙祭祀, 诸侯会盟和朝见天子, 不是诸侯的大事又是什么呢? 如果公西华只能给诸侯做一个小相, 那么谁能做大相呢? " -keyword_note = { "宗庙会同" = "宗庙祭祀, 诸侯会盟和朝见天子", "非诸侯而何" = "不是诸侯的大事又是什么呢", "为之小" = "做小相", "为之大" = "做大相" } - -["论语·学而八佾"] -note = [] -content = "论语·学而八佾/" -translation = "论语·学而八佾" -keyword_note = {} - -["君子食无求饱, 居无求安, 敏于事而慎于言, 就有道而正焉, 可谓好学也已."] -note = ['学而篇'] -content = "君子/食/无/求/饱/, 居/无/求/安/, 敏/于/事/而/慎/于/言/, 就/有/道/而/正/焉/, 可/谓/好/学/也/已./" -translation = "君子吃食不追求饱足; 居住不追求安逸; 做事勤奋敏捷, 说话谨慎; 到有道德的人那里去匡正自己, 就可以称得上是好学了" -keyword_note = { "敏" = "勤勉", "就有道而正焉" = "到有道的人那里去匡正自己" } - -["人而不仁, 如礼何? 人而不仁, 如乐何?"] -note = ['八佾篇'] -content = "人/而/不/仁/, 如/礼/何/? 人/而/不/仁/, 如/乐/何?/" -translation = "人如果没有仁爱之心, 那他怎样遵守礼仪制度呢? 人如果没有仁爱之心, 礼乐有什么用呢? " -keyword_note = { "而" = "如果", "如礼何" = "怎样对待礼呢" } - -["朝闻道, 夕死可矣."] -note = ['里仁篇'] -content = "朝/闻/道/, 夕/死/可/矣./" -translation = "早晨能够得知真理, 即使当晚死去, 也没有遗憾" -keyword_note = {} - -["君子喻于义, 小人喻于利."] -note = ['里仁篇'] -content = "君子/喻/于/义/, 小人/喻/于/利./" -translation = "君子通晓的是道义, 小人只通晓利益" -keyword_note = { "喻" = "知晓, 明白" } - -["见贤思齐焉, 见不贤而内自省也."] -note = ['里仁篇'] -content = "见/贤/思/齐/焉/, 见/不/贤/而/内/自/省/也./" -translation = "看见德才兼备的人就向他学习, 希望能向他看齐; 看见不贤的人, 就反省自己有没有和他一样的缺点, 有要改正" -keyword_note = {} - -["质胜文则野, 文胜质则史. 文质彬彬, 然后君子."] -note = ['雍也篇'] -content = "质/胜/文/则/野/, 文/胜/质/则/史/. 文/质/彬/彬/, 然后/君子./" -translation = "质朴胜过了文饰就会粗野, 文饰胜过了质朴就会虚浮不实, 质朴和文饰相杂适中, 然后才可以成为君子" -keyword_note = { "质" = "质朴、朴实", "文" = "华美、文采", "野" = "粗野、鄙俗", "史" = "虚饰, 浮夸", "文质彬彬" = "文质兼备、配合适当的样子" } - -["士不可以不弘毅, 任重而道远. 仁以为己任, 不亦重乎? 死而后已, 不亦远乎?"] -note = ['泰伯篇'] -content = "士/不可/以/不/弘毅/, 任/重/而/道/远/. 仁/以/为/己/任/, 不/亦/重/乎/? 死/而/后/已/, 不/亦/远/乎?/" -translation = "有抱负的人不可不志向远大, 意志坚强, 因为他肩负重大责任, 路途漫长遥远. 以实行仁道为己任, 不是很重大的责任吗? 直到身死才能结束, 不是很漫长遥远的吗? " -keyword_note = { "弘毅" = "志向远大, 意志坚强", "弘" = "广、大, 这里指志向远大" } - -["譬如为山, 未成一篑, 止, 吾止也. 譬如平地, 虽覆一篑, 进, 吾往也."] -note = ['子罕篇'] -content = "譬如/为/山/, 未/成/一/篑/, 止/, 吾/止/也/. 譬如/平/地/, 虽/覆/一/篑/, 进/, 吾/往/也./" -translation = "比如用土堆山, 只差一筐土就完成了, 这时停止, 那是我自己要停下来; 比如填平洼地, 虽然只倒下一筐, 但我也在前进" -keyword_note = { "未成一篑" = "只差一筐土没有成功", "篑" = "盛土的竹筐", "平地" = "填平洼地" } - -["知者不惑, 仁者不忧, 勇者不惧."] -note = ['子罕篇'] -content = "知/者/不/惑/, 仁/者/不/忧/, 勇/者/不/惧./" -translation = "有智慧的人不会迷惑, 有仁德的人不会忧愁, 勇敢的人不会害怕" -keyword_note = { "知" = "同'智'" } - -["克己复礼为仁. 一日克己复礼, 天下归仁焉. 为仁由己, 而由人乎哉?"] -note = ['颜渊篇'] -content = "克/己/复/礼/为/仁/. 一/日/克/己/复/礼/, 天下/归/仁/焉/. 为/仁/由/己/, 而/由/人/乎/哉?/" -translation = "约束自己, 使自己的行为归到礼的方面去就是仁. 一旦约束自己, 使自己的行为归到礼的方面去, 天下人就会称赞你是个仁人了. 实行仁德, 完全在于自己, 难道还在于别人吗? " -keyword_note = { "克己复礼" = "约束自我, 使言行归复于先王之礼", "一日" = "一旦", "归" = "称赞, 称许" } - -["非礼勿视, 非礼勿听, 非礼勿言, 非礼勿动."] -note = ['颜渊篇'] -content = "非/礼/勿/视/, 非/礼/勿/听/, 非/礼/勿/言/, 非/礼/勿/动./" -translation = "不合于礼的不要看, 不合于礼的不要听, 不合于礼的不要说, 不合于礼的不要做" -keyword_note = {} - -["有一言而可以终身行之者乎?"] -note = ['卫灵公篇'] -content = "有/一/言/而/可/以/终身/行/之/者/乎?/" -translation = "有没有一个字可以终身奉行的呢? " -keyword_note = { "一言" = "一个字" } - -["其'恕'乎! 己所不欲, 勿施于人."] -note = ['卫灵公篇'] -content = "其/'恕'/乎! 己/所/不/欲/, 勿/施/于/人./" -translation = "那大概就是'恕'吧! 自己不喜欢的事物, 不要强加于别人身上" -keyword_note = {} - -["小子何莫学夫《诗》? 《诗》可以兴, 可以观, 可以群, 可以怨. 迩之事父, 远之事君. 多识于鸟兽草木之名."] -note = ['阳货篇'] -content = "小子/何/莫/学/夫/《诗》/? 《诗》/可/以/兴/, 可/以/观/, 可/以/群/, 可/以/怨/. 迩/之/事/父/, 远/之/事/君/. 多/识/于/鸟/兽/草/木/之/名./" -translation = "学生们为什么没有人学《诗经》呢? 《诗经》可以使人受到感染, 得到启发和鼓舞; 可以观察人情风俗的盛衰, 认识社会现实; 可以通过情感交流, 彼此感染,和谐相处; 可以抒发心中不平, 讽刺不良政治. 近则可以用其中的道理来侍奉父母; 远可以用来侍奉君主, 还可以多认识鸟兽草木的名称" -keyword_note = { "小子" = "老师对学生的称呼", "夫" = "那", "兴" = "指激发人的感情", "观" = "指观察政治的得失、风俗的盛衰", "群" = "指提高人际交往能力", "怨" = "指讽刺时政", "迩" = "近" } - -["谏太宗十思疏"] -note = [] -content = "谏太宗十思疏/" -translation = "谏太宗十思疏" -keyword_note = {} - -["臣闻求木之长者, 必固其根本; 欲流之远者, 必浚其泉源; 思国之安者, 必积其德义."] -note = [] -content = "臣闻/求木之/长者/, 必固/其根本; /欲流之/远者/, 必浚/其泉源; /思国之/安者/, 必积/其德义./" -translation = "我听说想要树木长得好, 一定要使它的根牢固; 想要泉水流得远, 一定要疏通它的源泉; 想要国家安定, 一定要厚积道德仁义" -keyword_note = { "长(zhǎng)" = "生长, 这里指长得好", "固" = "使……牢固", "根本" = "树根", "浚(jùn)" = "疏通, 挖深", "德义" = "道德仁义" } - -["源不深而望流之远, 根不固而求木之长, 德不厚而思国之理, 臣虽下愚, 知其不可, 而况于明哲乎!"] -note = ['思国之理 一作: 思国之治'] -content = "源不深/而望/流之远/, 根不固/而求/木之长/, 德不厚/而思/国之理/, 臣虽/下愚/, 知其/不可/, 而况于/明哲乎!/" -translation = "源泉不深却希望泉水流得远, 根系不牢固却想要树木生长得高, 道德不深厚却想要国家安定, 微臣虽然愚笨, (也) 知道这是不可能的, 更何况 (您这) 聪明睿智 (的人) 呢! " -keyword_note = { "下愚" = "处于地位低见识浅的人", "明哲" = "聪明睿智的人", "国之理" = "国家治理, 太平" } - -["人君当神器之重, 居域中之大, 将崇极天之峻, 永保无疆之休."] -note = [] -content = "人君/当/神器之重/, 居/域中之大/, 将崇/极天之峻/, 永保/无疆之休./" -translation = "国君掌握帝位的重权, 在天地间尊大, 就要推崇皇权的高峻, 永保永无止境的美善" -keyword_note = { "神器" = "帝位", "域中" = "天地之间", "休" = "美, 这里指政权的平和美好" } - -["不念居安思危, 戒奢以俭, 德不处其厚, 情不胜其欲, 斯亦伐根以求木茂, 塞源而欲流长者也."] -note = ['塞源而欲流长者也 一作: 塞源而欲流长也'] -content = "不念/居安思危/, 戒奢/以俭/, 德不处/其厚/, 情不胜/其欲/, 斯亦/伐根/以求/木茂/, 塞源/而欲/流长者也./" -translation = "如果不在安逸的环境中想着危难, 戒奢侈而行节俭, 道德不能保持宽厚, 性情不能克服欲望, 这也如同挖断树根却想要树木长得茂盛, 堵塞源泉却想要泉水流得远一样啊! " -keyword_note = { "居安思危" = "在安逸时想到危难", "戒奢以俭" = "戒除奢侈而行节俭", "伐" = "砍伐", "塞" = "堵塞" } - -["凡百元首, 承天景命, 莫不殷忧而道著, 功成而德衰."] -note = ['凡百 一作: 凡昔'] -content = "凡百/元首/, 承天/景命/, 莫不/殷忧/而道著/, 功成/而德衰./" -translation = " (古代) 所有的帝王, 承受了上天赋予的重大使命, 他们没有一个不为国家深切地忧虑而且治理成效显著的, 但一旦功业建成就德性衰减" -keyword_note = { "凡百" = "所有的", "元首" = "帝王", "景命" = "大命, 重大使命", "殷忧" = "深忧" } - -["有善始者实繁, 能克终者盖寡."] -note = [] -content = "有/善始者/实繁/, 能/克终者/盖寡./" -translation = "国君开头做得好的实在很多, 能够坚持到底的大概很少" -keyword_note = { "善始" = "开头做得好", "克终" = "能够坚持到底", "盖" = "大概, 表推测语气" } - -["岂取之易而守之难乎? 昔取之而有余, 今守之而不足, 何也?"] -note = [] -content = "岂/取之易/而守之难乎? /昔/取之/而有余/, 今/守之/而不足/, 何也?/" -translation = "难道是取得天下容易守住天下困难吗? 过去夺取天下时力量有余, 现在守卫天下却力量不足, 这是为什么呢? " -keyword_note = { "取" = "取得天下", "守" = "守卫天下" } - -["夫在殷忧, 必竭诚以待下; 既得志, 则纵情以傲物."] -note = [] -content = "夫/在殷忧/, 必/竭诚/以待下; /既得志/, 则/纵情/以傲物./" -translation = "因为处在深重的忧虑之中, 一定能竭尽诚心来对待臣民. 成功之后, 就放纵自己的性情来傲视别人" -keyword_note = { "竭诚" = "竭尽诚心", "待下" = "对待臣下", "纵情" = "放纵情感", "傲物" = "傲视别人" } - -["竭诚则胡越为一体, 傲物则骨肉为行路."] -note = ['胡越 一作: 吴越'] -content = "竭诚/则/胡越/为一体/, 傲物/则/骨肉/为行路./" -translation = "竭尽诚心, 胡越之人也将同心同德; 傲视别人, 至亲骨肉也会成为不相干的路人" -keyword_note = { "胡越" = "胡地在北, 越地在南, 比喻相隔遥远", "骨肉" = "指父母兄弟子女", "行路" = "路人, 比喻毫无关系的人" } - -["虽董之以严刑, 振之以威怒, 终苟免而不怀仁, 貌恭而不心服."] -note = [] -content = "虽/董之/以严刑/, 振之/以威怒/, 终/苟免/而不怀仁/, 貌恭/而不心服./" -translation = "即使用严酷的刑罚来督责 (人们) , 用威风怒气来吓唬 (人们) , 人们最终只求苟且免于刑罚而不怀念感激国君的仁德, 表面上恭敬但在心里不服气" -keyword_note = { "董" = "督责", "振" = "通'震', 震慑", "苟免" = "苟且免于刑罚", "怀仁" = "怀念仁德" } - -["怨不在大, 可畏惟人; 载舟覆舟, 所宜深慎; 奔车朽索, 其可忽乎!"] -note = [] -content = "怨/不在大/, 可畏/惟人; /载舟/覆舟/, 所宜/深慎; /奔车/朽索/, 其可/忽乎!/" -translation = " (臣民) 对国君的怨恨不在大小, 可怕的只是百姓的力量; (他们像水一样) 能够负载船只, 也能颠覆船只, 这是应当深切戒慎的. 用腐烂的绳索驾驭疾驰的马车, 这样可以忽视不理吗? " -keyword_note = { "惟人" = "只是百姓 (因避讳写作'人') ", "载舟覆舟" = "比喻百姓能拥戴皇帝, 也能推翻他的统治", "奔车朽索" = "用腐烂的绳索驾驭疾驰的马车" } - -["君人者, 诚能见可欲则思知足以自戒, 将有作则思知止以安人, 念高危则思谦冲而自牧, 惧满溢则思江海下百川, 乐盘游则思三驱以为度, 忧懈怠则思慎始而敬终, 虑壅蔽则思虚心以纳下, 想谗邪则思正身以黜恶, 恩所加则思无因喜以谬赏, 罚所及则思无因怒而滥刑."] -note = ['想谗邪 一作: 惧谗邪'] -content = "君人者/, 诚能/见可欲/则思/知足/以自戒/, 将有作/则思/知止/以安人/, 念高危/则思/谦冲/而自牧/, 惧满溢/则思/江海/下百川/, 乐盘游/则思/三驱/以为度/, 忧懈怠/则思/慎始/而敬终/, 虑壅蔽/则思/虚心/以纳下/, 想谗邪/则思/正身/以黜恶/, 恩所加/则思/无因喜/以谬赏/, 罚所及/则思/无因怒/而滥刑./" -translation = "统治天下的人, 如果真的能够做到一见到能引起 (自己) 喜好的东西就要想到用知足来自我克制, 将要兴建什么就要想到适可而止来使百姓安定, 想到 (君位) 高而险, 就要不忘谦虚, 加强自身的道德修养. 害怕骄傲自满, 就要像江海居于百川之下 (而能容纳百川) , 喜爱狩猎就想到网三面留一面, 担心意志松懈就想到 (做事) 要慎始慎终, 担心 (言路) 不通受蒙蔽就想到虚心采纳臣下的意见, 考虑到 (朝中可能会出现) 谗佞奸邪就想到使自身端正 (才能) 罢黜奸邪, 施加恩泽就要考虑到不要因为一时高兴而奖赏不当, 动用刑罚就要想到不要因为一时发怒而滥用刑罚" -keyword_note = { "见可欲" = "见到能引起喜好的东西", "有作" = "兴建建筑物", "知止" = "知道适可而止", "谦冲" = "谦虚", "自牧" = "自我修养", "下百川" = "居于百川之下", "三驱" = "一年打猎三次为度", "慎始敬终" = "谨慎开始谨慎结束", "壅蔽" = "堵塞蒙蔽", "谗邪" = "谗佞奸邪", "黜恶" = "罢黜奸恶", "谬赏" = "错误奖赏", "滥刑" = "滥用刑罚" } - -["总此十思, 弘兹九德, 简能而任之, 择善而从之, 则智者尽其谋, 勇者竭其力, 仁者播其惠, 信者效其忠."] -note = ['弘兹 一作: 宏兹'] -content = "总/此十思/, 弘兹/九德/, 简能/而任之/, 择善/而从之/, 则/智者/尽其谋/, 勇者/竭其力/, 仁者/播其惠/, 信者/效其忠./" -translation = "全面做到这十件应该深思的事, 弘扬这九种美德, 选拔有才能的人而任用他, 挑选好的意见而听从它. 那么有智慧的人就能充分献出他的谋略, 勇敢的人就能完全使出他的力量, 仁爱的人就能散播他的恩惠, 诚信的人就能献出他的忠诚" -keyword_note = { "弘兹" = "弘扬这", "九德" = "九种美德", "简能" = "选拔有才能的人", "择善" = "挑选好的意见", "效" = "献出" } - -["文武争驰, 在君无事, 可以尽豫游之乐, 可以养松乔之寿, 鸣琴垂拱, 不言而化."] -note = ['在君 一作: 君臣'] -content = "文武/争驰/, 在君/无事/, 可以/尽/豫游之乐/, 可以/养/松乔之寿/, 鸣琴/垂拱/, 不言/而化./" -translation = "文臣武将争先恐后前来效力, 国君没有大事烦扰, 可以尽情享受出游的快乐, 可以颐养得像赤松子与王子乔那样长寿, 皇上弹着琴垂衣拱手就能治理好天下, 不用再说什么, 天下人就已经都有教化了" -keyword_note = { "争驰" = "争先效力", "豫游" = "出游", "松乔" = "赤松子和王子乔, 古代传说中的仙人", "垂拱" = "垂衣拱手, 比喻轻易治理天下", "化" = "教化" } - -["何必劳神苦思, 代下司职, 役聪明之耳目, 亏无为之大道哉!"] -note = [] -content = "何必/劳神/苦思/, 代下/司职/, 役/聪明/之耳目/, 亏/无为/之大道哉!/" -translation = "为什么一定要 (自己) 劳神费思, 代替臣下管理职事, 役使自己灵敏、明亮的耳、眼, 减损顺其自然就能治理好天下的大道理呢! " -keyword_note = { "代下司职" = "代替臣下管理职事", "役" = "役使", "亏" = "减损", "无为" = "道家主张清静虚无, 顺其自然" } - -["贺新郎·国脉微如缕"] -note = [] -content = "贺新郎·国脉微如缕/" -translation = "贺新郎·国脉微如缕" -keyword_note = {} - -["国脉微如缕"] -note = ["词人以'如缕'比喻国家命脉衰微脆弱, 形势危急"] -content = "国脉/微/如缕/" -translation = "国家的命脉已经衰微得像一根细丝" -keyword_note = { "国脉" = "国家的命脉", "微" = "衰微", "如缕" = "像丝线一样, 形容脆弱" } - -["问长缨何时入手, 缚将戎主?"] -note = ['表达作者渴望投身军旅、为国擒敌的迫切心情'] -content = "问/长缨/何时/入手/, 缚将/戎主?/" -translation = "试问, 捆敌的长绳何时才能到我手中, 将敌酋捆绑擒来? " -keyword_note = { "长缨" = "长带子, 喻指擒敌的武器", "缚将" = "捆绑", "戎主" = "敌人的首领" } - -["未必人间无好汉, 谁与宽些尺度?"] -note = ['批判当时用人制度僵化, 呼吁不拘一格降人才'] -content = "未必/人间/无/好汉/, 谁与/宽些/尺度?/" -translation = "人世间未必没有英雄好汉, 只是谁能放宽用人的标准呢? " -keyword_note = { "好汉" = "英雄豪杰", "尺度" = "标准, 这里指用人标准" } - -["试看取当年韩五"] -note = ['韩世忠虽出身行伍却成为抗金名将, 说明人才不一定需要名师传授'] -content = "试看取/当年/韩五/" -translation = "试看当年的韩世忠将军" -keyword_note = { "韩五" = "南宋抗金名将韩世忠, 排行第五" } - -["岂有谷城公付授, 也不干曾遇骊山母"] -note = ['用典说明韩世忠的成功并非依靠神仙指点或名师传授'] -content = "岂有/谷城公/付授/, 也不干/曾遇/骊山母/" -translation = "他既没有得到谷城公的传授, 也不曾遇见骊山老母" -keyword_note = { "谷城公" = "即黄石公, 传说曾向张良传授兵书", "骊山母" = "道教女仙, 传说曾向李筌讲解《阴符》" } - -["谈笑起, 两河路"] -note = ['形容韩世忠指挥若定, 在河北地区大败金兵'] -content = "谈笑起/, 两河路/" -translation = "却在谈笑间指挥大军, 收复河北失地" -keyword_note = { "两河路" = "指宋代河北东路和河北西路, 即今河北、山西、河南部分地区" } - -["少时棋柝曾联句"] -note = ['回忆作者年轻时在军中的生活经历'] -content = "少时/棋柝/曾/联句/" -translation = "年轻时曾在军营中一边下棋一边联句作诗" -keyword_note = { "棋柝" = "下棋和打更", "联句" = "多人合作写诗, 每人一句或几句" } - -["叹而今登楼揽镜, 事机频误"] -note = ['抒发作者年老力衰、壮志未酬的感慨'] -content = "叹/而今/登楼/揽镜/, 事机/频误/" -translation = "可叹如今登楼远望、揽镜自照, 已力不从心, 多次错过了报国机会" -keyword_note = { "登楼揽镜" = "上楼照镜, 慨叹功业未建人已衰老", "事机" = "机会, 指从军报国的机会" } - -["闻说北风吹面急, 边上冲梯屡舞"] -note = ['描绘边境危急, 蒙古军攻势凶猛'] -content = "闻说/北风/吹面/急/, 边上/冲梯/屡舞/" -translation = "听说北风凛冽 (暗示蒙古军南侵) , 边境上敌军攻城的冲车云梯不断飞舞" -keyword_note = { "北风" = "暗指北来的蒙古兵", "冲梯" = "冲车和云梯, 古代攻城器具" } - -["君莫道投鞭虚语"] -note = ['警告不要轻视敌军实力, 用苻坚投鞭断流的典故'] -content = "君/莫道/投鞭/虚语/" -translation = "你不要认为'投鞭断流'只是空话 (喻敌军强大) " -keyword_note = { "投鞭" = "前秦苻坚曾说投鞭长江可断流, 形容兵多将广" } - -["自古一贤能制难, 有金汤便可无张许?"] -note = ['反问强调贤才比坚固城池更重要'] -content = "自古/一贤/能/制难/, 有/金汤/便可/无/张许?/" -translation = "自古以来, 一位贤才就能解除危难, 难道有了坚固城池就可以没有张巡、许远这样的良将吗? " -keyword_note = { "制难" = "解除危难", "金汤" = "金城汤池, 比喻坚固的防御工事", "张许" = "张巡和许远, 唐代安史之乱中死守睢阳的名将" } - -["快投笔, 莫题柱"] -note = ['呼吁文人弃文从武, 为国效力'] -content = "快/投笔/, 莫/题柱/" -translation = "赶快像班超那样投笔从戎, 不要像司马相如那样只追求功名利禄" -keyword_note = { "投笔" = "投笔从戎, 用汉代班超典故", "题柱" = "用司马相如题桥柱追求功名的典故" } - -["赤壁赋"] -note = [] -content = "赤壁赋/" -translation = "赤壁赋" -keyword_note = {} - -["壬戌之秋, 七月既望, 苏子与客泛舟游于赤壁之下"] -note = [] -content = "壬戌/之秋/, 七月/既望/, 苏子/与客/泛舟/游于/赤壁/之下/" -translation = "壬戌年秋天, 七月十六日, 我与友人在赤壁下泛舟游玩" -keyword_note = { "壬戌" = "宋神宗元丰五年 (1082) ", "既望" = "农历十六日 (望指十五日) " } - -["清风徐来, 水波不兴"] -note = [] -content = "清风/徐来/, 水波/不兴/" -translation = "清风阵阵拂来, 水面波澜不起" -keyword_note = { "徐" = "舒缓地", "兴" = "起, 作" } - -["举酒属客, 诵明月之诗, 歌窈窕之章"] -note = [] -content = "举酒/属客/, 诵/明月/之诗/, 歌/窈窕/之章/" -translation = "举起酒杯向同伴劝酒, 吟诵《明月》中'窈窕'这一章" -keyword_note = { "属" = "通'嘱', 劝请", "窈窕之章" = "指《诗经·陈风·月出》篇" } - -["少焉, 月出于东山之上, 徘徊于斗牛之间"] -note = [] -content = "少焉/, 月出/于/东山/之上/, 徘徊/于/斗牛/之间/" -translation = "不一会儿, 明月从东山后升起, 在斗宿与牛宿之间来回移动" -keyword_note = { "少焉" = "一会儿", "斗牛" = "斗宿和牛宿, 星宿名" } - -["白露横江, 水光接天"] -note = [] -content = "白露/横江/, 水光/接天/" -translation = "月光下, 白茫茫的雾气笼罩江面, 天光、水色连成一片" -keyword_note = { "白露" = "白茫茫的水汽", "横" = "笼罩, 横贯" } - -["纵一苇之所如, 凌万顷之茫然"] -note = [] -content = "纵/一苇/之所如/, 凌/万顷/之茫然/" -translation = "任凭一片苇叶似的小船随意漂浮, 越过浩瀚无垠的江面" -keyword_note = { "一苇" = "像一片苇叶的小船", "凌" = "越过", "万顷" = "形容江面宽广" } - -["浩浩乎如冯虚御风, 而不知其所止"] -note = [] -content = "浩浩乎/如/冯虚/御风/, 而/不知/其所止/" -translation = "浩浩淼淼 (像长出羽翼一样) 驾风凌空飞行, 并不知道到哪里才会停栖" -keyword_note = { "冯虚" = "同'凭虚', 凌空", "御风" = "驾风" } - -["飘飘乎如遗世独立, 羽化而登仙"] -note = [] -content = "飘飘乎/如/遗世/独立/, 羽化/而/登仙/" -translation = "飘飘摇摇好像要离开尘世飘飞而起, 羽化成仙进入仙境" -keyword_note = { "遗世" = "超脱尘世", "羽化" = "道教称成仙为羽化" } - -["于是饮酒乐甚, 扣舷而歌之"] -note = [] -content = "于是/饮酒/乐甚/, 扣舷/而歌之/" -translation = "在这时喝酒喝得非常高兴, 打着节拍唱起歌来" -keyword_note = { "扣舷" = "敲打船边, 打节拍" } - -["歌曰: '桂棹兮兰桨, 击空明兮溯流光'"] -note = [] -content = "歌曰/: '桂棹/兮/兰桨/, 击/空明/兮/溯/流光'/" -translation = "歌中唱到: '桂木船棹啊香兰船桨, 击打着月光下的清波, 在泛着月光的水面逆流而上'" -keyword_note = { "空明" = "月光下的清澈江水", "溯" = "逆流而上", "流光" = "月光浮动的水面" } - -["渺渺兮予怀, 望美人兮天一方"] -note = [] -content = "渺渺兮/予怀/, 望/美人/兮/天一方/" -translation = "我的情思啊悠远茫茫, 眺望美人 (君主) 啊, 却在天的另一方" -keyword_note = { "渺渺" = "悠远的样子", "美人" = "指内心思慕的人, 常喻君主" } - -["客有吹洞箫者, 倚歌而和之"] -note = [] -content = "客有/吹洞箫/者/, 倚歌/而和之/" -translation = "有会吹洞箫的客人, 配着节奏为歌声伴和" -keyword_note = { "倚歌" = "随着歌声", "和" = "应和" } - -["其声呜呜然, 如怨如慕, 如泣如诉"] -note = [] -content = "其声/呜呜然/, 如怨/如慕/, 如泣/如诉/" -translation = "洞箫的声音呜呜咽咽: 有如哀怨有如思慕, 既像啜泣也像倾诉" -keyword_note = { "慕" = "思慕, 眷恋" } - -["余音袅袅, 不绝如缕"] -note = [] -content = "余音/袅袅/, 不绝/如缕/" -translation = "余音在江上回荡, 像细丝一样连续不断" -keyword_note = { "袅袅" = "声音婉转悠长", "缕" = "细丝" } - -["舞幽壑之潜蛟, 泣孤舟之嫠妇"] -note = [] -content = "舞/幽壑/之潜蛟/, 泣/孤舟/之嫠妇/" -translation = "能使深谷中的蛟龙为之起舞, 能使孤舟上的寡妇为之饮泣" -keyword_note = { "幽壑" = "深谷", "嫠妇" = "寡妇" } - -["苏子愀然, 正襟危坐而问客曰"] -note = [] -content = "苏子/愀然/, 正襟/危坐/而问/客曰/" -translation = "我的神色也愁惨起来, 整好衣襟坐端正, 向客人问道" -keyword_note = { "愀然" = "容色改变的样子", "正襟危坐" = "整理衣襟, 端正坐着" } - -["何为其然也?"] -note = [] -content = "何为/其然也?/" -translation = "'箫声为什么这样哀怨呢? '" -keyword_note = { "然" = "这样" } - -["客曰: '月明星稀, 乌鹊南飞', 此非曹孟德之诗乎?"] -note = [] -content = "客曰/: '月明/星稀/, 乌鹊/南飞/', 此非/曹孟德/之诗乎?/" -translation = "客人回答: '月明星稀, 乌鹊南飞, 这不是曹公孟德的诗么? '" -keyword_note = { "曹孟德" = "曹操, 字孟德" } - -["西望夏口, 东望武昌, 山川相缪, 郁乎苍苍"] -note = [] -content = "西望/夏口/, 东望/武昌/, 山川/相缪/, 郁乎/苍苍/" -translation = "这里向西可以望到夏口, 向东可以望到武昌, 山河接壤连绵不绝, 目力所及, 一片郁郁苍苍" -keyword_note = { "相缪" = "相互盘绕", "郁乎苍苍" = "树木茂密苍翠" } - -["此非孟德之困于周郎者乎?"] -note = [] -content = "此非/孟德/之困于/周郎/者乎?/" -translation = "这不正是曹孟德被周瑜所围困的地方么? " -keyword_note = { "周郎" = "周瑜" } - -["方其破荆州, 下江陵, 顺流而东也"] -note = [] -content = "方其/破/荆州/, 下/江陵/, 顺流/而东也/" -translation = "当初他攻陷荆州, 夺得江陵, 沿长江顺流东下" -keyword_note = { "破" = "攻破", "下" = "攻下" } - -["舳舻千里, 旌旗蔽空"] -note = [] -content = "舳舻/千里/, 旌旗/蔽空/" -translation = "麾下的战船首尾相连延绵千里, 旗子将天空全都蔽住" -keyword_note = { "舳舻" = "战船首尾相接" } - -["酾酒临江, 横槊赋诗"] -note = [] -content = "酾酒/临江/, 横槊/赋诗/" -translation = "面对大江斟酒, 横执长矛吟诗" -keyword_note = { "酾酒" = "斟酒", "横槊" = "横执长矛" } - -["固一世之雄也, 而今安在哉?"] -note = [] -content = "固/一世/之雄也/, 而今/安在哉?/" -translation = "本来是当世的一位英雄人物, 然而现在又在哪里呢? " -keyword_note = { "固" = "本来", "安在" = "在哪里" } - -["况吾与子渔樵于江渚之上, 侣鱼虾而友麋鹿"] -note = [] -content = "况/吾与子/渔樵/于/江渚/之上/, 侣/鱼虾/而友/麋鹿/" -translation = "何况我与你在江中的小洲打渔砍柴, 以鱼虾为侣, 以麋鹿为友" -keyword_note = { "渔樵" = "打渔砍柴", "侣" = "以...为伴侣", "友" = "以...为朋友" } - -["驾一叶之扁舟, 举匏樽以相属"] -note = [] -content = "驾/一叶/之扁舟/, 举/匏樽/以相属/" -translation = "在江上驾着这一叶小舟, 举起杯盏相互敬酒" -keyword_note = { "扁舟" = "小舟", "匏樽" = "用葫芦做的酒器" } - -["寄蜉蝣于天地, 渺沧海之一粟"] -note = [] -content = "寄/蜉蝣/于天地/, 渺/沧海/之一粟/" -translation = "如同蜉蝣置身于广阔的天地中, 像沧海中的一粒粟米那样渺小" -keyword_note = { "蜉蝣" = "一种生命短暂的昆虫", "粟" = "米粒" } - -["哀吾生之须臾, 羡长江之无穷"] -note = [] -content = "哀/吾生/之须臾/, 羡/长江/之无穷/" -translation = "哀叹我们的一生只是短暂的片刻, 不由羡慕长江的没有穷尽" -keyword_note = { "须臾" = "片刻", "无穷" = "没有穷尽" } - -["挟飞仙以遨游, 抱明月而长终"] -note = [] -content = "挟/飞仙/以遨游/, 抱/明月/而长终/" -translation = "想要携同仙人携手遨游各地, 与明月相拥而永存世间" -keyword_note = { "挟" = "携同", "长终" = "永远存在" } - -["知不可乎骤得, 托遗响于悲风"] -note = [] -content = "知/不可乎/骤得/, 托/遗响/于悲风/" -translation = "知道上面这些想法不能一下子实现, 只得将憾恨化为箫音, 托寄在悲凉的秋风中罢了" -keyword_note = { "骤得" = "一下子得到", "遗响" = "余音, 指箫声" } - -["苏子曰: '客亦知夫水与月乎?"] -note = [] -content = "苏子/曰/: '客/亦知/夫/水与月/乎?/" -translation = "我问道: '你可也知道这水与月? '" -keyword_note = { "夫" = "那" } - -["逝者如斯, 而未尝往也"] -note = [] -content = "逝者/如斯/, 而/未尝/往也/" -translation = "江水总是不停的流逝, 但它们并没有流走" -keyword_note = { "逝者如斯" = "语出《论语》, 流逝的就像这样", "往" = "流失" } - -["盈虚者如彼, 而卒莫消长也"] -note = [] -content = "盈虚者/如彼/, 而/卒莫/消长也/" -translation = "月亮总是那样有圆有缺, 但它终究也没有增减" -keyword_note = { "盈虚" = "圆缺", "卒" = "最终", "消长" = "增减" } - -["盖将自其变者而观之, 则天地曾不能以一瞬"] -note = [] -content = "盖将/自其/变者/而观之/, 则/天地/曾不能/以一瞬/" -translation = "可见, 从事物易变的一面看来, 天地间万事万物时刻在变动, 连一眨眼的工夫都不停止" -keyword_note = { "曾" = "甚至", "一瞬" = "一眨眼" } - -["自其不变者而观之, 则物与我皆无尽也"] -note = [] -content = "自其/不变者/而观之/, 则/物与我/皆无尽也/" -translation = "而从事物不变的一面看来, 万物同我们来说都是永恒的" -keyword_note = { "无尽" = "没有穷尽" } - -["而又何羡乎!"] -note = [] -content = "而又/何羡乎!/" -translation = "又有什么可羡慕的呢? " -keyword_note = { "何羡" = "羡慕什么" } - -["且夫天地之间, 物各有主"] -note = [] -content = "且夫/天地/之间/, 物/各有主/" -translation = "何况天地之间, 万物各有主宰者" -keyword_note = { "且夫" = "况且", "各有主" = "各有主宰" } - -["苟非吾之所有, 虽一毫而莫取"] -note = [] -content = "苟/非吾之/所有/, 虽/一毫/而莫取/" -translation = "若不是自己应该拥有的, 即使一分一毫也不能求取" -keyword_note = { "苟" = "如果", "一毫" = "一丝一毫" } - -["惟江上之清风, 与山间之明月"] -note = [] -content = "惟/江上/之清风/, 与/山间/之明月/" -translation = "只有江上的清风, 以及山间的明月" -keyword_note = { "惟" = "只有" } - -["耳得之而为声, 目遇之而成色"] -note = [] -content = "耳得之/而为声/, 目遇之/而成色/" -translation = "听到便成了声音, 进入眼帘便绘出形色" -keyword_note = { "得" = "听到", "遇" = "看到" } - -["取之无禁, 用之不竭"] -note = [] -content = "取之/无禁/, 用之/不竭/" -translation = "取得这些不会有人禁止, 感受这些也不会有竭尽的忧虑" -keyword_note = { "无禁" = "没有禁止", "不竭" = "不会枯竭" } - -["是造物者之无尽藏也, 而吾与子之所共适"] -note = [] -content = "是/造物者/之无尽藏也/, 而/吾与子/之所共适/" -translation = "这是大自然恩赐的没有穷尽的宝藏, 我和你可以共同享受" -keyword_note = { "造物者" = "大自然", "无尽藏" = "无穷无尽的宝藏", "共适" = "共同享受" } - -["客喜而笑, 洗盏更酌"] -note = [] -content = "客/喜而笑/, 洗盏/更酌/" -translation = "客人高兴地笑了, 洗净酒杯重新饮酒" -keyword_note = { "更酌" = "重新斟酒" } - -["肴核既尽, 杯盘狼籍"] -note = [] -content = "肴核/既尽/, 杯盘/狼籍/" -translation = "菜肴果品都已吃完, 杯子盘子杂乱一片" -keyword_note = { "肴核" = "菜肴和果品", "狼籍" = "凌乱的样子" } - -["相与枕藉乎舟中, 不知东方之既白"] -note = [] -content = "相与/枕藉/乎/舟中/, 不知/东方/之既白/" -translation = "大家互相枕着垫着睡在船上, 不知不觉东方已经露出白色的曙光" -keyword_note = { "枕藉" = "相互枕着躺着", "既白" = "已经天亮" } - -["过秦论"] -note = [] -content = "过秦论/" -translation = "过秦论" -keyword_note = {} - -["秦孝公据崤函之固, 拥雍州之地,"] -note = [] -content = "秦孝公/据/崤函/之固/, 拥/雍州/之地,/" -translation = "秦孝公占据着崤山和函谷关的险固地势,拥有雍州的土地," -keyword_note = { "据" = "占据", "崤函" = "崤山和函谷关", "雍州" = "古代九州之一" } - -["君臣固守以窥周室,"] -note = [] -content = "君臣/固守/以窥/周室,/" -translation = "君臣牢固地守卫着,借以窥视周王室的权力," -keyword_note = { "窥" = "窥视" } - -["有席卷天下, 包举宇内, 囊括四海之意, 并吞八荒之心."] -note = [] -content = "有/席卷/天下/, 包举/宇内/, 囊括/四海/之意/, 并吞/八荒/之心./" -translation = "有席卷天下,包办天宇之间,囊括四海的意图,并统天下的雄心。" -keyword_note = { "席卷" = "像卷席子一样全部卷进去", "包举" = "像打包一样全部拿走", "囊括" = "像装口袋一样全部装进去", "八荒" = "八方荒远之地" } - -["当是时也, 商君佐之,"] -note = [] -content = "当是时也/, 商君/佐之,/" -translation = "正当这时,商鞅辅佐他," -keyword_note = { "商君" = "商鞅" } - -["内立法度, 务耕织, 修守战之具,"] -note = [] -content = "内/立法度/, 务/耕织/, 修/守战/之具,/" -translation = "对内建立法规制度,从事耕作纺织,修造防守和进攻的器械;" -keyword_note = { "法度" = "法规制度", "务" = "从事", "耕织" = "耕作纺织", "守战之具" = "防守和进攻的器械" } - -["外连衡而斗诸侯."] -note = [] -content = "外/连衡/而斗/诸侯./" -translation = "对外实行连衡策略,使诸侯自相争斗。" -keyword_note = { "连衡" = "连横策略", "斗" = "使...相斗" } - -["于是秦人拱手而取西河之外."] -note = [] -content = "于是/秦人/拱手/而取/西河/之外./" -translation = "因此,秦人轻而易举地夺取了黄河以西的土地。" -keyword_note = { "拱手" = "两手相合,形容毫不费力", "西河" = "黄河以西地区" } - -["孝公既没, 惠文、武、昭襄蒙故业, 因遗策,"] -note = [] -content = "孝公/既没/, 惠文/、武/、昭襄/蒙/故业/, 因/遗策,/" -translation = "秦孝公死了以后,惠文王、武王、昭襄王承继先前的基业,沿袭前代的策略," -keyword_note = { "既没" = "死后", "蒙" = "承继", "故业" = "先前的基业", "因" = "沿袭", "遗策" = "前代的策略" } - -["南取汉中, 西举巴、蜀, 东割膏腴之地, 北收要害之郡."] -note = [] -content = "南取/汉中/, 西举/巴/、蜀/, 东割/膏腴/之地/, 北收/要害/之郡./" -translation = "向南夺取汉中,向西攻取巴、蜀,向东割取肥沃的地区,向北占领非常重要的地区。" -keyword_note = { "膏腴" = "肥沃", "要害" = "非常重要" } - -["诸侯恐惧, 会盟而谋弱秦,"] -note = [] -content = "诸侯/恐惧/, 会盟/而谋/弱秦,/" -translation = "诸侯恐慌害怕,集会结盟,商议削弱秦国。" -keyword_note = { "会盟" = "集会结盟", "弱秦" = "削弱秦国" } - -["不爱珍器重宝肥饶之地, 以致天下之士,"] -note = [] -content = "不爱/珍器/重宝/肥饶/之地/, 以致/天下/之士,/" -translation = "不吝惜奇珍贵重的器物和肥沃富饶的土地,用来招纳天下的优秀人才," -keyword_note = { "不爱" = "不吝惜", "珍器重宝" = "奇珍贵重的器物", "以致" = "用来招纳" } - -["合从缔交, 相与为一."] -note = [] -content = "合从/缔交/, 相与/为一./" -translation = "采用合纵的策略缔结盟约,互相援助,成为一体。" -keyword_note = { "合从" = "合纵策略", "缔交" = "缔结盟约" } - -["当此之时, 齐有孟尝, 赵有平原, 楚有春申, 魏有信陵."] -note = [] -content = "当此/之时/, 齐有/孟尝/, 赵有/平原/, 楚有/春申/, 魏有/信陵./" -translation = "在这个时候,齐国有孟尝君,赵国有平原君,楚国有春申君,魏国有信陵君。" -keyword_note = { "孟尝" = "孟尝君田文", "平原" = "平原君赵胜", "春申" = "春申君黄歇", "信陵" = "信陵君魏无忌" } - -["此四君者, 皆明智而忠信, 宽厚而爱人, 尊贤而重士,"] -note = [] -content = "此/四君/者/, 皆/明智/而/忠信/, 宽厚/而/爱人/, 尊贤/而/重士,/" -translation = "这四位封君,都见识英明有智谋,心地诚而讲信义,待人宽宏厚道而爱惜人民,尊重贤才而重用士人," -keyword_note = { "明智" = "见识英明有智谋", "忠信" = "心地诚而讲信义", "爱人" = "爱惜人民", "尊贤" = "尊重贤才", "重士" = "重用士人" } - -["约从离衡, 兼韩、魏、燕、楚、齐、赵、宋、卫、中山之众."] -note = [] -content = "约从/离衡/, 兼/韩/、魏/、燕/、楚/、齐/、赵/、宋/、卫/、中山/之众./" -translation = "以合纵之约击破秦的连横之策,联合韩、魏、燕、楚、齐、赵、宋、卫、中山的部队。" -keyword_note = { "约从" = "采用合纵策略", "离衡" = "破坏连横策略", "兼" = "联合" } - -["于是六国之士, 有甯越、徐尚、苏秦、杜赫之属为之谋,"] -note = [] -content = "于是/六国/之士/, 有/甯越/、徐尚/、苏秦/、杜赫/之属/为之/谋,/" -translation = "在这时,六国的士人,有宁越、徐尚、苏秦、杜赫等人为他们出谋划策," -keyword_note = { "之属" = "等人", "为之谋" = "为他们出谋划策" } - -["齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅之徒通其意,"] -note = [] -content = "齐明/、周最/、陈轸/、召滑/、楼缓/、翟景/、苏厉/、乐毅/之徒/通其/意,/" -translation = "齐明、周最、陈轸、召滑、楼缓、翟景、苏厉、乐毅等人沟通他们的意见," -keyword_note = { "之徒" = "等人", "通其意" = "沟通他们的意见" } - -["吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢之伦制其兵."] -note = [] -content = "吴起/、孙膑/、带佗/、倪良/、王廖/、田忌/、廉颇/、赵奢/之伦/制其/兵./" -translation = "吴起、孙膑、带佗、倪良、王廖、田忌、廉颇、赵奢等人统率他们的军队。" -keyword_note = { "之伦" = "等人", "制其兵" = "统率他们的军队" } - -["尝以十倍之地, 百万之众, 叩关而攻秦."] -note = [] -content = "尝以/十倍/之地/, 百万/之众/, 叩关/而攻/秦./" -translation = "他们曾经用十倍于秦的土地,上百万的军队,攻打函谷关来攻打秦国。" -keyword_note = { "尝" = "曾经", "以" = "用", "叩关" = "攻打函谷关" } - -["秦人开关延敌, 九国之师, 逡巡而不敢进."] -note = [] -content = "秦人/开关/延敌/, 九国/之师/, 逡巡/而不敢/进./" -translation = "秦人打开函谷关口迎战敌人,九国的军队有所顾虑徘徊不敢入关。" -keyword_note = { "开关" = "打开函谷关", "延敌" = "迎战敌人", "九国" = "九个国家", "逡巡" = "有所顾虑徘徊" } - -["秦无亡矢遗镞之费, 而天下诸侯已困矣."] -note = [] -content = "秦/无/亡矢/遗镞/之费/, 而/天下/诸侯/已困/矣./" -translation = "秦人没有一兵一卒的耗费,然而天下的诸侯就已窘迫不堪了。" -keyword_note = { "亡矢" = "丢失箭矢", "遗镞" = "遗失箭头", "费" = "耗费", "困" = "窘迫不堪" } - -["于是从散约败, 争割地而赂秦."] -note = [] -content = "于是/从散/约败/, 争/割地/而赂/秦./" -translation = "因此,纵约失败了,各诸侯国争着割地来贿赂秦国。" -keyword_note = { "从散" = "纵约失败", "约败" = "盟约破坏", "赂" = "贿赂" } - -["秦有余力而制其弊, 追亡逐北, 伏尸百万, 流血漂橹; "] -note = [] -content = "秦/有余力/而制/其弊/, 追亡/逐北/, 伏尸/百万/, 流血/漂橹; /" -translation = "秦有剩余的力量趁他们困乏而制服他们,追赶逃走的败兵,百万败兵横尸道路,流淌的血液可以漂浮盾牌;" -keyword_note = { "制其弊" = "趁他们困乏而制服他们", "追亡" = "追赶逃兵", "逐北" = "追逐败兵", "伏尸" = "横尸", "漂橹" = "漂浮盾牌" } - -["因利乘便, 宰割天下, 分裂山河."] -note = [] -content = "因利/乘便/, 宰割/天下/, 分裂/山河./" -translation = "秦国凭借这便利的形势,割取天下的土地,重新划分山河的区域。" -keyword_note = { "因利乘便" = "凭借便利的形势", "宰割" = "割取", "分裂" = "划分" } - -["强国请服, 弱国入朝."] -note = [] -content = "强国/请服/, 弱国/入朝./" -translation = "强国主动表示臣服,弱国入秦朝拜。" -keyword_note = { "请服" = "请求臣服", "入朝" = "入秦朝拜" } - -["延及孝文王、庄襄王, 享国之日浅, 国家无事."] -note = [] -content = "延及/孝文王/、庄襄王/, 享国/之日/浅/, 国家/无事./" -translation = "延续到孝文王、庄襄王,统治的时间不长,秦国并没有什么大事发生。" -keyword_note = { "延及" = "延续到", "享国" = "统治国家", "浅" = "时间短", "无事" = "没有大事发生" } - -["及至始皇, 奋六世之余烈, 振长策而御宇内,"] -note = [] -content = "及至/始皇/, 奋/六世/之余烈/, 振/长策/而御/宇内,/" -translation = "到始皇的时候,发展六世遗留下来的功业,以武力来统治各国," -keyword_note = { "奋" = "发展", "余烈" = "遗留下来的功业", "振长策" = "挥动长鞭", "御宇内" = "统治天下" } - -["吞二周而亡诸侯, 履至尊而制六合,"] -note = [] -content = "吞/二周/而亡/诸侯/, 履/至尊/而制/六合,/" -translation = "将东周,西周和各诸侯国统统消灭,登上皇帝的宝座来统治天下," -keyword_note = { "吞" = "吞并", "二周" = "东周和西周", "履至尊" = "登上皇位", "制六合" = "统治天下" } - -["执敲扑而鞭笞天下, 威振四海."] -note = [] -content = "执/敲扑/而鞭笞/天下/, 威振/四海./" -translation = "用严酷的刑罚来奴役天下的百姓,威风震慑四海。" -keyword_note = { "敲扑" = "刑具", "鞭笞" = "鞭打,奴役", "威振" = "威风震慑" } - -["南取百越之地, 以为桂林、象郡; "] -note = [] -content = "南取/百越/之地/, 以为/桂林/、象郡; /" -translation = "秦始皇向南攻取百越的土地,把它划为桂林郡和象郡;" -keyword_note = { "百越" = "古代南方少数民族", "以为" = "把它作为" } - -["百越之君, 俯首系颈, 委命下吏."] -note = [] -content = "百越/之君/, 俯首/系颈/, 委命/下吏./" -translation = "百越的君主低着头,颈上捆着绳子愿意服从投降,把性命交给司法官吏。" -keyword_note = { "俯首" = "低头", "系颈" = "颈上捆着绳子", "委命" = "把性命交给", "下吏" = "司法官吏" } - -["乃使蒙恬北筑长城而守藩篱, 却匈奴七百余里; "] -note = [] -content = "乃使/蒙恬/北筑/长城/而守/藩篱/, 却/匈奴/七百/余里; /" -translation = "秦始皇于是又命令蒙恬在北方修筑长城,守卫边境,使匈奴退却七百多里;" -keyword_note = { "蒙恬" = "秦朝名将", "藩篱" = "边境", "却" = "使...退却", "匈奴" = "北方少数民族" } - -["胡人不敢南下而牧马, 士不敢弯弓而报怨."] -note = [] -content = "胡人/不敢/南下/而牧马/, 士/不敢/弯弓/而报怨./" -translation = "胡人不敢向下到南边来放牧,勇士不敢拉弓射箭来报仇。" -keyword_note = { "胡人" = "指匈奴人", "牧马" = "放牧", "弯弓" = "拉弓", "报怨" = "报仇" } - -["于是废先王之道, 焚百家之言, 以愚黔首; "] -note = [] -content = "于是/废/先王/之道/, 焚/百家/之言/, 以愚/黔首; /" -translation = "秦始皇接着就废除古代帝王的治世之道,焚烧诸子百家的著作,来使百姓愚蠢;" -keyword_note = { "先王" = "古代帝王", "道" = "治世之道", "百家之言" = "诸子百家的著作", "愚" = "使...愚蠢", "黔首" = "百姓" } - -["隳名城, 杀豪杰; "] -note = [] -content = "隳/名城/, 杀/豪杰; /" -translation = "毁坏高大的城墙,杀掉英雄豪杰;" -keyword_note = { "隳" = "毁坏", "名城" = "高大的城墙" } - -["收天下之兵, 聚之咸阳, 销锋镝, 铸以为金人十二, 以弱天下之民."] -note = [] -content = "收/天下/之兵/, 聚之/咸阳/, 销/锋镝/, 铸以为/金人/十二/, 以弱/天下/之民./" -translation = "收缴天下的兵器,集中在咸阳,销毁兵刃和箭头,冶炼它们铸造十二个铜人,以便削弱百姓的反抗力量。" -keyword_note = { "兵" = "兵器", "销" = "销毁", "锋镝" = "兵刃和箭头", "铸以为" = "铸造成为", "金人" = "铜人", "弱" = "削弱" } - -["然后践华为城, 因河为池,"] -note = [] -content = "然后/践华/为城/, 因河/为池,/" -translation = "然后凭借华山为城墙,依据黄河为城池," -keyword_note = { "践华" = "凭借华山", "因河" = "依据黄河", "为城" = "作为城墙", "为池" = "作为护城河" } - -["据亿丈之城, 临不测之渊, 以为固."] -note = [] -content = "据/亿丈/之城/, 临/不测/之渊/, 以为/固./" -translation = "凭借着高耸的华山,往下看着深不可测的黄河,认为这是险固的地方。" -keyword_note = { "亿丈" = "形容极高", "不测" = "深不可测", "渊" = "深水", "固" = "险固" } - -["良将劲弩守要害之处, 信臣精卒陈利兵而谁何."] -note = [] -content = "良将/劲弩/守/要害/之处/, 信臣/精卒/陈/利兵/而谁何./" -translation = "好的将领手执强弩,守卫着要害的地方,可靠的官员和精锐的士卒,拿着锋利的兵器,盘问过往行人。" -keyword_note = { "劲弩" = "强弩", "要害" = "重要关键", "信臣" = "可靠的官员", "精卒" = "精锐的士卒", "陈" = "陈列,拿着", "利兵" = "锋利的兵器", "谁何" = "盘问行人" } - -["天下已定, 始皇之心, 自以为关中之固, 金城千里, 子孙帝王万世之业也."] -note = [] -content = "天下/已定/, 始皇/之心/, 自以为/关中/之固/, 金城/千里/, 子孙/帝王/万世/之业/也./" -translation = "天下已经安定,始皇心里自己认为这关中的险固地势、方圆千里的坚固的城防,是子子孙孙称帝称王直至万代的基业。" -keyword_note = { "自以为" = "自己认为", "关中" = "函谷关以西地区", "固" = "险固地势", "金城" = "坚固的城池", "帝王" = "称帝称王", "万世" = "万代" } - -["始皇既没, 余威震于殊俗."] -note = [] -content = "始皇/既没/, 余威/震于/殊俗./" -translation = "始皇去世之后,他的余威依然震慑着边远地区。" -keyword_note = { "既没" = "死后", "余威" = "剩余的威势", "震" = "震慑", "殊俗" = "不同的风俗,指边远地区" } - -["然陈涉瓮牖绳枢之子, 氓隶之人, 而迁徙之徒也; "] -note = [] -content = "然/陈涉/瓮牖/绳枢/之子/, 氓隶/之人/, 而/迁徙/之徒/也; /" -translation = "可是,陈涉不过是个破瓮做窗户、草绳做户枢的贫家子弟,是氓、隶一类的人,后来做了被迁谪戍边的卒子;" -keyword_note = { "瓮牖" = "用破瓮做窗户", "绳枢" = "用草绳系户枢", "氓隶" = "平民和奴隶", "迁徙之徒" = "被征发戍边的人" } - -["才能不及中人, 非有仲尼、墨翟之贤, 陶朱、猗顿之富; "] -note = [] -content = "才能/不及/中人/, 非有/仲尼/、墨翟/之贤/, 陶朱/、猗顿/之富; /" -translation = "才能不如普通人,并没有孔丘、墨翟那样的贤德,也不像陶朱、猗顿那样富有。" -keyword_note = { "中人" = "普通人", "仲尼" = "孔子", "墨翟" = "墨子", "陶朱" = "范蠡", "猗顿" = "春秋时富商" } - -["蹑足行伍之间, 而倔起阡陌之中,"] -note = [] -content = "蹑足/行伍/之间/, 而/倔起/阡陌/之中,/" -translation = "他跻身于戍卒的队伍中,从田野间突然奋起发难," -keyword_note = { "蹑足" = "置身于", "行伍" = "军队", "倔起" = "突然奋起", "阡陌" = "田野" } - -["率疲弊之卒, 将数百之众, 转而攻秦; "] -note = [] -content = "率/疲弊/之卒/, 将/数百/之众/, 转而/攻秦; /" -translation = "率领着疲惫无力的士兵,指挥着几百人的队伍,掉转头来进攻秦国;" -keyword_note = { "疲弊" = "疲惫无力", "将" = "率领" } - -["斩木为兵, 揭竿为旗,"] -note = [] -content = "斩木/为兵/, 揭竿/为旗,/" -translation = "砍下树木作武器,举起竹竿当旗帜," -keyword_note = { "斩木为兵" = "砍树木作武器", "揭竿为旗" = "举竹竿当旗帜" } - -["天下云集响应, 赢粮而景从."] -note = [] -content = "天下/云集/响应/, 赢粮/而景从./" -translation = "天下豪杰像云一样聚集,回声似的应和他,许多人都背着粮食,如影随形。" -keyword_note = { "云集" = "像云一样聚集", "响应" = "像回声一样应和", "赢粮" = "背着粮食", "景从" = "如影随形" } - -["山东豪俊遂并起而亡秦族矣."] -note = [] -content = "山东/豪俊/遂/并起/而亡/秦族/矣./" -translation = "崤山以东的英雄豪杰于是一齐起事,消灭了秦的家族。" -keyword_note = { "山东" = "崤山以东", "豪俊" = "英雄豪杰", "并起" = "一齐起事", "亡" = "消灭", "秦族" = "秦的家族" } - -["且夫天下非小弱也, 雍州之地, 崤函之固, 自若也."] -note = [] -content = "且夫/天下/非/小弱/也/, 雍州/之地/, 崤函/之固/, 自若/也./" -translation = "况且那天下并没有缩小削弱,雍州的地势,崤山和函谷关的险固,是保持原来的样子。" -keyword_note = { "且夫" = "况且", "小弱" = "变小削弱", "自若" = "保持原样" } - -["陈涉之位, 非尊于齐、楚、燕、赵、韩、魏、宋、卫、中山之君也; "] -note = [] -content = "陈涉/之位/, 非/尊于/齐/、楚/、燕/、赵/、韩/、魏/、宋/、卫/、中山/之君/也; /" -translation = "陈涉的地位,没有比齐、楚、燕、赵、韩、魏、宋、卫、中山的国君更加尊贵;" -keyword_note = { "尊于" = "比...尊贵" } - -["锄櫌棘矜, 非铦于钩戟长铩也; "] -note = [] -content = "锄櫌/棘矜/, 非/铦于/钩戟/长铩/也; /" -translation = "锄头木棍也不比钩戟长矛更锋利;" -keyword_note = { "锄櫌" = "锄头", "棘矜" = "木棍", "铦于" = "比...锋利", "钩戟" = "带钩的戟", "长铩" = "长矛" } - -["谪戍之众, 非抗于九国之师也; "] -note = [] -content = "谪戍/之众/, 非/抗于/九国/之师/也; /" -translation = "那迁谪戍边的士兵也不能和九国部队抗衡;" -keyword_note = { "谪戍" = "被贬戍边", "抗于" = "和...抗衡", "九国" = "九个国家" } - -["深谋远虑, 行军用兵之道, 非及乡时之士也."] -note = [] -content = "深谋/远虑/, 行军/用兵/之道/, 非及/乡时/之士/也./" -translation = "深谋远虑,行军用兵的方法,也比不上先前九国的武将谋臣。" -keyword_note = { "深谋远虑" = "深谋远虑", "行军用兵" = "行军作战", "非及" = "比不上", "乡时" = "先前" } - -["然而成败异变, 功业相反, 何也?"] -note = [] -content = "然而/成败/异变/, 功业/相反/, 何也?/" -translation = "可是条件好者失败而条件差者成功,功业完全相反,为什么呢?" -keyword_note = { "成败异变" = "成功失败发生变化", "功业相反" = "功业完全相反" } - -["试使山东之国与陈涉度长絜大, 比权量力,"] -note = [] -content = "试使/山东/之国/与/陈涉/度长/絜大/, 比权/量力,/" -translation = "假使拿东方诸侯国跟陈涉比一比长短大小,量一量权势力量," -keyword_note = { "试使" = "假使", "度长絜大" = "衡量长短大小", "比权量力" = "比较权势力量" } - -["则不可同年而语矣."] -note = [] -content = "则/不可/同年/而语/矣./" -translation = "就更不能相提并论了。" -keyword_note = { "同年而语" = "相提并论" } - -["然秦以区区之地, 致万乘之势, 序八州而朝同列, 百有余年矣; "] -note = [] -content = "然/秦/以/区区/之地/, 致/万乘/之势/, 序/八州/而朝/同列/, 百有/余年/矣; /" -translation = "然而秦凭借着它的小小的地方,发展到兵车万乘的国势,管辖全国,使六国诸侯都来朝见,已经一百多年了;" -keyword_note = { "区区" = "小小", "致" = "达到", "万乘" = "兵车万乘", "序八州" = "管辖全国", "朝同列" = "使同列来朝拜", "百有余年" = "一百多年" } - -["然后以六合为家, 崤函为宫; "] -note = [] -content = "然后/以/六合/为家/, 崤函/为宫; /" -translation = "这之后把天下作为家业,用崤山、函谷关作为自己的内宫;" -keyword_note = { "六合为家" = "把天下作为家业", "崤函为宫" = "把崤山函谷关作为内宫" } - -["一夫作难而七庙隳, 身死人手, 为天下笑者, 何也?"] -note = [] -content = "一夫/作难/而/七庙/隳/, 身死/人手/, 为/天下/笑者/, 何也?/" -translation = "陈涉一人起义国家就灭亡了,秦王子婴死在别人项羽手里,被天下人耻笑,这是为什么呢?" -keyword_note = { "一夫作难" = "一人起义", "七庙隳" = "宗庙毁灭,国家灭亡", "身死人手" = "死在别人手里", "为天下笑" = "被天下人耻笑" } - -["仁义不施而攻守之势异也."] -note = [] -content = "仁义/不施/而/攻守/之势/异也./" -translation = "就因为不施行仁政而使攻守的形势发生了变化啊。" -keyword_note = { "仁义" = "仁政", "不施" = "不施行", "攻守之势" = "进攻和防守的形势", "异" = "发生变化" } - -["锦瑟"] -note = [] -content = "锦瑟/" -translation = "锦瑟" -keyword_note = {} - -["锦瑟无端五十弦, 一弦一柱思华年."] -note = ['李商隐〔唐代〕'] -content = "锦瑟/无端/五十弦/, 一弦/一柱/思/华年./" -translation = "精美的瑟为什么有五十根弦, 一弦一柱都叫我追忆青春年华. " -keyword_note = { "锦瑟" = "装饰华美的瑟", "无端" = "犹何故, 怨怪之词", "五十弦" = "托古之词, 锦瑟本应是二十五弦", "华年" = "青春年华" } - -["庄生晓梦迷蝴蝶, 望帝春心托杜鹃."] -note = [] -content = "庄生/晓梦/迷/蝴蝶/, 望帝/春心/托/杜鹃./" -translation = "庄周在梦中化为蝴蝶翩翩起舞, 望帝把自己的幽恨托身于杜鹃. " -keyword_note = { "庄生晓梦迷蝴蝶" = "引用庄周梦蝶故事, 言人生如梦, 往事如烟", "望帝春心托杜鹃" = "引用望帝化为杜鹃的传说, 表达幽恨之情" } - -["沧海月明珠有泪, 蓝田日暖玉生烟."] -note = [] -content = "沧海/月明/珠/有泪/, 蓝田/日暖/玉/生烟./" -translation = "沧海明月高照, 鲛人泣泪成珠; 蓝田红日和暖, 可看到良玉生烟. " -keyword_note = { "珠有泪" = "引用鲛人泣泪成珠的典故", "蓝田" = "指蓝田山, 一名玉山", "玉生烟" = "良玉在日光下生出烟气" } - -["此情可待成追忆, 只是当时已惘然."] -note = [] -content = "此情/可待/成/追忆/, 只是/当时/已/惘然./" -translation = "此时此景为什么要现在才追忆, 只因为当时心中只是一片茫然. " -keyword_note = { "可待" = "岂待, 何待", "只是" = "止是、仅是, 有就是、正是之意", "惘然" = "失意的样子, 心中若有所失的样子" } - -["长亭送别"] -note = [] -content = "长亭送别/" -translation = "长亭送别" -keyword_note = {} - -["碧云天, 黄花地, 西风紧, 北雁南飞."] -note = ['正宫·端正好·长亭送别', '作者: 王实甫'] -content = "碧/云天/, 黄花/地/, 西风/紧/, 北雁/南飞./" -translation = "碧蓝的天空, 开满了菊花的大地, 西风猛烈吹, 大雁从北往南飞. " -keyword_note = { "碧云天" = "碧蓝的天空", "黄花地" = "开满了菊花的大地", "西风紧" = "西风猛烈吹", "北雁南飞" = "大雁从北往南飞" } - -["晓来谁染霜林醉? 总是离人泪."] -note = ['正宫·端正好·长亭送别', '作者: 王实甫'] -content = "晓/来/谁/染/霜林/醉? /总是/离人/泪./" -translation = "清晨, 是谁把经霜的枫林染红了? 那总是离人的眼泪. " -keyword_note = { "晓来" = "清晨", "霜林醉" = "经霜的枫林染红了", "离人泪" = "离人的眼泪" } - -["阿房宫赋"] -note = [] -content = "阿房宫赋/" -translation = "阿房宫赋" -keyword_note = {} - -["六王毕, 四海一, 蜀山兀, 阿房出."] -note = [ - '六王: 韩、赵、魏、楚、燕、齐六国的国王', - '毕: 完结, 指为秦国所灭', - '一: 统一', - '兀: 山高而上平, 形容山上树木被砍伐净尽', - '出: 出现, 意思是建成', -] -content = "六王/毕/, 四海/一/, 蜀山/兀/, 阿房/出./" -translation = "六国灭亡, 秦始皇统一了天下. 蜀山的树木被伐光了, 阿房宫才盖起来" -keyword_note = { "六王毕" = "六国灭亡", "四海一" = "天下统一", "蜀山兀" = "蜀山树木砍光", "阿房出" = "阿房宫建成" } - -["覆压三百余里, 隔离天日."] -note = [] -content = "覆压/三百/余里/, 隔离/天日./" -translation = " (从渭南到咸阳) 阿房宫占地三百多里, 楼阁高耸, 遮天蔽日" -keyword_note = { "覆压" = "覆盖, 形容宫殿楼阁接连不断", "隔离天日" = "遮蔽了天日, 形容宫殿楼阁的高大" } - -["骊山北构而西折, 直走咸阳."] -note = ['骊山: 从骊山', '北构: 向北建构', '西折: 往西转', '直走: 一直延伸到'] -content = "骊山/北构/而/西折/, 直走/咸阳./" -translation = " (它) 从骊山向北建构, 再往西转, 一直延伸到咸阳" -keyword_note = { "北构" = "向北建构", "西折" = "向西转折", "直走" = "一直通向" } - -["二川溶溶, 流入宫墙."] -note = ['二川: 指渭水和樊川', '溶溶: 河水缓流的样子'] -content = "二川/溶溶/, 流入/宫墙./" -translation = "渭水和樊水浩浩荡荡, 水波荡漾地流入阿房宫的围墙" -keyword_note = { "二川" = "渭水和樊川", "溶溶" = "水波荡漾的样子" } - -["五步一楼, 十步一阁; 廊腰缦回, 檐牙高啄; 各抱地势, 钩心斗角."] -note = ['廊腰: 连接高大建筑物的走廊', '缦回: 宽而曲折', '檐牙: 突起的屋檐', '钩心斗角: 宫室结构参差错落, 精巧工致'] -content = "五步/一楼/, 十步/一阁/; 廊腰/缦回/, 檐牙/高啄/; 各抱/地势/, 钩心/斗角./" -translation = "每隔五步 (有) 一栋楼, 每隔十步 (有) 一座阁. 走廊宽而曲折, (突起的)屋檐 (像鸟嘴) 向上噘起. 楼阁各依地势的高下而建, 像是互相环抱, 各种建筑物都向中心区攒集, 屋角互相对峙" -keyword_note = { "廊腰缦回" = "走廊宽而曲折", "檐牙高啄" = "屋檐像鸟嘴向上噘起", "各抱地势" = "各随地形而建", "钩心斗角" = "建筑物向中心攒集, 屋角对峙" } - -["盘盘焉, 囷囷焉, 蜂房水涡, 矗不知其几千万落."] -note = ['盘盘: 盘旋的样子', '囷囷: 屈曲的样子', "落: 相当于'座'或者'所'"] -content = "盘盘/焉/, 囷囷/焉/, 蜂房/水涡/, 矗/不知/其/几千万/落./" -translation = "盘旋地、曲折地, 像蜂房, 像水涡, 矗立着不知有几千万座" -keyword_note = { "盘盘" = "盘旋", "囷囷" = "屈曲", "蜂房水涡" = "像蜂房像水涡", "矗" = "矗立" } - -["长桥卧波, 未云何龙?"] -note = ["未云何龙: 没有云怎么 (出现了) 龙? 《易经》有'云从龙'的话"] -content = "长桥/卧波/, 未云/何龙?/" -translation = "长桥横卧在渭水上, (人们看了要惊讶: ) 天上没有云, 怎么出现了龙? " -keyword_note = { "长桥卧波" = "长桥横卧水上", "未云何龙" = "无云何以现龙" } - -["复道行空, 不霁何虹?"] -note = ['复道: 在楼阁之间架木筑成的通道', '霁: 雨雪停止, 天放晴'] -content = "复道/行空/, 不霁/何虹?/" -translation = "在楼阁之间架木筑成的通道横空而过, 彩色斑斓, (人们看了要诧异: ) 不是雨过天晴, 哪里来的彩虹? " -keyword_note = { "复道行空" = "空中通道横空", "不霁何虹" = "未晴何来彩虹" } - -["高低冥迷, 不知西东."] -note = ['冥迷: 分辨不清'] -content = "高低/冥迷/, 不知/西东./" -translation = "楼阁随着地势高高低低, 使人迷糊, 辨不清东西方向" -keyword_note = { "高低冥迷" = "高低难辨", "不知西东" = "不辨方向" } - -["歌台暖响, 春光融融; 舞殿冷袖, 风雨凄凄."] -note = [] -content = "歌台/暖响/, 春光/融融/; 舞殿/冷袖/, 风雨/凄凄./" -translation = "人们在台上唱歌, 歌乐声响起来, 好像充满着暖意, 如同春光那样融和. 人们在殿中舞蹈, 舞袖飘拂, 好像带来寒气, 如同风雨交加那样凄冷" -keyword_note = { "歌台暖响" = "歌台暖意融融", "舞殿冷袖" = "舞殿寒气凄凄" } - -["一日之内, 一宫之间, 而气候不齐."] -note = ['气候: 指天气 (雨雪阴睛) 的意思'] -content = "一日/之内/, 一宫/之间/, 而/气候/不齐./" -translation = "一天之内, 一宫之中, 而天气竟会如此不同" -keyword_note = { "气候不齐" = "气氛冷暖不同" } - -["妃嫔媵嫱, 王子皇孙, 辞楼下殿, 辇来于秦, 朝歌夜弦, 为秦宫人."] -note = ['妃嫔媵嫱: 统指六国王侯的宫妃', '王子皇孙: 指六国王侯的女儿、孙女', '辇: 辇车'] -content = "妃嫔/媵嫱/, 王子/皇孙/, 辞楼/下殿/, 辇来/于秦/, 朝歌/夜弦/, 为/秦宫人./" -translation = "六国王侯的宫妃、女儿、孙女, 辞别本国的楼阁宫殿, 乘着辇车来到秦国. 早晚弹唱,成为秦王朝的宫女" -keyword_note = { "妃嫔媵嫱" = "六国宫妃", "辇来于秦" = "乘车来到秦国", "朝歌夜弦" = "早晚歌舞" } - -["明星荧荧, 开妆镜也;"] -note = ['荧荧: 明亮的样子'] -content = "明星/荧荧/, 开妆镜/也;/" -translation = " (光如) 明星闪亮, 是 (宫女们) 打开梳妆的镜子; " -keyword_note = { "明星荧荧" = "星光闪亮" } - -["绿云扰扰, 梳晓鬟也;"] -note = [] -content = "绿云/扰扰/, 梳晓鬟/也;/" -translation = "乌云缭绕, 原来是她们正在早晨梳理发髻; " -keyword_note = { "绿云扰扰" = "乌云缭绕" } - -["渭流涨腻, 弃脂水也;"] -note = ['涨腻: 涨起了 (一层) 脂膏'] -content = "渭流/涨腻/, 弃脂水/也;/" -translation = "渭水河面上浮起一层垢腻, 原来是她们泼掉的脂粉水; " -keyword_note = { "渭流涨腻" = "渭水浮腻" } - -["烟斜雾横, 焚椒兰也."] -note = ['椒兰: 两种香料植物'] -content = "烟斜/雾横/, 焚椒兰/也./" -translation = "空中烟雾弥漫, 是她们在焚烧椒兰香料" -keyword_note = { "烟斜雾横" = "烟雾弥漫" } - -["雷霆乍惊, 宫车过也; 辘辘远听, 杳不知其所之也."] -note = ['辘辘: 车行的声音', '杳: 无影无声, 形容声音的遥远'] -content = "雷霆/乍惊/, 宫车/过也/; 辘辘/远听/, 杳/不知/其所之/也./" -translation = "如雷霆般的声音响起使人骤然吃惊, 是皇上的宫车驰过; 听那车声渐远, 也不知驶到哪儿去了" -keyword_note = { "雷霆乍惊" = "雷霆般震响", "辘辘远听" = "车声渐远", "杳不知" = "远去无踪" } - -["一肌一容, 尽态极妍, 缦立远视, 而望幸焉."] -note = ['尽态极妍: 娇媚极了', '缦立: 久立', '幸: 皇帝驾临'] -content = "一肌/一容/, 尽态/极妍/, 缦立/远视/, 而/望幸/焉./" -translation = "任何一部分肌肤, 任何一种姿容, 都娇媚极了, 耐心地久立远视, 盼望皇帝能亲自驾临" -keyword_note = { "一肌一容" = "肌肤姿容", "尽态极妍" = "娇媚至极", "缦立远视" = "久立远望", "望幸" = "盼望宠幸" } - -["有不得见者, 三十六年."] -note = ['三十六年: 秦始皇在位共三十六年'] -content = "有/不得/见者/, 三十/六年./" -translation = "可是有许多宫女整整等了三十六年, 还未见到皇帝" -keyword_note = { "不得见" = "未能见到", "三十六年" = "长达三十六年" } - -["鼎铛玉石, 金块珠砾, 弃掷逦迤, 秦人视之, 亦不甚惜."] -note = ['鼎铛玉石: 把宝鼎看作铁锅, 把美玉看作石头', '金块珠砾: 把黄金看作土块, 把珍珠看作石子', '逦迤: 连续不断, 到处都是'] -content = "鼎铛/玉石/, 金块/珠砾/, 弃掷/逦迤/, 秦人/视之/, 亦不/甚惜./" -translation = "把宝鼎当作铁锅, 把美玉当作石头, 把黄金当作土块, 把珍珠当作沙石, 随意丢弃, 秦人看见了也不觉得可惜" -keyword_note = { "鼎铛玉石" = "视鼎如铛视玉如石", "金块珠砾" = "视金如土视珠如砾", "弃掷逦迤" = "随意丢弃", "不甚惜" = "不很珍惜" } - -["使负栋之柱, 多于南亩之农夫;"] -note = ['负栋之柱: 承担栋梁的柱子'] -content = "使/负栋/之柱/, 多于/南亩/之农夫;/" -translation = "让那 (阿房宫中) 负载大梁的柱子, 比田里的农夫还多; " -keyword_note = { "负栋之柱" = "承重柱子" } - -["架梁之椽, 多于机上之工女;"] -note = [] -content = "架梁/之椽/, 多于/机上/之工女;/" -translation = "架起侧梁的椽子, 比织布机上的女工还多; " -keyword_note = { "架梁之椽" = "屋梁椽子" } - -["钉头磷磷, 多于在庾之粟粒;"] -note = ['磷磷: 水中石头突立的样子, 形容突出的钉头', '庾: 露天的谷仓'] -content = "钉头/磷磷/, 多于/在庾/之粟粒;/" -translation = "显眼的钉子, 比谷仓里的稻米还多; " -keyword_note = { "钉头磷磷" = "突出钉头" } - -["瓦缝参差, 多于周身之帛缕;"] -note = [] -content = "瓦缝/参差/, 多于/周身/之帛缕;/" -translation = "横直密布的屋瓦, 比 (老百姓) 身上的衣服上的线还要多; " -keyword_note = { "瓦缝参差" = "参差瓦缝" } - -["直栏横槛, 多于九土之城郭;"] -note = ['九土: 九州'] -content = "直栏/横槛/, 多于/九土/之城郭;/" -translation = "纵横的栏杆, 比天下的城郭还多; " -keyword_note = { "直栏横槛" = "纵横栏杆" } - -["管弦呕哑, 多于市人之言语."] -note = [] -content = "管弦/呕哑/, 多于/市人/之言语./" -translation = "乐器的演奏声, 比闹市的人说话声还多" -keyword_note = { "管弦呕哑" = "乐器声响" } - -["使天下之人, 不敢言而敢怒."] -note = [] -content = "使/天下/之人/, 不敢/言/而/敢怒./" -translation = "使天下的老百姓敢怒但是不敢言" -keyword_note = { "不敢言" = "不敢说话", "敢怒" = "心中愤怒" } - -["独夫之心, 日益骄固."] -note = ['独夫: 失去人心而极端孤立的统治者, 指秦始皇', '骄固: 骄横顽固'] -content = "独夫/之心/, 日益/骄固./" -translation = "秦始皇却越来越骄横顽固" -keyword_note = { "独夫" = "孤家寡人", "日益骄固" = "越来越骄横顽固" } - -["戍卒叫, 函谷举, 楚人一炬, 可怜焦土!"] -note = ['戍卒叫: 指陈胜、吴广起义', '函谷举: 函谷关被攻占', '楚人一炬: 项羽焚烧秦宫'] -content = "戍卒/叫/, 函谷/举/, 楚人/一炬/, 可怜/焦土!/" -translation = "陈胜、吴广揭竿而起, 四方响应, 函谷关被攻破, 项羽放了一把火, 可惜阿房宫变成了一片焦土" -keyword_note = { "戍卒叫" = "戍卒起义", "函谷举" = "函谷被占", "楚人一炬" = "项羽焚宫", "可怜焦土" = "可惜化为焦土" } - -["灭六国者六国也, 非秦也; 族秦者秦也, 非天下也."] -note = ['族: 灭族'] -content = "灭/六国者/六国/也/, 非/秦也/; 族/秦者/秦也/, 非/天下也./" -translation = "使六国灭亡的是六国自己, 而不是秦国; 使秦国灭亡的是秦国自己, 而不是天下百姓" -keyword_note = { "灭六国" = "六国自灭", "族秦" = "秦国自灭" } - -["嗟乎! 使六国各爱其人, 则足以拒秦;"] -note = [] -content = "嗟乎/! 使/六国/各爱/其人/, 则/足以/拒秦;/" -translation = "唉! 如果六国统治者都能爱护本国老百姓, 那么就有足够的力量抗拒秦国. " -keyword_note = { "各爱其人" = "爱护百姓", "足以拒秦" = "能够抗秦" } - -["使秦复爱六国之人, 则递三世可至万世而为君,"] -note = ['递: 传递, 指王位顺着次序传下去', '万世: 传之无穷'] -content = "使/秦/复爱/六国/之人/, 则/递三世/可至/万世/而为君,/" -translation = "如果秦国统治者同样能爱护六国的人民, 那么秦就能从三世传下去, 甚至可以传到万世都为君王, " -keyword_note = { "复爱六国" = "爱护六国人民", "递三世" = "传位三代" } - -["谁得而族灭也?"] -note = [] -content = "谁得/而族灭/也?/" -translation = "谁能够灭掉秦国呢? " -keyword_note = { "族灭" = "灭族" } - -["秦人不暇自哀, 而后人哀之;"] -note = ['不暇: 来不及'] -content = "秦人/不暇/自哀/, 而后人/哀之;/" -translation = "秦人来不及为自己的灭亡哀叹, 只好让后世的人为他们哀叹; " -keyword_note = { "不暇自哀" = "来不及自哀", "后人哀之" = "后人为之哀叹" } - -["后人哀之而不鉴之, 亦使后人而复哀后人也."] -note = ['鉴: 引以为鉴'] -content = "后人/哀之/而/不鉴之/, 亦使/后人/而/复哀/后人/也./" -translation = "后世的人如果只是哀叹而不引以为鉴, 那么又要再让后世的人为后世哀叹了" -keyword_note = { "不鉴之" = "不引以为鉴", "复哀后人" = "再让后人哀叹" } - -["陈情表"] -note = [] -content = "陈情表/" -translation = "陈情表" -keyword_note = {} - -["臣密言: 臣以险衅, 夙遭闵凶."] -note = [] -content = "臣/密/言: /臣/以/险衅/, 夙/遭/闵凶./" -translation = "臣子李密陈言: 我因命运不好, 小时候遭遇到了不幸" -keyword_note = { "险衅" = "凶险祸患 (这里指命运不好) ", "夙" = "早时, 这里指年幼的时候", "闵" = "通'悯', 指可忧患的事", "凶" = "不幸, 指丧父" } - -["生孩六月, 慈父见背; 行年四岁, 舅夺母志."] -note = [] -content = "生孩/六月/, 慈父/见背; /行年/四岁/, 舅/夺/母志./" -translation = "刚出生六个月, 我慈爱的父亲就不幸去世了. 经过了四年, 舅父逼母亲改嫁" -keyword_note = { "见背" = "死的委婉说法", "行年" = "经历的年岁", "母志" = "母亲守节之志 (改嫁的委婉说法) " } - -["祖母刘愍臣孤弱, 躬亲抚养."] -note = [] -content = "祖母/刘/愍/臣/孤弱/, 躬亲/抚养./" -translation = "我的祖母刘氏, 怜悯我从小丧父, 便亲自对我加以抚养" -keyword_note = { "愍" = "怜悯", "躬亲" = "亲身" } - -["臣少多疾病, 九岁不行, 零丁孤苦, 至于成立."] -note = [] -content = "臣/少/多/疾病/, 九岁/不行/, 零丁/孤苦/, 至于/成立./" -translation = "臣小的时候经常生病, 九岁时还不会行走. 孤独无靠, 一直到成人自立" -keyword_note = { "成立" = "成人自立" } - -["既无伯叔, 终鲜兄弟, 门衰祚薄, 晚有儿息."] -note = [] -content = "既/无/伯叔/, 终/鲜/兄弟/, 门/衰/祚/薄/, 晚/有/儿息./" -translation = "既没有叔叔伯伯, 又没什么兄弟, 门庭衰微而福分浅薄, 很晚才有儿子" -keyword_note = { "鲜" = "少, 这里指'无'", "祚薄" = "福分浅薄", "儿息" = "亲生子女" } - -["外无期功强近之亲, 内无应门五尺之僮, 茕茕孑立, 形影相吊."] -note = [] -content = "外/无/期功/强近/之亲/, 内/无/应门/五尺/之僮/, 茕茕/孑立/, 形影/相吊./" -translation = "在外面没有比较亲近的亲戚, 在家里又没有照应门户的童仆. 生活孤单没有依靠, 每天只有自己的身体和影子相互安慰" -keyword_note = { "期功" = "指关系较近的亲属", "茕茕孑立" = "孤单无依靠的样子", "吊" = "安慰" } - -["而刘夙婴疾病, 常在床蓐, 臣侍汤药, 未曾废离."] -note = [] -content = "而/刘/夙/婴/疾病/, 常/在/床蓐/, 臣/侍/汤药/, 未曾/废离./" -translation = "但祖母又早被疾病缠绕, 常年卧床不起, 我侍奉她吃饭喝药, 从来就没有停止侍奉而离开她" -keyword_note = { "婴" = "被...缠绕", "蓐" = "通'褥', 床垫", "废" = "停止服侍", "离" = "离开" } - -["逮奉圣朝, 沐浴清化."] -note = [] -content = "逮/奉/圣朝/, 沐浴/清化./" -translation = "到了晋朝建立, 我蒙受着清明的政治教化" -keyword_note = { "逮" = "及, 到", "奉" = "承奉", "圣朝" = "指当时的晋朝", "沐浴清化" = "蒙受清平教化" } - -["前太守臣逵察臣孝廉; 后刺史臣荣举臣秀才."] -note = [] -content = "前/太守/臣/逵/察/臣/孝廉; /后/刺史/臣/荣/举/臣/秀才./" -translation = "前任太守逵, 考察后推举臣下为孝廉, 后任刺史荣又推举臣下为优秀人才" -keyword_note = { "察" = "考察和推举", "孝廉" = "孝顺, 品性纯洁", "举" = "推举", "秀才" = "优秀人才" } - -["臣以供养无主, 辞不赴命."] -note = [] -content = "臣/以/供养/无主/, 辞/不赴命./" -translation = "臣下因为供奉赡养祖母的事无人承担, 辞谢不接受任命" -keyword_note = { "无主" = "无人承担" } - -["诏书特下, 拜臣郎中, 寻蒙国恩, 除臣洗马."] -note = [] -content = "诏书/特下/, 拜/臣/郎中/, 寻/蒙/国恩/, 除/臣/洗马./" -translation = "朝廷又特地下了诏书, 任命我为郎中, 不久又蒙受国家恩命, 任命我为太子洗马" -keyword_note = { "拜" = "授予官职", "郎中" = "尚书省的属官", "寻" = "不久", "除" = "拜官受职", "洗马" = "太子的属官" } - -["猥以微贱, 当侍东宫, 非臣陨首所能上报."] -note = [] -content = "猥/以/微贱/, 当/侍/东宫/, 非/臣/陨首/所能/上报./" -translation = "像我这样出身微贱地位卑下的人, 担当侍奉太子的职务, 这实在不是我杀身捐躯所能报答朝廷的" -keyword_note = { "猥" = "谦词", "微贱" = "卑微低贱", "东宫" = "太子居处", "陨首" = "杀身" } - -["臣具以表闻, 辞不就职."] -note = [] -content = "臣/具/以表/闻/, 辞/不就职./" -translation = "我将以上苦衷上表报告, 加以推辞不去就职" -keyword_note = { "具" = "详细", "闻" = "使...知道" } - -["诏书切峻, 责臣逋慢; 郡县逼迫, 催臣上道; 州司临门, 急于星火."] -note = [] -content = "诏书/切峻/, 责/臣/逋慢; /郡县/逼迫/, 催/臣/上道; /州司/临门/, 急于/星火./" -translation = "但是诏书急切严峻, 责备我逃避命令, 有意拖延, 态度傲慢. 郡县长官催促我立刻上路; 州官登门督促, 比流星坠落还要急迫" -keyword_note = { "切峻" = "急切而严厉", "逋慢" = "逃避怠慢", "星火" = "流星的光, 喻急迫" } - -["臣欲奉诏奔驰, 则刘病日笃, 欲苟顺私情, 则告诉不许."] -note = [] -content = "臣/欲/奉诏/奔驰/, 则/刘/病/日笃/, 欲/苟/顺/私情/, 则/告诉/不许./" -translation = "我很想遵从皇上的旨意赴京就职, 但祖母刘氏的病却一天比一天重; 想要姑且顺从自己的私情, 但报告申诉不被允许" -keyword_note = { "日笃" = "病情日益加重", "苟" = "姑且", "告诉" = "报告申诉" } - -["臣之进退, 实为狼狈."] -note = [] -content = "臣/之/进退/, 实为/狼狈./" -translation = "我是进退两难, 十分狼狈" -keyword_note = { "狼狈" = "进退两难的样子" } - -["伏惟圣朝以孝治天下, 凡在故老, 犹蒙矜育, 况臣孤苦, 特为尤甚."] -note = [] -content = "伏惟/圣朝/以/孝/治/天下/, 凡/在/故老/, 犹/蒙/矜育/, 况/臣/孤苦/, 特为/尤甚./" -translation = "我俯伏思量晋朝是用孝道来治理天下的, 凡是年老而德高的旧臣, 尚且还受到怜悯养育, 何况我的孤苦程度更为严重呢" -keyword_note = { "伏惟" = "下对上的敬辞", "故老" = "年老德高的旧臣", "矜育" = "怜悯养育" } - -["且臣少仕伪朝, 历职郎署, 本图宦达, 不矜名节."] -note = [] -content = "且/臣/少/仕/伪朝/, 历职/郎署/, 本图/宦达/, 不矜/名节./" -translation = "况且我年轻的时候曾经做过蜀汉的官, 担任过郎官职务, 本来就希望做官显达, 并不顾惜名声节操" -keyword_note = { "伪朝" = "对前朝的蔑称", "历职" = "连续任职", "郎署" = "尚书郎的官衙", "宦达" = "官场上显达" } - -["今臣亡国贱俘, 至微至陋, 过蒙拔擢, 宠命优渥, 岂敢盘桓, 有所希冀!"] -note = [] -content = "今/臣/亡国/贱俘/, 至微/至陋/, 过/蒙/拔擢/, 宠命/优渥/, 岂敢/盘桓/, 有所/希冀!/" -translation = "现在我是一个低贱的亡国俘虏, 十分卑微浅陋, 受到过分提拔, 恩宠优厚, 怎敢犹豫不决而有非分的企求呢" -keyword_note = { "拔擢" = "提拔", "优渥" = "优厚", "盘桓" = "徘徊不前", "希冀" = "非分的企求" } - -["但以刘日薄西山, 气息奄奄, 人命危浅, 朝不虑夕."] -note = [] -content = "但/以/刘/日薄/西山/, 气息/奄奄/, 人命/危浅/, 朝不/虑夕./" -translation = "只是因为祖母刘氏寿命即将终了, 气息微弱, 生命垂危, 早上不能想到晚上怎样" -keyword_note = { "日薄西山" = "太阳接近西山, 喻人寿命将终", "危浅" = "生命垂危" } - -["臣无祖母, 无以至今日, 祖母无臣, 无以终余年."] -note = [] -content = "臣/无/祖母/, 无以/至今日/, 祖母/无/臣/, 无以/终余年./" -translation = "臣下我如果没有祖母, 就没有今天的样子; 祖母如果没有我的照料, 也无法度过她的余生" -keyword_note = { "终余年" = "度过余生" } - -["母孙二人, 更相为命, 是以区区不能废远."] -note = [] -content = "母孙/二人/, 更相/为命/, 是以/区区/不能/废远./" -translation = "我们祖孙二人, 互相依靠而维持生命, 因此我的内心不愿废止奉养, 远离祖母" -keyword_note = { "更相" = "相互", "区区" = "自己的私情", "废远" = "废止奉养而远离" } - -["臣密今年四十有四, 祖母今年九十有六, 是臣尽节于陛下之日长, 报养刘之日短."] -note = [] -content = "臣/密/今年/四十/有四/, 祖母/今年/九十/有六/, 是/臣/尽节/于/陛下/之日/长/, 报养/刘/之日/短./" -translation = "臣下我现在的年龄四十四岁了, 祖母现在的年龄九十六岁了, 臣下我在陛下面前尽忠尽节的日子还长着呢, 而在祖母刘氏面前尽孝尽心的日子已经不多了" -keyword_note = { "有" = "又", "尽节" = "尽忠节" } - -["乌鸟私情, 愿乞终养."] -note = [] -content = "乌鸟/私情/, 愿/乞/终养./" -translation = "我怀着乌鸦反哺的私情, 乞求能够准许我完成对祖母养老送终的心愿" -keyword_note = { "乌鸟私情" = "乌鸦反哺之情, 喻孝心", "终养" = "养老至终" } - -["臣之辛苦, 非独蜀之人士及二州牧伯所见明知, 皇天后土, 实所共鉴."] -note = [] -content = "臣/之/辛苦/, 非独/蜀之/人士/及/二州/牧伯/所见/明知/, 皇天/后土/, 实所/共鉴./" -translation = "我的辛酸苦楚, 并不仅仅被蜀地的百姓及益州、梁州的长官所亲眼目睹、内心明白, 连天地神明也都看得清清楚楚" -keyword_note = { "辛苦" = "辛酸苦楚", "牧伯" = "州郡长官", "皇天后土" = "天地神明", "鉴" = "明察" } - -["愿陛下矜悯愚诚, 听臣微志, 庶刘侥幸, 保卒余年."] -note = [] -content = "愿/陛下/矜悯/愚诚/, 听/臣/微志/, 庶/刘/侥幸/, 保/卒/余年./" -translation = "希望陛下能怜悯我愚昧诚心, 请允许我完成臣下一点小小的心愿, 使祖母刘氏能够侥幸地保全她的余生" -keyword_note = { "矜悯" = "怜悯", "听" = "准许", "庶" = "或许 (表希望) ", "卒余年" = "终老" } - -["臣生当陨首, 死当结草."] -note = [] -content = "臣/生/当/陨首/, 死/当/结草./" -translation = "我活着应当杀身报效朝廷, 死了也要结草衔环来报答陛下的恩情" -keyword_note = { "陨首" = "掉脑袋, 指献出生命", "结草" = "死后报恩的典故" } - -["臣不胜犬马怖惧之情, 谨拜表以闻."] -note = [] -content = "臣/不胜/犬马/怖惧/之情/, 谨/拜表/以闻./" -translation = "臣下我怀着牛马一样不胜恐惧的心情, 恭敬地呈上此表来使陛下知道这件事" -keyword_note = { "不胜" = "禁不住", "犬马怖惧" = "臣子谦卑的自比", "闻" = "使...知道" } - -["青玉案·元夕"] -note = [] -content = "青玉案·元夕/" -translation = "青玉案·元夕" -keyword_note = {} - -["东风夜放花千树, 更吹落、星如雨"] -note = ['描写元宵夜灯火辉煌的景象, 用夸张手法表现花灯之多如千树花开'] -content = "东风/夜放/花千树/, 更/吹落/、星/如雨/" -translation = "东风吹开了元宵夜的火树银花, 花灯灿烂, 就像千树花开" -keyword_note = { "花千树" = "花灯之多如千树开花", "星如雨" = "焰火纷纷, 乱落如雨" } - -["宝马雕车香满路"] -note = ['描绘元宵节繁华街道上豪华马车往来不绝的盛况'] -content = "宝马/雕车/香/满路/" -translation = "豪华的马车在飘香的街道行过" -keyword_note = { "宝马雕车" = "豪华的马车", "香满路" = "香气弥漫整条街道" } - -["凤箫声动, 玉壶光转, 一夜鱼龙舞"] -note = ['描写元宵夜音乐悠扬、月光流转、灯舞不停的欢乐场景'] -content = "凤箫/声动/, 玉壶/光转/, 一夜/鱼龙/舞/" -translation = "悠扬的凤箫声四处回荡, 玉壶般的明月渐渐转向西边, 一夜舞动鱼灯、龙灯不停歇" -keyword_note = { "凤箫" = "箫的美称", "玉壶" = "比喻明月, 亦可指灯", "鱼龙舞" = "舞动鱼形、龙形的彩灯" } - -["蛾儿雪柳黄金缕, 笑语盈盈暗香去"] -note = ['描写元宵节妇女们盛装出游、笑语盈盈的热闹场面'] -content = "蛾儿/雪柳/黄金缕/, 笑语/盈盈/暗香/去/" -translation = "美人头上都戴着华丽的饰物, 笑语盈盈地随人群走过, 只有衣香犹在暗中飘散" -keyword_note = { "蛾儿" = "古代妇女元宵节的头饰", "雪柳" = "古代妇女元宵节的饰物", "黄金缕" = "头饰上的金丝绦", "盈盈" = "仪态娇美的样子", "暗香" = "女性身上散发出来的香气" } - -["众里寻他千百度"] -note = ['表达在人群中反复寻找意中人的执着心情'] -content = "众里/寻他/千百度/" -translation = "我在人群中寻找她千百回" -keyword_note = { "千百度" = "千百遍, 形容次数极多" } - -["蓦然回首, 那人却在, 灯火阑珊处"] -note = ['最后发现意中人却在冷清之处, 意境深远, 成为千古名句'] -content = "蓦然/回首/, 那人/却在/, 灯火/阑珊/处/" -translation = "猛然回头, 不经意间却在灯火将尽未尽之处发现了她" -keyword_note = { "蓦然" = "突然, 猛然", "阑珊" = "暗淡、零落, 指灯火稀疏的地方" } - -["静女"] -note = [] -content = "静女/" -translation = "静女" -keyword_note = {} - -["静女其姝, 俟我于城隅. 爱而不见, 搔首踟蹰."] -note = ['诗经·国风·邶风〔先秦〕'] -content = "静女/其姝/, 俟我/于城隅./ 爱而/不见/, 搔首/踟蹰./" -translation = "娴静的姑娘真美丽, 约我等在城上角楼处. 故意躲藏让我找, 急得我搔头徘徊心紧张. " -keyword_note = { "静女" = "贞静娴雅之女", "姝" = "美丽, 漂亮", "俟" = "等待", "城隅" = "城角隐蔽处", "爱" = "同'薆', 隐藏", "见" = "同'现', 出现", "搔首踟蹰" = "以手指挠头, 徘徊不进" } - -["静女其娈, 贻我彤管. 彤管有炜, 说怿女美."] -note = [] -content = "静女/其娈/, 贻我/彤管./ 彤管/有炜/, 说怿/女美./" -translation = "娴静的姑娘容颜好, 送我一枝彤管. 彤管有光彩, 爱它颜色真鲜艳. " -keyword_note = { "娈" = "面目姣好", "贻" = "赠", "彤管" = "红管的笔或红色管状草", "炜" = "色红而光亮", "说怿" = "说同'悦', 怿为喜悦", "女" = "同'汝', 你, 指彤管" } - -["自牧归荑, 洵美且异. 匪女之为美, 美人之贻."] -note = [] -content = "自牧/归荑/, 洵美/且异./ 匪女/之为美/, 美人/之贻./" -translation = "郊野采荑赠送给我, 荑草确实美好又珍异. 不是荑草长得美, 是美人相赠的情意异常深厚. " -keyword_note = { "牧" = "城邑的远郊", "归" = "同'馈', 赠送", "荑" = "初生的白茅草, 象征婚媾", "洵" = "确实", "异" = "特殊", "匪" = "同'非', 不是", "女" = "通'汝', 指荑" } - -["项脊轩志"] -note = [] -content = "项脊轩志/" -translation = "项脊轩志" -keyword_note = {} - -["项脊轩, 旧南阁子也."] -note = ['项脊轩: 归有光家的书斋名. 轩: 小的房室./'] -content = "项脊轩/, 旧/南阁子/也./" -translation = "项脊轩, 是原来的南阁子" -keyword_note = { "项脊轩" = "书斋名", "旧" = "旧日的, 原来的" } - -["室仅方丈, 可容一人居."] -note = ['方丈: 一丈见方./'] -content = "室/仅/方丈/, 可容/一人/居./" -translation = "室内面积只有一丈见方, 可以容纳一个人居住" -keyword_note = { "方丈" = "一丈见方", "容" = "容纳" } - -["百年老屋, 尘泥渗漉, 雨泽下注; 每移案, 顾视无可置者."] -note = [] -content = "百年/老屋/, 尘泥/渗漉/, 雨泽/下注; /每/移案/, 顾视/无可/置者./" -translation = "这座百年老屋, (屋顶墙上的) 泥土从上边漏下来, 雨水也一直往下流; 我每次动书桌, 环视四周都没有可以安置桌案的地方" -keyword_note = { "渗漉" = "漏下", "雨泽" = "雨水", "顾视" = "环视四周", "置" = "安置" } - -["又北向, 不能得日, 日过午已昏."] -note = [] -content = "又/北向/, 不能/得日/, 日/过午/已昏./" -translation = "又屋子方位朝北, 不能被阳光照到, 一过了中午 (屋内) 就已昏暗" -keyword_note = { "北向" = "朝北", "得日" = "照到阳光", "昏" = "昏暗" } - -["余稍为修葺, 使不上漏."] -note = [] -content = "余/稍为/修葺/, 使/不上漏./" -translation = "我稍稍修理了一下, 使它不从上面漏土漏雨" -keyword_note = { "修葺" = "修缮、修理", "上漏" = "从上面漏" } - -["前辟四窗, 垣墙周庭, 以当南日, 日影反照, 室始洞然."] -note = [] -content = "前/辟/四窗/, 垣墙/周庭/, 以/当/南日/, 日影/反照/, 室/始/洞然./" -translation = "向前开了四扇窗子, 用矮墙在庭院周围环绕, 用来挡住南面射来的日光, 日光反射照耀, 室内才明亮起来" -keyword_note = { "辟" = "开", "垣墙" = "砌上围墙", "当" = "挡住", "洞然" = "明亮的样子" } - -["又杂植兰桂竹木于庭, 旧时栏楯, 亦遂增胜."] -note = [] -content = "又/杂植/兰桂竹木/于庭/, 旧时/栏楯/, 亦遂/增胜./" -translation = "又在庭院里随意地种上兰花、桂树、竹子等草木, 往日的栏杆, 也增加了新的光彩" -keyword_note = { "杂植" = "交错种植", "栏楯" = "栏杆", "增胜" = "增添了光彩" } - -["借书满架, 偃仰啸歌, 冥然兀坐, 万籁有声; 而庭阶寂寂, 小鸟时来啄食, 人至不去."] -note = [] -content = "借书/满架/, 偃仰/啸歌/, 冥然/兀坐/, 万籁/有声; /而/庭阶/寂寂/, 小鸟/时来/啄食/, 人至/不去./" -translation = "书摆满了书架, 我仰头高声吟诵诗歌, 有时又静静地独自端坐, 听自然界各种各样的声音; 庭院、台阶前静悄悄的, 小鸟不时飞下来啄食, 人走到它跟前也不离开" -keyword_note = { "偃仰" = "俯仰, 指生活悠然自得", "啸歌" = "吟咏", "冥然" = "静静地", "兀坐" = "端坐", "万籁" = "自然界的一切声音" } - -["三五之夜, 明月半墙, 桂影斑驳, 风移影动, 珊珊可爱."] -note = [] -content = "三五/之夜/, 明月/半墙/, 桂影/斑驳/, 风移/影动/, 珊珊/可爱./" -translation = "农历十五的夜晚, 明月高悬, 照亮半截墙壁, 桂树的影子交杂错落, 微风吹过影子摇动, 可爱极了" -keyword_note = { "三五" = "农历十五", "斑驳" = "交杂错落", "珊珊" = "美好的样子" } - -["然余居于此, 多可喜, 亦多可悲."] -note = [] -content = "然/余/居/于此/, 多/可喜/, 亦/多/可悲./" -translation = "然而我住在这里, 有许多值得高兴的事, 也有许多悲伤的事" -keyword_note = { "然" = "然而", "可喜" = "值得高兴", "可悲" = "悲伤" } - -["先是庭中通南北为一."] -note = [] -content = "先是/庭中/通南北/为一./" -translation = "在这以前, 庭院南北相通成为一体" -keyword_note = { "先是" = "在这以前", "为一" = "成为一体" } - -["迨诸父异爨, 内外多置小门墙, 往往而是."] -note = [] -content = "迨/诸父/异爨/, 内外/多置/小门墙/, 往往/而是./" -translation = "等到伯父、叔父们分了家, 室内外设置了许多小门, 墙壁到处都是" -keyword_note = { "迨" = "等到", "诸父" = "伯父、叔父", "异爨" = "分灶做饭, 指分家", "往往" = "到处" } - -["东犬西吠, 客逾庖而宴, 鸡栖于厅."] -note = [] -content = "东犬/西吠/, 客/逾庖/而宴/, 鸡/栖于/厅./" -translation = "分家后, 狗把原住同一庭院的人当作陌生人, 客人得越过厨房去吃饭, 鸡在厅堂里栖息" -keyword_note = { "西吠" = "对着西边叫", "逾庖" = "越过厨房", "栖" = "栖息" } - -["庭中始为篱, 已为墙, 凡再变矣."] -note = [] -content = "庭中/始为/篱/, 已为/墙/, 凡/再变/矣./" -translation = "庭院中开始是篱笆隔开, 然后又砌成了墙, 一共变了两次" -keyword_note = { "始" = "开始", "已" = "然后", "凡" = "总共", "再" = "两次" } - -["家有老妪, 尝居于此."] -note = [] -content = "家有/老妪/, 尝/居/于此./" -translation = "家中有个老婆婆, 曾经在这里居住过" -keyword_note = { "老妪" = "老婆婆", "尝" = "曾经" } - -["妪, 先大母婢也, 乳二世, 先妣抚之甚厚."] -note = [] -content = "妪/, 先大母/婢也/, 乳/二世/, 先妣/抚之/甚厚./" -translation = "这个老婆婆, 是我已经去世的祖母的婢女, 给两代人喂过奶, 先母对她很好" -keyword_note = { "先大母" = "去世的祖母", "乳" = "喂养", "先妣" = "去世的母亲", "抚" = "对待" } - -["室西连于中闺, 先妣尝一至."] -note = [] -content = "室西/连于/中闺/, 先妣/尝/一至./" -translation = "房子的西边和内室相连, 去世的母亲曾经来过这里" -keyword_note = { "中闺" = "内室", "一至" = "来过一次" } - -["余自束发读书轩中, 一日, 大母过余曰:"] -note = [] -content = "余/自/束发/读书/轩中/, 一日/, 大母/过余/曰/:/" -translation = "我从十五岁起就在轩内读书, 有一天, 祖母来看我, 说" -keyword_note = { "束发" = "古代男孩成童时束发为髻, 指15岁", "过" = "探望" } - -["吾儿, 久不见若影, 何竟日默默在此, 大类女郎也?"] -note = [] -content = "吾儿/, 久/不见/若影/, 何/竟日/默默/在此/, 大类/女郎/也?/" -translation = "'我的孩子, 好久没有见到你的身影了, 为什么整天默默地呆在这里, 像个女孩子一样呀? '" -keyword_note = { "若" = "你", "竟日" = "整天", "大类" = "很像" } - -["比去, 以手阖门, 自语曰:"] -note = [] -content = "比去/, 以手/阖门/, 自语/曰/:/" -translation = "等到离开时, 用手关上门, 自言自语地说" -keyword_note = { "比去" = "等到离开", "阖门" = "关门" } - -["吾家读书久不效, 儿之成, 则可待乎!"] -note = [] -content = "吾家/读书/久不效/, 儿之/成/, 则/可待/乎!/" -translation = "'我家祖祖辈辈都读书, 长期以来却没有成就功名, 这孩子取得成就, 指日可待了! '" -keyword_note = { "不效" = "没有效果, 指没考取功名", "成" = "成就", "可待" = "指日可待" } - -["顷之, 持一象笏至, 曰:"] -note = [] -content = "顷之/, 持/一象笏/至/, 曰/:/" -translation = "不一会, 拿着一个象笏过来, 说" -keyword_note = { "顷之" = "一会儿", "象笏" = "象牙制的手板, 古代官员上朝所用" } - -["此吾祖太常公宣德间执此以朝, 他日汝当用之!"] -note = [] -content = "此/吾祖/太常公/宣德间/执此/以朝/, 他日/汝/当/用之!/" -translation = "'这是我的祖父太常公宣德年间拿着去朝见皇帝用的, 以后你一定会用到它! '" -keyword_note = { "太常公" = "指祖母的祖父太常寺卿", "朝" = "上朝", "当" = "应当" } - -["瞻顾遗迹, 如在昨日, 令人长号不自禁."] -note = [] -content = "瞻顾/遗迹/, 如/在/昨日/, 令人/长号/不自禁./" -translation = "瞻仰回顾旧日事物, 就像发生在昨天一样, 让人忍不住放声大哭" -keyword_note = { "瞻顾" = "瞻仰回顾", "长号" = "放声大哭", "不自禁" = "不能自制" } - -["余扃牖而居, 久之, 能以足音辨人."] -note = [] -content = "余/扃牖/而居/, 久之/, 能/以/足音/辨人./" -translation = "我关着窗子住在里面, 时间长了, 能够根据脚步声辨别是谁" -keyword_note = { "扃牖" = "关窗", "足音" = "脚步声" } - -["轩凡四遭火, 得不焚, 殆有神护者."] -note = [] -content = "轩/凡/四遭/火/, 得/不焚/, 殆/有/神护/者./" -translation = "项脊轩一共遭过四次火灾, 能够不被焚毁, 大概是有神灵在保护着吧" -keyword_note = { "凡" = "总共", "得不焚" = "能够不被焚毁", "殆" = "大概" } - -["余既为此志, 后五年, 吾妻来归, 时至轩中, 从余问古事, 或凭几学书."] -note = [] -content = "余/既为/此志/, 后/五年/, 吾妻/来归/, 时/至/轩中/, 从余/问/古事/, 或/凭几/学书./" -translation = "我作了这篇文章之后, 过了五年, 我的妻子嫁到我家来, 她时常来到轩中, 向我问一些旧时的事情, 有时伏在桌旁学写字" -keyword_note = { "来归" = "嫁到我家来", "凭几" = "伏在几案上", "学书" = "学写字" } - -["吾妻归宁, 述诸小妹语曰:"] -note = [] -content = "吾妻/归宁/, 述/诸小妹/语/曰/:/" -translation = "我妻子回娘家探亲, 回来转述她的小妹妹们的话说" -keyword_note = { "归宁" = "出嫁的女儿回娘家省亲", "述" = "转述" } - -["闻姊家有阁子, 且何谓阁子也?"] -note = [] -content = "闻/姊家/有/阁子/, 且/何谓/阁子/也?/" -translation = "'听说姐姐家有个小阁楼, 那么, 什么叫小阁楼呢? '" -keyword_note = { "闻" = "听说", "何谓" = "什么叫" } - -["其后六年, 吾妻死, 室坏不修."] -note = [] -content = "其后/六年/, 吾妻/死/, 室坏/不修./" -translation = "这以后六年, 我的妻子去世, 项脊轩破败没有整修" -keyword_note = { "其后" = "这以后", "室坏" = "房屋破败" } - -["庭有枇杷树, 吾妻死之年所手植也, 今已亭亭如盖矣."] -note = [] -content = "庭有/枇杷树/, 吾妻/死之/年/所/手植/也/, 今/已/亭亭/如盖/矣./" -translation = "庭院中有一株枇杷树, 是我妻子去世那年她亲手种的, 如今已经高高挺立着, 枝叶繁茂像伞一样了" -keyword_note = { "手植" = "亲手种植", "亭亭" = "高高挺立的样子", "如盖" = "像伞盖一样" } - -["鹊桥仙"] -note = [] -content = "鹊桥仙/" -translation = "鹊桥仙" -keyword_note = {} - -["纤云弄巧, 飞星传恨, 银汉迢迢暗度."] -note = [] -content = "纤云/弄巧/, 飞星/传恨/, 银汉/迢迢/暗度./" -translation = "轻盈的彩云在天空中幻化成各种巧妙的花样, 天上的流星传递着相思的愁怨, 遥远无垠的天河今夜我悄悄渡过" -keyword_note = { "纤云" = "轻盈的云彩", "弄巧" = "指云彩在空中幻化成各种巧妙的花样", "飞星" = "流星, 一说指牵牛、织女二星", "银汉" = "银河, 天河", "迢迢" = "遥远的样子", "暗度" = "悄悄渡过" } - -["金风玉露一相逢, 便胜却人间无数."] -note = [] -content = "金风/玉露/一相逢/, 便/胜却/人间/无数./" -translation = "在秋风白露的七夕相会, 就胜过尘世间那些长相厮守却貌合神离的夫妻" -keyword_note = { "金风玉露" = "指秋风白露", "胜却" = "胜过" } - -["柔情似水, 佳期如梦, 忍顾鹊桥归路."] -note = [] -content = "柔情/似水/, 佳期/如梦/, 忍顾/鹊桥/归路./" -translation = "缱绻的柔情像流水般绵绵不断, 重逢的约会如梦影般缥缈虚幻, 分别之时不忍去看那鹊桥路" -keyword_note = { "柔情似水" = "缱绻的柔情像流水般绵绵不断", "佳期如梦" = "重逢的约会如梦影般缥缈虚幻", "忍顾" = "怎忍回视" } - -["两情若是久长时, 又岂在朝朝暮暮."] -note = [] -content = "两情/若是/久长/时/, 又/岂在/朝朝/暮暮./" -translation = "若是两情相悦, 至死不渝, 又何必贪求卿卿我我的朝欢暮乐呢" -keyword_note = { "两情" = "双方的感情", "久长" = "长久", "朝朝暮暮" = "指朝夕相聚, 语出宋玉《高唐赋》" } diff --git a/data/repo/cngk-t/schedule.toml b/data/repo/cngk-t/schedule.toml deleted file mode 100644 index 135f1fc..0000000 --- a/data/repo/cngk-t/schedule.toml +++ /dev/null @@ -1,11 +0,0 @@ -schedule = ["quick_review", "recognition", "final_review"] - -[routes] -quick_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] -recognition = [["FillBlank", "1.0"]] -final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] - -[annotation] -"quick_review" = "复习旧知" -"recognition" = "新知识" -"final_review" = "总复习" diff --git a/data/repo/cngk-t/typedef.toml b/data/repo/cngk-t/typedef.toml deleted file mode 100644 index 1d06672..0000000 --- a/data/repo/cngk-t/typedef.toml +++ /dev/null @@ -1,17 +0,0 @@ -[annotation] -note = "笔记" -keyword_note = "关键词翻译" -translation = "语句翻译" -delimiter = "分隔符" -content = "内容" -tts_text = "文本转语音文本" - -[common] -delimiter = "/" -tts_text = "eval:payload['content'].replace('/', '')" - -[common.puzzles] # 谜题定义 -# 我们称 "Recognition" 为 recognition 谜题的 alia -"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } -"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/data/repo/chmgk/algodata.json b/data/repo/stub/algodata.json similarity index 100% rename from data/repo/chmgk/algodata.json rename to data/repo/stub/algodata.json diff --git a/data/repo/chmgk/draft.txt b/data/repo/stub/draft.txt similarity index 100% rename from data/repo/chmgk/draft.txt rename to data/repo/stub/draft.txt diff --git a/data/repo/stub/manifest.toml b/data/repo/stub/manifest.toml new file mode 100644 index 0000000..3eadc2b --- /dev/null +++ b/data/repo/stub/manifest.toml @@ -0,0 +1,4 @@ +title = "测试用单元集" +package = "stub" +author = "__heurams__" +desc = "" diff --git a/data/repo/chmgk/payload.toml b/data/repo/stub/payload.toml similarity index 100% rename from data/repo/chmgk/payload.toml rename to data/repo/stub/payload.toml diff --git a/data/repo/chmgk/schedule.toml b/data/repo/stub/schedule.toml similarity index 100% rename from data/repo/chmgk/schedule.toml rename to data/repo/stub/schedule.toml diff --git a/data/repo/chmgk/typedef.toml b/data/repo/stub/typedef.toml similarity index 100% rename from data/repo/chmgk/typedef.toml rename to data/repo/stub/typedef.toml diff --git a/pyproject.toml b/pyproject.toml index 4caf643..6267638 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ license-files = ["LICENSE"] dependencies = [ # 这些依赖只能驱动 kernel 程序库 "tabulate>=0.10.0", + "textual>=8.2.5", "toml>=0.10.2", "transitions>=0.9.3", ] @@ -49,6 +50,10 @@ basic = ["heurams[algo-fsrs]", "heurams[tts-edgetts]", "heurams[llm]"] Homepage = "https://ams.pluv.top" Issues = "https://github.com/heurams/heurams/issues" +[[tool.uv.index]] +url = "https://mirrors.ustc.edu.cn/pypi/simple" +default = true + [project.scripts] heurams = "heurams.__main__:main" heurams-tui = "heurams.interface.__main__:main" diff --git a/screenshots/about_1.png b/screenshots/about_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b757b2b6cb1da64f3bc3ac6404d75d2e435d77 GIT binary patch literal 359601 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ξfFjM^!i`ZcD_+XJVOLuX^;E{wnnQtaJjs%xWZzE=`Ng&+Sz(i40 zJwHh{-AXQNWet^}2h_2705AmSiR{?eLj-THfkojRvOF?vZA&O4vtfF#+_lZ~O(z9ZZm93L+QyrRT8Y+e)GuacY-2y)=8rPEpt9_ahda#}O5 zKDysp7eNHL@jroNPEn88l&&s=KND)(5-ACJCL$)O*}?$?W|bC%R^1K^0wV@&xiLaZa3xdF?52*H<*DhI%4s&eIu{Ex_HzoCle8PZ`Pm^ok$4%%vYC z=GC0ujS4=nktmm&%k=Zp7LJp%=R!cWN_ckoxYWWY$d7X!L6#lRMXI+{U6&Xa7Y5zU zbH4eja*Rgt?W9=kWwwaBu>aYwHpt;PTbrBLYU_j!_6`>|z_)fX#v{&f5seo_9P$g` zkR9se(qGQG4Qr$WdSo5H=Dph(>$O_UDCuG(XHDM)1=oH)4YU zkKBB`I^nLK89uc)ls|uxH*o*(2-0w>W^8dVl`J?p&;6u}9yw~u)$EyY>>m&1%V0x# zMO0q8iJb|#poG6LS6QU*u~rMEz33n|Ii&mP8B(24)rWLHPp5I#r$Yl{KFftJ*Y`%;BX0(+YtRq*uBN-i?u|12B;eTDOWIRkh{l%W!{^JAO}}gNk+=ee0wG@AoQn)<{9zg*svXQ|(lfcj=G zhch8H$u%h~D!S&Lv8oCb6({wk^%wa*Rq;|%Qb6Zi8O~@!@B0cE-2Fr22rie)nwuMZ zYznPL0xhj1JNwT)GIbGCm;aXET>5)Ywf9KCe0`fYMmW_`70UILc`0mmsJoLbyV-&8 z4tdetZH5jCDz4^U$_(4u<?`kJ751I{reM_ANSHpa`5oCrqJ0@ zIf+U6JENncf%AunR%(hEo>eq!8IWIQ^Lla&=1Tw&0-M7q&q#RKm&ayW+(1px(i@ ztm-62v>UX|h(V*ndRNW`3!kT)b}Hsl5eO>nj#Z!E>w$rR9AMaIR>u~5Z$`_$0HS5( z$@>hf`oplWJkaCtlUxC+kz1ov^>%d(i3jX9Ct{-n*df0mDwRzcTfEAZ>vGS+l(BZo zEnGOJVsk*C)jB&f^CZcyigtH^Sk-0Y=v6xrG!)!@-qc7g%z#Y1+4n-=XcXzJ`tj<* zrdPPFjva8`mOuu>hH+FI*b8A*o2z59jx<5kq2UOG?$)~_7<^c{$C3+9M#m;m(VP`_ z{XVg*%q&rXjvsS;MEhf8OCoH855lF?**Kc}4zaiPK$u|Y3Y%he^~m;5BBWou9sHyC z5`mx+IJczeHOc8I;9&}^K{yZoV1qVs4GTv4l=kFV$li=(6%O(A42wlk)0scUZ$uPr zkSYWUuaOv1xxno;k~g`*^o$!hcQV;oRYlw<>hA zQ<;xYJ)qwrNSqVCz2S=OCYJj*f|_P8%O&XE@%-0mt=J^uOqWPtHj?qLgACs>bPD)z zJ8f;8!g73uc{dOjdvH%3?CRxmiI?z8-t38&ccEp9KH$B%v$x?xx)d*WX-S|$dc08yN zEc|Os4B~lUkpkI1k+gpbp7iB#BG5ESitr`fG9Us5@prjvcw@|`rY2htBuI8TG>6x_ zbqk(|$gd~{9~~P*FD?pinA}fMN0gm3Nl97h8?YK*yelGOAY^*Jv0uVN6nrqd!hRNR zmTM*C9>#doV*T9(b^fD4=|Fu%;mxpIn8Y>lA`;07ByNU8N;=!G2?jI(5Cwbb?fK*v z(W74r6w%ksPyGrqgL>cpbOL0cUVOa#&*FyyMsZ_-QMzCAGm$P38!OnOK4#?Z{z14? z7U=0yKm;au4&**OGE`ISa|N3(!i+?97{J?D& z=s)K|_cQc>r+unxMbl+p1;Tb(vhkZ$wP{%_L3gbU+icP8{1)%pLZ3^60Y~)MVNyw{ z96#65Iq{#{7RlRMqEMRv6t0Jf(ljX z8*dLndO=FeKJEL)tr@K*En{v?bd)g{<^Dc4h8>5OVkj^ z6W1a^G*YdO?NF^P0s$ECg5-R&%u&hI<%nCHA$82Pdbk+~T5J9>#evF^*-ti1v`xN zGmu7cyy5%WHbeO@Lv(7qZqsIFCl0(Pzx;LC`DSmrl^zw)o_ceA0&QzG7@RQ^LetISrjrPc-&X=rGO3nURnM$rq6!W{%pKkDa)iMs_RKLIjH z87#7@?xHw)^}VTN~0H0eWPRhw*O^_@=! z1pSj+^FhA#+(Vd^k8v{tclQm~WO;dRi4HR>y-sUpp{WJK4V>iPazKxc~!t z$3);;bMDHyo|)MK{1Et^B??tJN!nnHx-XJ|(48N)uz^8r?pJRvl!NmPWiX$AYFJ1s z30%`9Q@#9}%DyT`ozF(YIlqK1e<)a~WE0oQex?8yxL>{DuXB(IYY}IWE)y2XhJ03c zsJQj;^5bLKvjfn6h@&5&Lyc@1Jb@x+9uj-?5@Zo$wHbE_cI7U;LVa@0@NH)1k+9o( z5tXk<2SIvf+_Alf5kN9o``$Zl;Nf>mz2m)-Q&U?PpsUPw=|(#bl0ijhhovLh6Pfdh z{H*^6P#7KgfbqF0noi4Iy?_K&)Vcz=LRmcV3I-=ovfNTyyb!YjlBJgX;vjS|x}>&Y z?S&VE8L+{dERtB}uaXt1Uh# z`u{VS#^L{?-sn66HY`H8M`n2`ZuZsY8uhj<9BIOX&Gj2P9|%|4fORD z`DKMRH2e4O9Ss^IaP!o|&46kQ$Zr4JxC<}j;2cAz;Q68U7D3EfXJyZ-k4DoLPde1w zY|H14Cy<#_u{;jD8f3vd+hl@zm1!4X1zD@}0);n#KYu zd4D2~HOj_j)Ws)JSgS*!yk`*}(et&`Se?1TtSn!8fEG~EMB>ZJ0N#n1iU`RgHa9jp zLMK;LR2^1Q^n@ekY^!Lj0f^|^hlY@7zUStYEtw+RTwywtzxcBGD@>FY0lL~xyyev9 zLXg(VHJ8x}3Mc$m3&7heDzYJ+S{;cH7!n0ceK$}R_SQByIJm3XC7|%a(&t3pWTfQm z>uA~7`Q!~AWPdZdK@a4-R)CT_n(+F)GEFHMV-ma&5UYDw7fD|G#bE&N+U76d_W#@H zoN&7OdW$go*7dpZ)0{ceX_X|@*|3#*ZO3W3O_WeIVk%(uQyU%UgK@gr9XE1!LKr^P zt8d(|FWku3S5!hAco%&219XF<^BqvQcv5_VVtnHVWYv z%cohkAQ5>~#UZ(auHirRJvw-8hEU6kIPVQIQVONDS-)R$IKCeD0vxF=hpsrHB_5QF6y)p}$uO#@4L>(aHj z$-C1BRS|u~pb&2dZ4u-xM5=CyZLr5kg(iDl!8A?jQvaJvkK|#%MS;q{zQUAiA{oJJ z@O`{Pc|e|osza$rO@r50EKV)~&7>snc9O!?r-gfuP=I7rvchBgdD7dHL8+Y9$6(so z93!vKh4G#~J~Cf6Bte&8GKIITA1Rn;m6p3+F2Qg;yYTu56$i(mQ7NpbP}XuQ_+fs& zV9^qZjYh|0N>;Q;ET+hBu2RXvrj~KbxByWx_=Ui$q4GmYKUQjyTeEbsLxnTz)2Hj@ z!E2-~-Rw3^;-hOI4a)I$>OU_+R^XK9RCnIrrV+w%$a11=B;8Nr2jsGwu1EV zcuziPStJ3(5-$QM$pjibtet%DvCoBqzQMuVg@uJqbzBcU07Jxn4o<(7%yR}&Mu}Rg zmAN<<%dq*xt_xF&dC|Fc@!zmR@xP;k3&KQeH|!cyT7SM9vbBl(F6?nfBjO)HT5m`p zC9WRv#V1n^<%%aPxyI^uCzvGUQEca$u*FA|h(&2v&b3X4(ALm|XZ4nHbjQyOqW@ zc}UI&Rcv{dbBufH3&hX+AHMjP=4DwtxK<3Ti@oD!UR`u}%LP!ac<9B>)5|V+9OazE%`Z<8A zY5QgEj=&-KamN^VOTxRe8+N3!VsNm^VO;47uT_zL-0?`Tt9`bV@NzlyS=UHYgsd$) zZhDfUM3UwDe7~Z}onYJxzS>R?sGm%=Em_If2)vu^=rLz@o#TkqSR4ZO+6HXqC> zpvY5>b{wS#Y%oY(GkctOd`#O+XtF(4hyMMNu5L`OKxH3XEuebC6^oMvrPpf`|CK7{ z!}SL+vG>@BsBWjsrl&f!23oZ?33X|`px*$ z8nczim4G>rDlo533-SNH$Ia<0Y_@Jh1feiXaID;~Om&hQ=bq_*rHR9p7}MGvAG@7! z!0mgR9v{1PfS}ApD0VeOCb{5>ZRe$TtwzHi*J&E~3on~ZF{isH&ab@Gg08jI0dQJ==SZ+cd=IvuNNH^xKN+yeoCY1?hfDYhVA|(gUVLvj^Ah5r4H5WzwGii zfX32k-jEb|>uFk(o@6a}QFl<^T`tmd`%J}d6plFG?jK(CiHZ&KmB_A#mFL0}G&D7H zQlR_haLG0)4n^zIgF}3d_v!h!<^KBLie<$NTNdp{Yt7@>?hXDk9$uA78nqUBv6=2| znkC@Lex;TB%N!W=W?}cfF3w4MMz53_LtpS;@vimGG4j=z5tQ(lw&p8zXD4xCdT5HZR#~5=S)**E>^V~}(vst|1cBZ37_lCq3&Mb9)&?E7mfd{~= zW&hMa3WHqGcXu`#gtLG`>U`ILf><|$&~?Zu`#NnxQb@<9>(x_z9f}96xR^y}Hhent zJ?T*c?<*vX;y9 zg^$i?e=Rb~$xLn&G|LDrz3?7orwFil_X2(9;7s>W!S`tgA%6Ng9alkc$(Yr9#HUZdWh=&YcLOtIkE`swnNcK{5R4wm9GYquD(PG z`xGTyNh*0|$Dz1uTJ)eesmaixTeXoE~1_`JZbQsQn#_;kqHuFcGem z#$9ihcyVXYE=!$S4Z6{>(Nqbs%WGdFaTLXr-mAn4+N&e?<VlGe@@q{)zFi zrIl-An|v$RhpWA9RI|q$Ig5*)ebL+NKX+^{tVlS~O~-F@fH35A*b*glS37NM&06r3 zh27)>+S*A=W4F7%kFd!6xA6oKYNi_Tir&h50{gX(w)#%-Qa&_IH5ODlpB!^;*X`9n z^Lm`ek^J!TpXagkg-TvImj6r^`H^M#km5DCZRySOrF^2ypsQ+6p zOm1u8W6JLj$6|0p^_97Hl-O?8*XmhJ|G82`wuKe&!Jyw9h)Ow8tZYP*7yn<={$}8S zm=F4mpM<-T8tBvJ;!n6XzP`w6WG4*yZ;wN5g{O3T2G0KXz}fo-wna`eIvq_d%I$wc zIP8H7VuC7pw`+mZuwB67P@-edBm0|A`TxdKs2=bD1Bg>uk(=+WubhJh@83Z)MdwfX;z#i6%H<4hu~yd<~nK zvy1D`0skFZ^GCk=X}ICpNKqF4Mp}3yD!0vCA~{*l#tLL^nxP>>hv(T0i^znGdT@ry z|8q7Vgz3s`%pP(jd53_v(WGZux2##^_g1(sD}PIFa_*w;tW#_^`_3%hOvHarQ?lWn z-u(P1575!1$jq!B@Jog6k`)K=pk$f&!@#s3xYBrbU^IH*_@-(7Z3*b$|MLn&YPU(s z&oFb(%2Ma153nyu>Xz5yP++sfK-|WQHMRzWd|WA%cX}+BmqzRIjc|L=0LhGcdq|?5+<-V(f5Cwy`uq3(9vy7Q$d`TVGrF4mzeSoQ~`9!C8B2*RNg}lMA!Tx0>^ymM6#gY3r z$+SxUBuipSn7?AyOJQp*BKX4mWp>}B_^5EJ-I{XL;3$$tQ@$HvG^T}frlYY$Z?F0Y zhl2Qjzs_wGezi>`dnqy0vra2|^G5^G-MElRy3Kt-I!1^_@>66hnF;AVW`D z&q|24@Bg{K|GY_m7qG_>a5UXk?`RcP*><(EE$Ok{-chYjS#g76D97)9zl(Z}sl5=| z$`Me?j{3h}(G=nTcE5PjJ=Sx&4XuYUZ7cNfPjJFQy}UV8d!KOsEoQGWZxH5yc@2r= z(4i^whSePk|moLqNz}9k;R3wF4S8 zn)pnyAcEC$R)CT|PN_h)+Uh|z>zl~GAI;6&;dpGh9;TFSZG5JzQNQAPhf+AW?9MTg zlGHkgh>1st(FABP^wl!VN(gINq2ast7Op($!YfH3FSz`_;oW4cx0`}RGP6ryosN6B z$NNK25>C^P9~mzePHehVlqauAoXX>>&WiE#=eMliH_O4X1-A}!@I}gnLNmh*a485| zQ9(hbl<&daxQ1a|HI_}8!xd{LQJu(QhC>m{u?@phXliQu>xXi3aiL-pGTwWtE%ZsL% zre=#RJZiKFRBM~!?@m^gb37dc)ClZ|TK3@&?hkNO#| zKPxDWevq;e_KyQ`sNlXM{c{ZLZaS|;+I~LH>`pXelZYer^bDlHpb%6Tt$5LEw+Y!R zGNUEEBeVhj;X=`Y1iHNkdxm+Q7kvJ~w4O38cYmeepF9Jz;}(2H%M;1II{XEB>;@&_ z9Np=B0eX+zeEXV_0pMnlyp<|cY@r@QyJ0%|pyrdL?I9bg~$6|&33qJRA&#ej@T zOQXZ!wM$J)8#AwcxgXiyrR?eKjJ>R3wYPT&7*dJuGjwrxkBv_XW@b^EeU!Mpb%~9O zqs2&(?;eS~^?&!e&#ZZPdB;pya|;R(Qs70YjzniecFGIMm{ zS95~yuB6_O(C0xgjIXc1Dm{DKj?X%mWsvgcJm3B<1Ry7Qqtz; z=7)3>=A@hwNwl?0|7F~+NrA zkE%#ek?0no%V-Ik_jnR6N;o7f^q8isxW#x6<6@0fM1vVOBo;GPtBE?^*z6kr=H`;b zP?4zc&<6XbEJB}}r^{6%aR_BMV&^i>W^}~C3c(>G>yP=mmZ;UIck#avThg~ClglW?a4Ofp9Rjw@JXq|#*(~0km*^zwf&heCBLNPEf;NweeU!|nR`QO9g$b--;g#!M6pn+A{J}(keVMKo9 z9~LJZK?@1}w;pg29M;qi`WN1_^L~8?1H*FCa}q2UX0ljpgW;Y5bNc8|x;JxU7`MTJ~AFdU7YcY?>vz(<-qN6_z{^dE)o z#WbCsLnSQiDFruo(B!1DukYJJ`K-4)BN-GVo!8Iea*g&zXE!%H9RUb(n=iRF=TG%I zYez>`#21&Btc`Vvpm!(&`syI5HzqcAkKgona7n}Nh(~DRV@GoBLBJ3+`0SCi<{KA- z4iUWx5|)Qp97AIx7T1364sz5to^Ch#x-V`2C`g&D?!`5moztWdOrYbXL}eq6m$hr% z=n~5{^|r%Ma5$Vc1dQlqQ>B7m(nl4frWKS?69aP z$*s@F#=J&%MT`r}Uq90|dxMGTzWtt_=L;9vS3bK+~jo5{3PJ?u*q99ckCB$wD zQrk1s1FV01VI*8!0fLbCm2N|ynVFfT=gH9Eo{jqD3l+&aI*S!^+&HH?J3;57Xz^4` zYHI&=TGL`&M1=iv(s^BjdL&i{Hp)UHs(uA38pjtJWiD45sQ$PJA}#Y3+V` zKtY_z7vjfY0ensK8UPET^box7k>~iz-*H>46gjQE~ zt!PBP`$JjuS1s$$zyx}*2=q^P6J8&mHw_I9r#Ji*u&}V1ZZ2$k*v()Y{GFN#pov!C z@wkm5564^Eyfoe8!eciTFgJ&vu@S)=_OQ0L{xPgqY!r%Rxl-u|gQAaQ03O6)i0sKy zF-+QL=l3B@*VD^a)6=v4qAIBbVzpw}yM=B@jib7GT7}7HAp)nzb}=(Hj9Kq0N}Mpvr#imo z3chZ83r||TV&LO7Nl)i(z8L?)klY)A&(#gn#fSkq$=?vJ_y*+$HFG~dKYN_b6_6HS zXIbhx4S&fxqDTwaYXXUvr-gt+%#@|ex1O7t2MxH#qc zYVbL1mWVkx5`7>a#@a^)0-Y%W-u_VSjxe4b6@=#c;~NmFR_~P)T*BDW+Uk0;^a9sq ztl8qyHz*G>EDnz;1X{2^YG>eRxy|1ZxYJcH+R#MWEUg802~sp;4_2i3_@NPO9nXO_ z&xbcr5=NYxK_AqGsN)rzRb=cPE*j9xj?GL^($fk26A;LlsKzq=k>C;kjf_OLv}h9N zl);PrLc_=RFOOtk`hNVO!<_mAcjJk@e75()}&MxjkRCJ?--boemD#koK-ZMb!@ z7F${0zp~J5^9V@cu!&8IH=FvIFHRlL>@h3P!^<<<+QYN56OK0~A|^Vv*A-zo-x4rk zG7R7RtJ3C0P`%bt^2S7;0Q@0QXgD0XLR6i#h;cqOvr_3$f84lK zCF+pOZbrMSz@t*4X;8l|nx}a7K zPvMSZstFNCudW?OsOQw-W_^m5uyu0i>YBrWfq_w`W@~J0q>PvHn}~>wMTZaYEh#A> z&im{>PD(++vaz97V=FZ>B}qah;N?XEPC6nn19|F@BX>gd3JSX+}%@s$d0zFP^g^B=boVB^^kT} z9$~Qh!)q|*CAMOLWbNRNk{W{F>Hbe98V%q1cjX8*%m z+p}@9=UWGy4V{lYB}ptUCw_Y>BnXDgI8((zv9W1GwFev!w%@-O2)Ql{zf)67(rib4 zQZ6erfz7g3elaSctS7AwwBvu`3^Nq%S{|8FntYz7EOaHH$(xdwAOE&YhZz}@Jm6x7 zz|xH8BqfEQtNJ;-EAM5P&12Sm`5PC*Ov;pq8bG+UW zs>JD|+U6p6cRmr@l8XOU=RpPzn3t!H@kN3aG?clnE`-vGXHae~Ktp#}KM0nZ73*cK zu;{h**Qe}BUbc`boEDq`AT({j8vm{E?&@I5sApKq#AWuA2Z*HJc=$B23O7r|1~Sh2}>CPpPxLNjFmtCA+*?-XJC={Sd6&5yWC_ zf3xh#%)-()G(^Thk$9Mj-<%`)+1XU?Xr2uW{^Hyj&cJ4mjZGOyZM?YK+6idky`vM0 z^o$>rz6dV__)f74KJefp_jjV`A5x{SM{2Rfbzrp4=H*SD<(zQ?yYae)4Vp@0j69-% zls$Yq!_$NadA!80t3JeBMJiAu3tN$RN+dD2O_nI=W@5Zn+cNl^w(m)|rItYbsQ>~Z zGQsD;CHEVo^M^{PhhUKH--@;=LG9v0COnnVJ1{`PeytZh?zz`jRZ;i&Gyw4)4L_`12M1%g=>Zf1 zMZYiLuRFLJxdP)Q)XU&ch4?B{lhM(o;rLFHfYZxz({oaSn{c=R8vuqae)^y92b9vvt1rsFt@rnnyh7K3=OwN3I#b^;c)3U$XojI z;TnUGba}WeGiu)7r&Qo_;^|_IK!1T=Z!t#iX2-T%#+l6BQx5krT4Ur{1YaLc0DMG0N#Uq)aZJFrBQFy15$VxBAJ3}InMpV=1xz`%c_sy@lol;rmdab-;t4# z_eI)m9ktO_Ez}N(WwZ~J7_)X0y6%$3R@=T z!Z>yY9&zwPGeyTH;38(0p)@ zOG6TY&pqrn`wc8Z4>0m_eSh{H`#C<)|ucXawRv!4rd!f`@d4BJn`oiI3>iQffaK8D)}{4I~ud`Z6sD*z){~dCR3HGCe)Lz%z)QVV%_kg|>(DE#bY< z;kv9pfB(Kol2$Qo&q#c{SH^|EG^C7IS@9kohTlX+mLQGkF{eE}J0s`e!7o(qXuQCt z`;0&9clwbbmPE>UHnH{DrV=;30_?F+jyR8NY zRNufLS}M=Qr2$>L6jugURGzm57qdTz`K3S$ladF{*a%kj>muSw|H<=4nvJ&RCv3gIp92Tz4<@Ey5^>rY_m;#A ztIV3RLcbsshs|$)33lxa_U6tQ^dxnt;v_4|eqvwO!f0GzLT$K8nGY8Pj$2bw4tG?D z*=<*`iN(Aa!F{pnupmn4-mRP@Z=s+1*8fFYnSd>qg^4MeMT!hS(#cY#l(f6G6kw45 z1Zr+Njk*--(ppjP-_9q~@%{1CXU{b#ee%?5jrvrIKH_Q1+`ChD1~`1m1s+p)3eYI{ z0+H5Qdy{$G5Ks4)`NA+-W!^AJ$IezuMPyeO2&PYsmQd}F_suc^xnv+dPvo}+Mb=|a z+Q+cSgGhfbrO#a4j-?c28v=;*?r5boWw@95~5tuvs2h*nTlYcywrgt^R78Nz*Z zSkKkHeoOte$W(=2(AU4tYCb9^Rj4{&=BMfGXs(u=n>y|RyCqtP0wqQm9t&=va(8xy zcjbrk)Tk(d+M=&GOdh7u#E@}PWTD>A0bKkZ0}Yi1E>~9^0a{XII8tPLd(%iP(>!Ta zRaKS|6CfZhpXv$Q4n)Q&aB`tyVD!=$h(lI5&e{8A2^5dTXdudc871YfYq4mUaB*>!Xx4U%K#%6QWA`V}4NO_gz|j>T zOt8HM(&*S6mQNV*&rkQK{j=cO;pgkjgsY9Wp~{%!r2-N0M9q`wb2UUnHroe$goD)T zt^MRJIY86pU{&>SNK`Ug2hxb$C{>}buOCv?>}-(A1m%8siB#UWuHjSt&yXf_3EtI% z1L4=l6wzi@Ia?8ReKfzix%n^RBe%jLeEs@)5z)prR zakPB7wpP&=9&GAG8U|Qt-Gp&aZfz%jfUmP&7>>^Av2}9F^J;Ap5z}HTmZ^5_R0r%1 z0#qVpu3=)gal)RJr_1{4&sd%_;Wn93hC$1^M>u@tjx2*UGSK8j*gR}b+E%6Sy@|v z>H)O9?cF(MOiU~woK0(+l*K@}57KC2d)GA5?)ktD4xlonPC5+AagJg z+St@6>6x#2xDU66)3`xU$kXeDCJ*!lB~=tCP|B8?9E#ub>*$E7$#2^%*3A8r&!k}d zlaVijmy*|2BO>sly{pkcUmr2h7k8?2?{Pd-M0~~Y;W`a#W_x=`gAT zGj&LS=`ieF^*Nktj^|w8Y z&_>4PBd8YJUhL?1!c#B1!w3Q*BT;lbFIu~vI-X!qZtoY~_Rt$#o=lB5~gz32ZBWr_|N*tWG&&AY&bNhQH~p^Wl0><3o2l=;psFSGdJnpX*qLg1^3*x~ZOC z84o9Fsq^Vp~uq6=AV!jzR(yUJe*h8p+$t9h-uN~zjF8zhW8b-V}XlP5S~o!|`a0tTzzdc}BP z+Uoa|c|z&8t|W(@2FJPU9aT64gD@yL=kMP+Ce7Kv=VP+t{0t6eQd)gmV|BqpMD+J? z#XG9`J6*xh-PKKA%iX=pE70-r3u@5p9Wfg`YkygrE?r=?#uo&{CE$^@W<_&hrC&}B zgbAJiUiNjrIlh?USb1Z6;w3mAyiOb~;bOJ;E!}1*nI<~=@$mxfJgnn_E;==)V^EIY zqYoXu;+)KF$1We!qikvl`?HB*0(~w!XIw>O`T8X20DXK=y2gvQ&XcBeh=xv zQHYCow=yRuy5DpR4TTp@@R5%HwhmGz-iWWvF$MdwI`L5~aGd9>fFw~Ow|u)cZ%Q}6 z2GDiZ4|cvN6I}@c34kCR5(ee0uVfBO34T7bTwy3b+x~KPMH)0+c3!nK^1s6N^7Dze zb4r>Qk`*p}<R7$lQYD>1GmD)>+YDN z;6HpvM6ZpFxwcDLFcJE((fJAbVw-{S@@O^-lEK+>WSy+tb|+#_o1D7n6FlZ8P>0mi zI08Be%-_;GoU4u;X}|3sr3dPwRGu*^_EeFIUT>7o;c{!Fa1cTykLR=tez$K;4J-3F zOM}w`J5^yJU}ba0%m>57rUA>`JurYCylM&YSyV&aoEq@czc0L1T00d1-5H(c8)oOM zvbwYL#aR~l>@7)baVWx;u&|x2?dtf}z`w2@4e62SloXSgY(N$yHZ-^ZjRFo9b~Rmr zx^i6B!-GdWCN_G&skSmCM7@-pfuXz?*{DvwP}y>}VeX$2p+J1W`pimVjQ*CZ_sudd zU;164yrl~?+}MnGWe^^RHRBP<1qMU6_W@Wua4rI_@Ho`2ibg7QKWNu`L5|d#i^h_N zn~t?45$Ut@5&7`CUyqf7vFy&KBl~Oz(%tdoZy}w!T*H;lu&|%-@43Ff$4ePi$zsAo z<%mbDZY}e^KIsX*R6$S&KqyX(-|nZ_0Nx|}WS|v1hP8zgug$jji}@6Ea-8h+#3PHX)J$WPTIc!+-CIn2n#nRdeQnYykJ_Zj&H~eQoDJ0AW#Pt6%}n+)f0is zcPn5=_dH`_l@PPyz#AemvUngeWC42CQL;eU z+1@_ay}m4v%U`qIt8=xHHeM=;a}DY7>FLhy`0ZQ2w|&F?#u)*?igHIZflaT?`~l+< z=GtPW9M2HKWH@c3BQI1UiqY{@0D@YDb_5LA0|zbC8^?RPMALXz=Yx58vKM4v=9Kv> z3IxB--k12WDoD##th$p%WrMzYGV-1Ou~$bt;#G7bZ@q#p)u`PB4giOZZlsu)7+SXr zJd(tLv&&Q6za657OYQ=*mhnbkyt{^mWGJCCRYwRU@)W0S77edPzh7+AC6s^btH|<8 zVs<4q=n1dqX0Vl&Mb@Z4(S0l~AFXwuXuCTW*Taq`*41R>WRMee6AR38_CH%G7YaDH z)U-M7V%Qu^V)2N}F!&1iA)t#uBkqd3i9r*NJjUf3F6d3V5tEQ4J9dOFL>_OWx=Xq#}~QgKTfCr^nDPNJqQV>+AK4xeWOnF&RL(O4b%ly+*0+5uM%y ztA(?R3!`;^4l|6gDA3-Y9-hLUIBTMjt<%ouXgZVd)nZz$v{@GkVUN{>Yn|v?E zrNM=-A|knlqj+!x@Z%R4nC>gV2@(<#pZX}5(!@&1d3l#kTk1Cz)Nv))6qO}OsVwKK z!k;~L^2NgU@vEXc>?VJ%0bX3Cyf%HiTPJJpB5BP20xk z+FS7`V7qu#KuxyeEswaoUj%8RRf+eOYZ1Jk8&jKa9HGdr9>}tYTn~SZH8eL?diibb zM!dWwv!d-C8rrfqBn7}Yu)R{HluXG?XR}7iN~`j4Z_h`XI#0W`2|7tAD|EMnfWSIG zPF8MYb)QWsCx-1Uq+e8@;bQam5le!X9}r-I98f_1b*TYX6?J*x=6D5&Nl~k-s|Ee? zfJp=&V|2J1?YKXwFsn(qP=8`L-14?_C1-tqU1%to4FI10sFI$NAXU*iN8^LA6@uC>z_8 zQHPMr;G%x`U>apnt3GYDC~|YGwKtceQK+&nbzTj<8{QM?`~0G;5>}&sJ)SAZtBrR9 z&t|S{0xFzAjfyA$DdSk|y`-e2*MkUmP#t!VK^V#0Z=o*Hs*Yegm`=%4W05UQjgIya z%V8?PE>-z*b!wZ6|4~v(mYjw=B@k)fVe1_8`j}rpUx*k^QZhF$FH5CRp>QfUA1ifD zd;gLcP~l&TXEJLp?##mr%w%|TF!Gygri>AuI5jvjwfA(Cx4ab|_#Gaxk)Yf{sy-oT zEV{uT81O{e>8w3=oRkh($j}r285oFN=5^Zh04@(;i$ElpC8VIB0AL(9Jb_@z(beFp z@frgjDwbSbj<;HW3)e48_t9d*bfpXlkh1mUEfG?ALd9d_8(VEHynA%X?DRi%ZJnnv z@!j3mHCnFwzh!>90$LpN*@ymD_EQym8V4W$-EJ5Gpi+b3Y-GTl4wO{H1N2mDKK<$Q zeg4|}Lh+NVcc008Dzh^M{oD`9OH**<~!ADcL9*gZ_(!LfDP!G&MPJ+c-@J!m{4b{FN~@%$lG`WOX%*llcr#oJQWm z>A@vQcgN^>rL>sFh0`O9%h3<+#5iCJ4`f~1({!A=*nvV>x^w68hy<)Z zBKebtC(Q`YNBAlHmv+w;DduZjefSegEB4t;4~ARwwh-IS|~(wIFuWSV6FMr*(Og4Drc7) zU_Y7N2B{WS$#t>qVGUHqpG_vq@3rc50}181sw2ms+)D;+ zIvS66es3Z7##(7^j+YE>%6L1B1yp}HcZcoW-rw5;ZWovRH_EP}OvFc)klb7mcAF*R zs+lnwgNyU?!E1qOK*Vm07!9~SH%?#f&!rJ=4?;S+{&^D8d?= zIqH=#F!XGHPHgCOql_L+S>eFZMkgc$f+`I&CSicE58{qg-q<*Kk>i?Jd77UZFekrwi~l(2 zBxDR10c_-2=49dbSbJuJM#hNDJ8V*pwQx{k9KPSs-0bk&0oDA`Da_8v?v10Au>l~B zMBLmyuT2#J1>~zKT>yosz9MmEF~7@0ovT|$c4oVHKr}X)VEF#p<;hCo_E0i$yu{t} z1J~hvb)q57!_{US2AGG_6W?3h!u0&LI|4^^XE<%P$qJ^~`G{$kAZ#Y^dC!p6{lWX> zE!reCCZNO&$K);=+)wxx>P|#T6|)qJ;gI1wfa>*LA-h0rg8T=)ZzUeYwe~f&An06wS|3bD>35NBW5CLj$MFr z@W2NC%d9y%l|S&WgyGo~T@o@`!g^{S%S0}FO2g;m6__wS`4s{q$Jtm<#)nPFhnpO; z*zT5#W!9=H7MZw2>iCcqFCFt!)&t<(0!sMi_U3D$frjpc2lwOrj_9ypBy~;9u|^Qt z_IS}X)`C~7sYL|vv&hKE_*`yb>b2(Q^Tivtdc&H=gOjeR2WFF$z9alk{=i65VO(kz z+6WZAQgzk>i^So{5;aI5X@kG10v1}3|4&(@WL}{%L;G`twU$n{(*PFFOc5q1Rt!P0 zg3s-|XuRxLs$${HcmPZ~bQ-KC8~Jp`LG%{NDCOYzt*&={p|r}?wX+|0W$?JVs((D~ ztOs0Km~c?!?2~U8NEC{NxgZ(x@bE}fpEU<#pa2jqT=cF`xxdx@Mn}1ww^F3 z5_+g}+}O zT6ExX_HS7()h+E4sngH2%7)rYs1#3?tW*TI@TB?3XURt;Cj^FuvXrXV{Tovl2Fzmb z;2`UO(IaPr(*e7V*A<=8a(eHNXU{Qny#tkn?zcMs0|}ymuuJ7% z!C!Y&eZJY%jjpa(n4WoX0YZYHZA|(c5j#K(6%~}kT_XAA4oa2!P|!QrQW#+4o-%Bh zOs7Xj{|yXJ2xVSw_s*Cqo?!+s?Edn&?>s)AY6n6r64xgv2nP5FK51nRjsv(R2ND#3 zGotoVMSta^Qerz>?)bChIa5Sfc;LZ4*l?Ccv|4Ddf}LaL!m%jCoszQ=jVe{Ctnb>-*&7Kv1^=`JR*%BlUYa^mN(6pX(!0IbI98 zE?K)^ISJjdkuQidTFs8#Gd)4=FI;_R?Fblo9W@Ga$!<;uKw#$d+%B2pDt|Q>n9gP6 zWPW)tm$tU1$7ayV2WM}xOe?liZ0uWJ@WEaG(f!rF{q`Z3pvBm4opR(KU9b`2dY8SZ zmq!bD-#Ivt@p=Abb&5+!No89~Fd7N_zL77U9DFonx3fE&9F8=8v&3!L7qbEjk8CLL z(iZlSHwMUVXT$D<-*{1cj$IFQ^1~#h$UUVxfXk;U>^K9pGYHH9L5D^rFlL+w6qrIz z6Me{jhp1Naws>AmX(1{};P|2tZ&Od#m_g6os1R-?g@2{2Qu#lQ>FW6l#>#pfJ=h&o z?H3bQTqGztbv5m{5eDf-8@Xl)xTusAiv&n^IxW@SZLlnxo4?!~`V1BA9UQpqb2D*0 zQ+6_7R!`br$azURH=!CW@1$69!v&{rww4zof(3KN>`zzqVu1^S65uF|Sg1GPbh<~(5l7xx&--$?Ts@Q9{>+#h9WCh5vW1kV zN&i1dw#vxC!_xzxJ-vy9Qc_aV)A@$Vnu_c7m|bLiFvrnnn4wi7==#WXwt^1_M+#K# z1B72*Fd`~Kii>HqwY5dh|CMPrqCw1*tyDA;O=0hTejb5ix11FLjv-g~a}n|uwm#CL z4qWgI|1CBGcxCP%n6LrDLI*u@7b#$-a3%^A>b0%52etmBw?4>Irv40#WZ{Ci+r%r3 zlgjJz0~NCVaSPNdb7V17_PS)B*xU>wa9CoRoXjuQdRQdGI8;lJ2>JYf1|mtw${KeS zO<68iO%3Kyv9iXg5qbmJ)eGQm&;a^pvwnpMp%v=%a?~~8n-Zy-5P3Y>DxttqlauK< zr!P=Ivg9dm4|bW@trw*O;IkZ$CxcN6+T|8IU4S0l2Y8>MYzHa$T6Gyi<+#7!7;S&h zSN%z@{4+C?_|nSz8WXBOOaL{I8a2E>aLgk7>*?Xgl;U{e<^kv#KoGH``C1@>WqqmF z7G+M|Hv@aV)$NKgTJnOQgqC(N_h%IoV3mLTfT+HHxH;Bf!vIE2uZImepwSNeV#?uk zek4Q>^39jQooIBRpw|gDoG>035&QwfUlx;Np6SvR)0iqnutQc?^>P&phj>Hj78e&y zxR$XrP{lKA+Jt{qvo zwW5Hd27(CiyYXR;&>D=7k4pux$V-`1r?A^VIqv0mZ}ImW^EcQ;`O*6-wev$qN#wn{ zv9VON(2PTozqs6%7DA1Z8FlI3LdsUEz(juo$5s?ay#{Zzr1?M- zE7jMl%hcAQyu4|EQYlh_W9i+W zECc9+!Tx^IEcQa!R{s6)@Gv+67RI00$ZIs!^5s&fF(50vp2X;3hfng%WL(`{Q9sC6 zT~S)D9c__e#EX%BQyo88fIooD4}`Js45yOPaj&>y;bY?o5A=-@(ZBqPakytAN9bO` z772O>NWfD6Vs_0AE-@b3hj?WgC-;4^moo-bS1G@rR{a9t(j~L+AykO)SMYI-4k7s!+KQ4GC|OB3lm<7-sAo9P)&N>NJDHm@zW# z?d-@{SYj(G`hh$gR}1DJVNR$0iW8AChc~Yc+~|=JR-%x0Ndvl{^AT!R`SpLj0E;pa zP+fv2%b!K#n3W`fa-0CNJdthW032q5Gi7Oapl4xC znJloi`|X&-C*t#!u7!orCZ~P*dh3t-GsU4oS)Vv5VIy}kD43~3&?&yd1jir~?@I}F4RUL1O>j*}``~}4qPbXi!vVt2p6EcQwMVmA$%O0LQRA$>_(7-#l z1!^520&2^i+I>5WRnY|YW&-*#k7e6AtafuaPL{7b2M+bh(*P7#y*UHaXuU+ zu(8qlTxqS8BM*6*1`L6_!A@`XADQ9*2tN8?}fUBa>ha# zoDFBA1OpG4y}SVPSKWAX#Q$eU#{+5Bn?B|Gx!KTU2Y?d5gHU3~y12MhSlke_z34@V zlEm}54O6_lWV6Qn`t=GkOsA^2M)+6ebBA>mcIRtZ{{H=2qTSr~Zz62D)jg8SVJ9{{ z+6TB_CnnGt8079RX>K(%42~mLP*+bP6_bJ$lO)%tOE))n_p3QMIRQcCv_D-Y^8|eb zv_Oa?X)%yG8|_Gv!Dh`7VZ}uPK8kT*)B)a_C;%4Y>M7Pf#WLCa6+(xR7XI9tOPV6) z3>d1WmPtuU=+z8w*<>8}^gy;NM17f+qC~Y9$P@z`@BisZ;pFY!Aap9D7@n}Cd{1BJ zjrRp%8Tb0Knk~aFrIwGF-PSfrp{v&y2?~C-qJj~9prJUFW_Y-1sI67GNI5#o52n&= zfZcrh_p1eP=e+Z{TtsYbJ0BqhMr%I{s7Z|<9fEdK@(Y8`&)-3HKMpXOu0kMxH##=gq5oDmyDvu}iAPddl~R+Zk8rzDAu6SO;|%BGL>u#l>%L zZ%+aLdbHpK;{h;tcLYJ-JrW)`;^(@<-g+oFtUqE4Mk+iX=#f7@4rE@|Vha!J;o(6L zrKf)`Kg#wO=MM|rSUB`5(+i$4E=YB>((KoQN=7CVW=&ZiVpi*=M{_doQje5|C zgBRkk1Qzaw@0YBHCJ$iS!OwE!IisVZMC9c^IUP*r17n5p6F2-#2z{GeqJkYkFdY(Rgg{N z@(Zm-@bU5aw;242c{}!`!aBmBvZDont}3&Dt-V^Ss`GbFO;BC^vwCU5?rus8hZ8Q9 zS)rj(vOE347wN%|$IEP<&xv#zSU-SkM59zLR}@>4%95d^H&>;2YjmysTbn+a=fmaN z)6MeQ1w)&D_vOv26BWTr-7qnzU{nI)vw^Fh+m*jQ#Nv_@)X(Ct#pX=s>ly7%Qmb)s z80g|CMDPJD!RGnr#M%3&CTBp69+~N&d;A?l9J3MV)ys9f{TmGmXmltV08MjK<_T! z;D$p3cZcS&DVClUitAl_`Ljbhd6Ux-@Sul-t}c(qKH6C2+DJ%jY!fj=!j3%_lVH=? zAFp!NbuOIgSe4U(GXODXmzRcj@CPIQ=}XP%?^hWx@N69%giBRYa1@r77JnK!(9dP^uBxigMh6mIccfka+55vLS_4tW36W{*AO6fk-{k+?z!R)>*0n6W?<3f ze;wFvx#~U;5fig}d4|;ENb&z#_77<90BWe+?^L0AtC+Fk#su8mlA#rQ8yNWWhuVqM z0!~cFNJdt@iOVDekvrvVJR<7Up@=Gt}u7axQwy*Ep#OeN#-(h*j%UNnuLZ z_C$+I$k>Q>O$K!2p%#zmn%$6@%o@Yvazh4Ff+4YUR6@e=!pnr~wY#gU{lm2tc#Kl* zd<+-MlPIvTh@X^_M1}N;B_$A8! zn48I|cCkI=Qm7=3On4Ux`5@DJ8jezfE|=;| z1YgNP{DHNCADC_)pKka?nTvMqzJCX19t^6Rrlt=;sHG|c&yX;4weBcK3$;caDdiW( z$_tH{S*svBO9X!-CnEAuDj2ri>o<~3=NXC-<&Ta_9R#zJ5Ml1&w+2Xnzuv1Y8*-Ee`}bbDFN z(BO9U*$?KL0yyobET+*^$igN}M!-Je?GEz{-_@vxaA|X*fq+KA?LGR%eYjYgvPGj( zWwY{Ty##|G92C-9MYV<|Mu43Hdh_7pC5!J{$k&|>+9G$yN@=*iAFUPJw2=fG>J#$O zIvypw10KrXzbV`9?=_awd6?S&R3>cnyy*3BdXW4b)}qy^lww8u`SY=d)AJfoILGU^ z{1gp1p0Q3ADp4`X{k3>?6L07J#0<148?DpkApmPXmyf1WOsB0d0-VOciyPQG&y(2|Rx#BpXu-d_+SF1FXnvSAe3eGU%?)4g99JOCm?AcwqqIS#jm+`nqp( zbBd^+s@|^BoN0yiZ>mz@yiG&?I1kr_b$3}kLfD*@>Ak}D4hD+JZ+y^x*OQz$TT?6N@f$>~|k9#R7?AyLw7@m3nKZqFA+@30SyVp65CFlI~C^3cM}r ztCfJt_={^p_%#bX-Kj3NS|pR-*{yBv_I6}AvRPXKtYBj-KmHmy+Pz4a>J5H|g{(gn zo+!3!Yh{;dv$+R>x#{N^5F6S!U*vTmUQ#*x#`zPITI;W70@7|+;*wH%O&Zz#^Qsli z)Rjy|(yD*iAJ}D0|9bJ}5%h18`+`E!%BP(2Qr_D>IAKlcf*+dS;DBYMsc;{%84CdX z${WAFUR7&ssBp2)r-vJ}i;jzy#by{FsU{8C(QVB8OaBXEbl+O|HCBM zn@V@Q+}iUD8T5hIo)h#&(rdMKfRzQ`T%oH{GuR$BJdmRrNx*7ju8r`Cojt;){pAf1 zI>0RRfwCp{M%y*wt^PpR=C`A*7T6#Tas!0U{>Jux5J&%bG3$HeG59*g4*iJdA&ojF z@8g@W4}5U|YC(Q3ueMtF&S?J6wxjqfTjezh;b(sU@2^kzb)zt$0G$Zhg9n$Izaynf zTxY6ExHV|3KxhzibEg1~oCHvdKnX~9wpzg2|GKlb_6Fm4=#zdLPkcyu`(4CgswFc^ zH6r|{4W!&>c~5Tgz`;Rj>y-$-y{auxZmjp5wC4*xxzYZ5AOX_1@m`e?)&V5!-kegR zis{U;r*Fbr(7gzphP5v8ArWnTz^?lVc((ysgmwj~x|;7P6*!%N&O;%WA(k^H&ra$O z)GmjeV_wjO^p}fYea#tU?!{IUyK4B)c`9OJ&>(mc`9Z&06bI9|7u#=sY|*Gzn+>QG zDVJF??)td?zTFVXQ$fcuv!vY>2i7)9rTnmAi3*Reg}p~K#Kek@1V(b0=;)mtAi)g| zk}@!$0Pgmd+6<^mfV%}Lrz?}k6CV%-EH=+_k4=WCUyD_UKr3TFs298IGZyIM`Vxjo zQtxGhiuW*TPB?m`Q%Yr{rKPz$vtu-gi$tSZy0$xJ;Bj|nsr`{7e^ft~I5MIj2nG=P z|A(xvfXZ^~)&&uf5Rh&Jk(QP&NtH%ArMtUJ=@6tlq)WO>kZvSD;G?^{zq{DyoV)*X z@7QDPvG1|+Fpi! zvg;9WiltkX1diF()>b%I@g=TPT+`(NYSZjDkOdQN6Vz%YF{_*fQE1Qbg5%yyI>>DT zIynkRpzBTqzU{v+RjINa)4v1a2y}E%_8jIf%sUb!iaq?y-)&f#*L44i9soSy zgTMG-65mKskGOA}(4*L;BOoZasuCXjnbGutfKq{cI`6fPo5*mwz(DOjAK_>@hF+YL zn*&IBf&7|S&KPJ>KrRY>q_OJlo(`y%QBjOFe<%?^BN@d2efTa87NW|_nSsc)f&q<% zLLp&TJOiVZ7R)LU%IOE8<|(>_uda_ z6rVtSD2O=%)U>+>7rkyjN=ttM1#N@3$G0M|i=mWvxprcr4-cD9K`j|JCjtoiXjeBa zj%ILT5)yg<-s-EywE7OJljOsB>TxOiJ$sPMQV_FB1ML8% z8{Dp2%+7oBLk^&t>S0oqOln!@W!iX~{$b0w6>zl)gOET{A2NiP*y?|oJphTF$fIf#h?6A$PDY)<^p&)$9;S`6tu zxk)oY7$HE4Ii2tpaVrPdaW~Ru=pTiHcA#-eq)o)e`f+u3%KWIhM??tiC6`J#-nrsJ zMnj`wWDKv`96nXd$9Fqgf=76Uv3izN^_#-^n0B-BH|=MMIy}^3A9U;syaxx70p>{T*1@wF$0eUPTBantTMngRK zIWK%kNr=wb8<57Q;Jq=<(*4%r;3V*xA{Ey7CIWRpSE!ae46nyaP!R zUolG7yPDVZRfW7_okr?NzojC^) zNP1bEB7*8xOaLjb4QB1DpnZvHe3vZ7e?L4@!bw#d6z(A3#He$EO3GJla8|I~%;!Xu z`8kw~-!ZXUh7wR2y@rZ9K2{_EvV+o+shupb5zwfZfK#7?m6g@^;0t7PUFVS~<8wKv z1oWK_a121lI9@k0Uv|pX*;Nzy8^8Mwx?OG$3jO~1Sr`1!2zYEa0J2(x zFd>gi(nVt@PVc*7$<7$d0gtXo?5LSxYD|e<9m6LS!fLsL<4@9TrXjkT8e6VSTvmj+ z)s~91$gcxlR$^CPMq(d=&ZnohqVbGy6FGiY>Ptck11;oDa3v z70W^6DLUFS1fT0&Xw#l#=prgt3V<3}t*w5|?CE{g8+p`hZ0rPl&S>J|e`4bj3^?$*vC=Tq}MRrUIJ-02Uy>^L|$(Sn|8!uJ&h zG&i_c#igaWwYBj*t!K|Q(&9m>`bp;@jM+kBb4wX9Zg6*ZFmE^62`$11iA9aY^vHU4I#I=6v$wG8m$T=P1aVVEm*xV=Nd8r9Vj=-3ySQmdp3)C7JkAC%zdL1ZeH~GC zVtl-RpuAPWUJ=W|c%;j?s=`M1P(^j#u7?c^8+!&6WwM({1I!gN4OJTsj7UM?U5|^4 zQ&Lh=R9BzeH$RuZo@kLUG_o6rNx62smp~`mb3Zw9)FDGe{3e~k`%M?NaoI8HYx3tF zjB@H#XzPZfkGpt+Z?jR5Q*UVaC%m>JhUvtr<)R246 zZx`X_PkaQc3Sd*}rI6ahHoWib?CYyzY@t`L1=8B?&JRhr|GF*qlnhF95XrQEif>h8 z@gakqo|nsOXmmr<-8f&#M5~I4aogEdXrr&~J2%-#eg~euE%W<6#N`VI5o?N!p-I#i z@Cs||ZndGh&t((Bz{lHdSbFE1v3$kEuk+jaoQAP%%r19#1dC2h9V{+y>)4(ky|un) zHT=LPW!)Gpj*9<1F;Q4gfmP^w7FGd@yNHO1uU9i3e)}N=UG=X<*>9$~uo&DpF6!2V zx z!pm3PQVs-}gshaA&sE!J0l{$cw(PLpxijr@+D znQ;lKXV*@G?Kiv~(CJ+)39d#|d3>djwR!B7)8+fg-P8wQz zruXI32AnBC!v)t4nSMCRk^2C?;`X2^VZ?dwr=Zwy^YCEuy8uZt_wU#=a>w^H>1&M^ zWgDovuHO&6E+L-BsJcsCeb}i(%$X%6XiW>9LaL;WH966L3s>SwwXtB$;G>yy(6D)1OmQoBd+>!iWALQJJ9 zVUT@l_SXSm_|*5gISqP-;(GTLn1XQ%4BJMY~Wex6>p!572K8vTzFPBTS zZ(o)--w+{w6E7(Gq^(Vwu|Lxh@`Hvz$eILW9_9vSAbMLT@&zU6dPTgm5IS*6-go8$ zC7cEwcW#5pJT0oEq=221J&nSD_%q#hvA#r~(coYL(w3r2dK1|`IB!@W3t&=Sh)%i5 zy2rw1kd>w73F+DGT#**A>sp3{boZx_w4tx?Te z%bAO(sYoft(8zhH{=f(cLFPXWfc5;`Ei<}IZ)raI9j5(E6R`9AsTSo)y+DKfxUgc9 z;$!1;{g2*t4nqjM&~Gl*&!0aJ6ipUCsvTXJnj(ntnb)$A4otS+O3gGla1nD^8ILTs zP@FPgZ~)4&D@3)@w8OJ3gChjQy#TTQ$#}R^l}!^QWvM7AqIWYHK1w_E%8+b3dwyz@ zC}k}1tm$G;Z$BC1k*FMc`_}uC$$en|B9%C6n)sI*W1qOJz~=)s-u_ibM|bs%Q68x$XP|1KneS&?x%#DJc0#ltEDryCC>AGXX02 zpnpjYElQm7q;_i_vkL0Q$a)^J4H_+^$_46%fup3XdfFo-u#h9DVkwO_;$nwsr7<^( z-o&S<7ep19|m(zYN#?fjVSkt3nDiYa=f>ZgYg*tdcw~zcAv)W z7P=CH1-xKPN=m0)+v(noLHAi90opTgG0(4OH-tqGtYl>n`E?+GZQ zNEm^_*gq>P1Dm>Dj!IuMvEoDJXdij@N-c9@yMBEm<%u>*GelgMpH zX)*1+b=%_EsP`J!h2FvZY>7@4=ThtKioS>JLZc%xsF^}%5;Oq_*}dW^ihCzt(A+6a z2?0xjW@h^>6|bsXfnWW|;-aJtM0XquYvuZ`MXgm{?!FCX~r8+ zQ%xe^jFvDk1f0iOkKCPa;tT-_DykQDC>T~Q-Rg}M{qiM1FDYs0?g2852fW@#EwDev zb;lDKF#qv!#VPNzmmZh<2IJ>H>L2DTK<5J^FnqaQn@P(WzerPjpN0SES8c8R^yUEu z(?L5xC+3qHd(M2((Jz~?emj_QphUl1h68BiS+&pMJ%%SzGW@*fLUGH7edbYnPO#=(J|yhHc39C}>+(qn8eW4*l~|6)VV$8@?mv_8fxAOfmghGb;!t_m|M1K-3@{*M+w zZ*{}h7r5h%e7XBX3egzIvoWF-ka8$0(g*5B@5?FnzP^ulJNQC09%6Vvth`y*27662 zXOEB&7q@KR;JVdu3wi~iz?q2#0VwyUFmv+P%jIQ&+1_QAa5c`oeEk*E_TWYd4nyDy zj*CerSR$w63yZwscx%xDbn~DgY_`f+1oG9uQ5p^0*8aaok*mD z2B=pQXamGzb6|8L@9u!BjSA#JXv4l$U0?Ix&I`>n zI}s}@D^t*%&0BK;(0O;^;$zquC^PSJxG>LR!U;yxy#QaongV^WZllQ<&Q07ZKxf$K zY~)eh@g$6n`}T$n%PSGSG+SJO16*&wa2p!F-T6NOC;%M1Y+4k&uy2Wprj);5gX%Oy zVdaJT1#`{ztY}ajcXQL_ak01W_`9W`An^oc#ILWT5Vt3aIB3jJ3;}q9R9PD5Hco(? z42_IIwiKW39@Ety@z0ywSXHI$>0Q=9LWOD~rMl1s>mK7em#c=t!a_J4e0-!>UHV$D z+JMH!cBRliZ(4-va@&-Ya~tzEH(LqM1V#*e*1v*|39wrxy9zrn3gYuxUG7auQPIjZ zzRsH8?EyIRr}Ixomj9+j_yr7DaS}7AH1{Ns!?2_h<_E!OOo;Ez;oadSGAimW=FHBp zl@<0xhl!8&C-6IJ-m=VK7ZoY0sjY!=8W$694rnXLC;dhwiTYL>3y<0z^t4*`6Mg=gGl$bm&pE@@~;1*E83{=-a1=9bpk zZ@SExgF5?WtFHgvyhv|Ep!!-|T)af>nhZdd%Nm3c6*He*F6*U1xD6;X z{RtWtIIumDporkAV(-C_`SyYofU+MP?>NUsXJ(c!H%E-?K7+^t7=-~K+xbsM5%#Vu zC52N0g3zlBdYH-@&7XXx)*Z%xy#_ z{OfB(ZW3op=f{IE0Af9KVKa5Y5&lbl$w(5^B%xXJ8vCuIXr>8=eTa|mP2)2lP9KmY z_YqN7cMIw$FDe2;WIs?qku|Yx+o1J#YO(@sU%_@q=HRlU?S-Y_`FXmZp_9`)$w)GT zh5U?4(~JhDO5qW{jaRbu_cL6z>E89LPHDO< zG=wLy=Q&-wV~Lde)S4w`VnpLm55LGENC11LQG+1DOaTp!jj`~%Qg2jfE zw~#s)A~jkjCOzol{oY(d$|E+ctc)zq5T#>e+^a0@TsBtX(63Y1-G_rDtE{N9dJrv;mE*yr$;#{@RbCA|+MT)9srVdqTEAkVcXxm(iam zqshCL*f!&e-+Z+z=Y8R4SOpm~#nnjG{55A;U0XdmKkh$d+zF->v^I~>6%R=`$-K}I ze?MlCDbMXK19Ok9(#WOv5|0#9Y`M=l13^SOLLPjm)Th1? z<~97byB9&|8LVrevHB@|JZtl}!5_>CTfpBo7 zFihHoe9bFu{!#}_AoN)EybBK#aq%fBJ6oGeuSK@rY$4S`_jBsl_usuMzhvGmNqZ*m z-`}G9DVXh3zK&0uPfa4?y# zZQx@|I!nrs7SA#YbRUVlK5DnDC6N5#imqrb`|sqtcdf|Rt)r$Ki9^O9bl0Mp1%@v&g{5hakL^5fjx~Vs`IUQhR@wi| z2g%ZqkPu%JL@h6`02_NgN=lNH(p8jqMfc4F+t+NXYPy5n? zgKfk0Bt}hzmA&X38{J#nx6j>Uu&}`tqRUe5h>(!(W!uree~;~ejq0)0-ZS#2J#1`j z_-4e##y&0jh+S8R0dEAxw+}uXd=M_qH@q_j}@(pLcmJmNl_JP{#kYe{ubv% zV8)aKixl@;s7dzNw&VExUXt3rw6ru@(auMina_ZStC-!__O=GJ-r$C9ax(7)gL|ig zcX(1`V!!|##~9!1>nNEP5)vtqLkp&9oEHiqrnjkzxz^h# z-s&5&5b$b?VdLV4%o=7F{KV1ZdY>qdg}o9I{yaak;O9V_luPp_dVw{U^<))8`@VCK z=RpvFBB9w=-SA*I9+w?)sBFGy`E(FT`PIa(qbWqi-$U1=WB zjGe`1(`vb`KV^)L-hUD>**9z(B z^`$^Zm6UY;gi}(L0N`Q8bFQ3K8A3(0EE#K@{C?Ev0C|(La)p?Len_Rfme%<8DGwdp z%akEJTiG;;9KGZ0Z+Cb3awo(6E^a4<8Q0ole7tFqn;G|@m0Q%tSWlZfUEU``Ops&L zGZVd@mCK+6{2Per_f&tir`(vnx@v<0@e$U_s)7RG8#p*Q&v)*XizoFf#PnIdjsf-X zvH%@5b#mLoy4=s)7wa8CZM}t`vk+3X8`LsBg9)k6_SSf&Z|0_V!^UzX;g2p(rVkOc zd?AMeuv*lSpG`hqCQc92h2BmbFlXgM7;aH`=HY_3kxtg!Z30pPBC0ZeQ3*T3WS%Ah zmlSPtRcn@skH-jcc)g(-<=gw@Uq!{m`873hK>TyvA3wkMF~Z?!i2?;eInzN3T|AMU zcgm}3ya{}^BP!imY(7#O=FWGJ#cL+8?8r;EqiP`g&08rM{srb2&>?eUxYnyB2&o8*J8W_JxKF)xP-DWD>>ma<@>N1w z+R@eyDZaPWMpa4qouQ!C(cahX@XqDu+?lL6b&!P|gwmAcL zST!qVA;n;{zD@!3$R#-9+X`)Ub^fPSm#QWPg0R0#X~^EX&P@wS&a8RIvNxO@oX*^k zSBYF+1wzWo*MrfU$Ms0w_B=DIh#qiDcSj-Q zr|gHrPk;>W{tn*@1@A1Mc??%sxk>sGLV9Q&Fbrn@9f#>Y1bQ4a{20rTIH!}htq{xy zfcDQeyf<{~lZ~LuaE0F$%M^?7kL7F!ELs9JFt(aJ_?G7|{b7LI)}?|z4@_ov!kALA z5T=^D&D(I~^}x--OW;Zv_(QWhRdruQ%E9F#J@Ho+P+WaL?PUs9((&EUpMs`o9TSAL zM|v(z*7@r54GS&4$n!Cmg_d#`$s45=#lPB623CqP2xk`BTIigVx`6=#ja+T^g~NCO zFlKN=uG%;7rqbB4N`3mYw(fJ!USAK5iNRtn^z9S2u&O!P*|qt?LU42LK}*ZHBIo0l z93MYrji8&rXY*?*gj}Fc&gX;*bz`A@IIYPIMAH5#I#ZEkeBFoMupYs~ye42>iyTe? zN?Rcz>BrBIn;r5tPY|}WpfGW(Ur$k*<+@MbAq$NP*<>DU0*YpZYT0sU zVj>i99qwvJ3&z!_&g?sD+#WYO)ynj0i51f`KUY2{k)GGJuJaH+*z}xhabX^dFIZZE zSJ2Us)fR=)^fDtY2AJRG&@|a2VJj>50g(6jg)u2M`V$*N9WqQFviVh=Oi7F1H~%7X z$)6@}zGhi+YV{r#FBS5sPS=7=aCYq9(aZ&0Pb1c$mZ3U9V1fYy9Io~-q`J#^q-i&s z+YDmNqWQLxCUz9wR8h?Ai1Isq?wnWDyvZzWqCakmn)z8Sgl2@%YtIZ zv%70iF2r;D4O1kQ&&x~q5PAD^h*TU+osVrHrU1>4s};rEqN1nBU0<9OhCI-zHi)w9M zv$@u<nufA?ccxsVA@48j5r|MeADAZWo&pxzX3+b-!>fW=3QrZ;$ z&ojPaQal~;(kZweMLlL`Mh@^&VYmue29V90LaP8j43qMMwwHj%CHa@Xz4N|bI=04M zU*D*h;>sA z7Fb||=dLF73xK@yw+$X2J_LiL=tD<*DI|ay```E3%y7|}_UJ9o+xIwZqkM{tTYIaAsw-1bS9fH$oEeF~!~btA4oFD2UNrdp0=a(RSx0gIeM~?oj3lqV>q91J z7HzyFW7;qVC-m7jn5sYKUW2vgUq z4P?CLzQ_@0+p`%~4b3+nz!CfJpSJUJ+q8O9BTxP@GZRK-`>N~JXYgWxHMHeT>rnpp zkt_2j7|&fdjRQtrW48Q!iXTjdyr>N@I>j?WWUT+*NAS>8mxt2|HX1%(DtVTpHDvn# z`+LCZ-qXPQor-}ZWFWuaznlLRGyBlc`U*zbSd>7Sio4erzH-b@hd_|HcKD5yH* zXitWm3OnPZ`lJbLuiF~_-+g;d(Y4;~Q^wA1)HE2NLq#QT``~!~WUGX!KJ7oBtX0CB zGO|}f(pZMQ8S)f`$$ODj^C;ne{RCsPLp+<08}k42PQiZE9sW|mPf`B!l|+KyOFu#U zccH*Pb-kkYd-5Nz^%YYe^T+@9dE5S|UAc7Z?62!T{JVb7DTb4po7p?WSFqmr`44;@ zGeu*<`d<%k{O7-m9saL(IQs@Z1Un+)yhHpyemHpGgNiXVT>j~azxmg#N5i64nk3a) z%R#PsivRC<59WLpAXxt)*r9()ja2LJYdyVZnY#_b6gMJI5Ci>8O9Fi z@Rfy}zUT~OK|r>%Gv!ELqW@>T>@sjuG%S%@M`YhpsgT+ckI{%awb_+D4CT^&r5 zzdn=}WKi|$9b2UdNckQc+k1aGKfLG#WYU+yw(sDuyCaq_G_BYEs4h~q{i3bsr4ml_~7SxIzDf692{n99k^_oTVm!K-F1muWF@tv z(Ex+(t@?~DNgAZ^ziSCsE(mb%J}CQ)F(-4)=S=xI29CeX-*_ zW=c$IS7J2Jo{%F|z4@rAxj8i*Yx>uEwUe+=9xrO4`j2pFDm`EWXqY$yo9{&C4@TQA zhiOB9E31aTU^=K1xW!m@mTLd!1@$vQB&8ULM!`w}Uo{KBV|!_lnju}OI zQBO<8p`o{)wH`LTP&ZW^@y@>=)7wsk=Uk3huxS3VZUVK?Y)~m6Vg3mPJt$yj$9%pB zr6^QFfo1C)Ou_gvN^IMt{rCDU5mrFZf1CKT3Xozw8OA$0NwKMNIP@lKJ+xMul(8tr zl@g0pBXS3wMwX-5U%?d3$?DxyU^@kMm^R$yTtw}jsyED zJeu+ZTJ!I#|NI{POTkSd8=1jNst3SnshS;~m)7{$nR z?nxsSD8sy^F&H1GpPfBQkD`*2*1toK6834>tx;H9p_eqe4|G~Y#^73YArdX}xT*w{FStr zfh!Rlp!jDe@~`^g6%}LPKag{BWLocYDgiej+XegK-6(r-6s#w^h z;(B(hNa*C-=hjc)>L5dn5t{yCe7$}BhNe51C7ha3b5e5@V8apu=2IEt851R?EphbR z5s1VCAf@^M1eTO-q+O~ya0;Cz$pZHaYBYww+8MAAbplNV5Uv3p2%Oltn`cutbN%V} zLH^97n8$V%^R0%gW`&~9QBg&UmF1Oj0qML)`1#89-dGS)!*#_5*B$wYtLVT%dx?h^ zC|iv9qF&2-&lw2_g_`Rw3?j*da6PwuL00;g;W9rcRtxDf6w9CRM*+@qc7nRf1omD~ z?G||$^Yk;YoaprK`sjwWjqr9X!ezcSm(C5V1jkI_{E6t;@4|^4!fxW?z1KW|3V`eb ze&Z!RzLb^Bi*;Pwj-f6i*(ZqE(8?;ddbcrt3FD}CQ#8@?i7eW546KBKZwt$rd9~>g znzdCot4^D5+!-G?d(nZL1n3b&6mYWNMpsw6qO&{jropL|s^}&SfF*;-A4{_}&8Ndl zN?8<_zwqt&vgJIf1+1(nYATwSDycFQrKrffmn^#P^(A!G!hmH9{zG`w3tFV$@T1f; z+x4r8HAADDehd;pXLTeLz_j#|2=ZqR8geSAYex*M>w{fI{0qNTtwAkI5G9e5)sP#9 zY|!)c@ATg(yA?+rVRaKCq7?ryULZb&mxIfs*$03oSW5fm7l)uvPbqNWz>vU}1$G-} z=TL?`=fWm6T7GCsINl2@S5zV6eo2gHywu@w@OT+5FK_trmS5GYVXf$c)UYMAfu_Du z7kGKHdJ_=1j*sp-0TG0Zw!lkcY@h{Fi2o43SPhpy(Rbj5giw|y_Y1zIeVM?7j1%mw&hLXhVBHX15AwaCp|h87S+wT3%R~l%V5-+SD02WS!rT`)!p5 z@_ABBQazZ+3djvmX^{w`lVmGdqj!=uPEhAmH{B3O5{iF*buDXi))!8C239wmED2lw zAa|@9!+9boH#$CqAoT zhhMvhQH#c4sRM*D(t7o&{oKJs+F)->>&#ssVraKVv$m4_sKAcgV zBPxeR7U++jxDHn(yDz+ZJYhxjO&9wnkVt{Qf2ZKny;o#VH)B{m2||wT2Gdz1eA;T~ zVUm}S8HENduSwT%J-zB`4L6HFNU3zR!U2KvdyMgm^}e=MNrlt81FfQxpwpgZ`*~7l z&`VMy_{`?Y(78rlV5-ke9STt}qFxP}{>-Xmt1m*Rg8=*ZZOCT8LhwtwJIq>45{nko zi__x<=b-7<`8S##|K$q99*=EsULGExfSBrtBc7e{l1i*{s+4IAY#ylfgA;f)JWaM) zsQZwKbjG0l;#&FMjw2<1!*r?H=}oOFU})q ziC+A9lde^6R!9dY78vAkCw42=T2tfY^4_J$0zxioXGiDbvHS+QUy)-^$mdRliyH^O z4ySu{w?IYnrqToYKECZVy}Y?%`$VT>adbv{G3jn;1Fvieq+UAQ4T+iKss4o>_Y|cvPqMrlhl~&Z% zZCD5rS&gvVTgU*v!(h`q6aqTEYghsM)w82BIYD*1I(1>?e;YTGNbp!2T$|Q(PcD*? zG(?@J?ekWn6fb|^Pw{}N?S`cvvy9wA&+nr1)!XU2# z4(G+yAbiupL6ZcCNWhMR6Fne$x%ko0mAmb#b7F7N<9j?NHauraTHXepx%sZ^O#}XQ zKR&tP%GYDYrge#jckN>ak6V3~s#Cst%selrv4d%y$P)p+YBc~uD66)N%-7`MI@H9C z_o&OI?foZvtZ#2}?@rgb>>9MIt825BaRe8tBeLlFq+5rpDz(d}D|T|6Qu~-e+9mbU z58NWzmHjSFOh(U_`dD{$(f7Blk~KAW|7s6^>hJerIOoN-=DdA^c#A>0Tmp>@lV`fr zCIDO9)xe=QZ|cZ9q6C>5aYkh9vTa%b`S?lz_cjI-Lp#2Fncs?T6@CximJv^m_YWxG zw!fM|CW*WlF=|?nbrXL>Tx+@6+GGuy3$ai#v@_t}hXy>pp_mHql3Oao`2hWc z$AWoHrS~bP@kpxw`*I+0RUjQVcsQNps+hH`uC89O<^3odemSYVgA?&=Zn$9!xo!ZF zXat>*wf;k<@LAs-5BtYY(o1cJW%@m3UNen-0(;I)bPVNd*FJ6iTk|A%BN?4OP+b{O zavBVJKLjmlL7p`P zyL;mA{NO3fd+3nFU*e$A3K?+!q)nH0`(4P4&3br3*OTOpB;izDJuz|7WLna0;&IHq zuNpUOxf`_!H!@Ufb8F5kp+^5WjSuQc+pUL}s6_f54 zmM~3F!_>I!Q8P4aV^d4e${O_nr3DBwNf6Bo^3>fWqw^suH?v@-JTGn1JSV#- z8QAn!!iX+0Nd@JFR*UQ^?+jI-saP_bp8eUT+I_@9`MVRIh58N1#?5ZOqx%@rdI%t| zkh8Kfh|npT_AkGureb2!Vv0PTU%xkO{;{zXYxsByiv#?%;K*rvVA!tSHH7yQQv5^9 ztUR&jCIKd{sH!WsnB<8!l+js)F@3#bqr)9#_M<%KSN+#IsCI;G`KsNzAlrCQ))?(z zia^eOGbMu09pn@zKKA4{gU!hRIZOy3vF|Jf1m$mi@;fgaj($?{+Mj(rbiO&t0vCD@ z*7od4Ita~5YDwDQa_lSNgP(J;Tb%N<1AEg%=HJ=Fb&+vyS?GUU)_A%Gj<5n)O|1tQ(6iX7k~ zq`mcC21TW30$~8y3Nt(vd(+yHdGF~apCvc*e?hu>!yd~_#vdb5_!C#Yer_ocXh zxj6JW2^)56HPu*LsIBYzbu(c2@0`*DuF~C(abvKt2?W?64mt{A+&;HGZI6(%s3=BP zzL)&rh97!8mov}p!vvHt&8H8^OXPih6DF}LgCOd6Tc@MU%EloxwzDz{gL9U*CL3}YYp)@ zB#d0`4qqG2<$8%{+-_cT{JYo&l<>(FPh!&oj|1}1oGB66SaNe@V0X8oc?^xvRvqOt zD0t|i)hB3ft@+Z@M*0eh`XLOe6|f@(rGymh{E??z$Y0o!JfU^fwOBy*32x^1;KqP0M9CjDe5R}YdS9Jny?WT7F%Tg`q`zb zqcYZ%79|iDlez`zhH5V7JzV+#%w3fyi^7E7CnP@l)hf7@y4n#wxDk{x&ob?)y+hVzO=fAahide}$9ujt*`Wo{knQZqjj+2uUJ6^~L z`RI1_jHUc%%@J^ZdI_ULfY1R%auu*qg--+hW3(uJA;^G#8kqGL3Cu%-&z!Vb;fqaf zx}eo8;n#53K?7lM&qRigOg2dG6k^IF+7HaYI=ehVL^z3U>Qnw`x!nCvY8=iC(V zHe(;fd`v+~ia|0mL%3KO?9LLb$%QwKpc8E^y!VWhQJ~DqPkiZ6J5TJ}bLw)GF^ffv z=2rCY=e#3MvL@5yijPblH%!7X&w;w_yHE2OZ&8u`?b|SQ4jUCf9O@fnf0QHck3ijc zs#WLL?;m>vQ>jdwcfsn!CGE0GU2Zk`qY*Idk*A`@L^k`-STh_=O6H2j}HV2CK*zeXOdA zK^+9yLMmTLYvsDl^q$-Uqf*+m2Bi+#9Gqw>HjzTTkPO9gY<7g?`_x|Us z+XY92Ync_qH=~F45DOFUYcjTygYB4@*NuMMyKXmvG z$6ws5p}}9g_P7mFGVhg@YY*oq^lY~mo?RrlpUin z9SAFM0K8J#3Lz5j44H6C?X$sXcg!m+S)48WvzzCYf6 zH{%$|;px&Zfc&?rt~_2SMYk6f=A8yS$d8mC-)0SeTe2x=PPdyhT~u1Hs^m$ZJVk~J z4TZQUUZ@sNenLxczBkT^-kH;QxE?27Gd2NLSnU_u9=`34qNP)1_(p(5juAg?(BA{} z)C&_-6!p`-K(a&IJ-TA3n;P|xmw*Io)72dAV(4DAZ<=Xv5n8(TajQwsL3|^k)&I}h z)|RCM`kO5%Uyn1z6L@qYNbNeqp(X6(6a}0S{V#7D_3%0;6#JMNPhNoJ8!3>D2;JS2 z|GoI~=Gvw0ft%+w+bw@ISwFz5tV!V{V4PEGF7{4DV0Ye9_UR|(NwR%ug0vJ-v3iwxxd(mc1KAqi-esl$m8TvblV`P}AQtb8UX zxxk2=r^3>XIOi`S0KMc7i1$?4eC9SEX~$cNb|)(&q#z*nZ7@3Kr`Gj&2iQI!i*(%= zVkjs-Y{i(+baL9i++Jvqmsc8hhO7MaSu=ECD=}Tbnc^7(U|Dp4z8(<9QN+eFCR5dP zp1&?um#EX&Qb1<~o)=)v%W8wm9>F3Lf7qYj5vbO}Ib%o1H!>ZQIJgNww@Rut-yxiT z`;jze5bPe@)l#PuLhF-#dt5@oj_|%|K$sMk6zL81WK{0Orx3)%_NFF%RzE$yAEY$5ENNo{2cGU_(o+`n0`tOJV%6#Ul?Dr)6z8z zh2qJ_$MB`8SkUm|tZ?3GcZh`FKGy&D$`UmxIIS%%^PfOSsVM{zSI2PJeLQ0;^P2oN zoOTtgsoZfriwHsf#n=6>G0seJZ+>Obb%=Z6VUzxuCihANj1~aAMiWyb{wcwj(%me0 z!$}`4Eja+TJWr`p{H!`6xyw~)*%uK`m?R2hE5x)iom6A{=oF z6EQq6vJ4&Rm8673OgbkH0O+#IaCuf(EB0e`pJ%!K@sAK>tN!UQX zsH(3EK!?8H#KwSx8feqGmFwm2`LAn5KRc)1ZJ8gKyG`jGoJFu_RS2>jAXS`ijZFED z%DBKUrK2Egclkor4v0rK@S#LR#Mcm1W+ydVYTnSuO52IwZjU?{;M3f0Wlv57w#iUY z!qnT`h}~P#i^~Xl<_SNuZV3c{NmwKC) zlJ@Z+c+mHTCBX06!T4re>R^%lYUXnwl^sl=&H*wMMgW!x6rZ5{BH!KemgFWI=GA={)vApgIYN-a0jbL6-U{sZs$b(Eq!tEFvgPDY9UsV+x zS&4~{Ejl-f6Y~QL{L2?kH}nsS%~nVjf)6+zqvj7^z-b<-)Fg=K#F76P9JQY0(~31e zm=8)Wh9J%?Hp6IOFj@WWg{E4a9qP9~xnf^al05gt*aGw6<-z$pXxV@N(s%nawcX@Z zMXUJh2pJiIh-YQ3_MXCg%#)>+&I^G{`WbFjCM+Q8+N$OSuYI+zo1WG1gPm;w*qc{l z$VOsrj;UH;VFlI z#qPz8x-opVP^)1D;`1RF&ENr$fEUXE&i|+z!ocIk8%2yiXmqo-TW|iGdyf;apdeBU zkj?M3WXmq12P4z;&U-TKYcmU`qyNz_q!Jg3#;Eh#paVy-e%QRpSHPt9(M&yRnD*EC zO1S^n>#9f3^j*-Bz|G{;&0`%&I^FR_-9mHXSi@||&C%zFo4YWe{a$f&r*0Bezdz2m zoNEmT47?y|4EP2P=*%b%;0Z_oOZg=vyxq9&v~R`v)_WAUf&ZjqdJ#`ZAP)Jj!Epb zR22F`F{T0st66-8(G+8TjP5#q{q`+u+9U6vsL0~V^qv}^VQDXn8~)I23I+r2o7#nd z*KFemI{}47{UAE|9xWKYSAqu4h#E*DaHf!gB4CikD4)=)nN@ojz9n^bmr$ofaE_Ny zXOwO<&i+5_y>(O+T+}{_D4>X-0xC!;ASIwQ3@P2+-QC@S0!lNKNVjx%iAa}pcjwSU z4)=`j`+oQS{{5uyThK1`Max7_S zeVAX{_1=ZAJO~^h?LnR$9B=fIf#wJxZgM2*3K=^;3X|>!XI)whRQcQLG`S;N$eW{o zcHR@Vfy#()(jt9tm`xO4w4C4QLZsq!v43Hqmoo)1)3PUKox6cjA|QXjiyHNYYsbXJ zx_0&Nj15~DFSNFSYJVoj?bF|#9q;UaaX6GS(@?)%2kl6}LHgOYo`tYHc$-C+I(c*0 zj`?Y`j>$P0@>igR8@P! z_u6})NRgQ*nr-W|((rvhiq~IW&!PVa`Q?vBcd6-1UA)gwU%WFtN7|46GbrGvUfdnCunn(4BL~yvPhJZfR~Kx?yc~6+ zZ=a1Y_v$D}N)`-gI)qCEhs4Ck@96L;Xy&fb>5NUYvs3T8qqMU~Zy459lX(!-)7HVD|SURaG7YU;`#v6EG3GN4i%ElJNLdpJ6>nB!+nAsde zCkE+Q;!C!jU+|;?W)qnaaAu4j(H>j+cB*>r3P-UmQvU_hBf%W=dQ#qzm_bvE1wTSz z!`yk_PoX5NA3$m8)3uE?8b)?epB7zkkpsLGySeVEKviY+qxyHGUqz}M;X14=Y?kXM zBhDS6=K0igW2OG6(%;{ylr%T9t)!3N946%OdR??*Vtk@`?-vuFc#YvMFW76WBb zNq?&PY`0)MmGq(@#asUyZI1*#W+2{IAtg=KlAO4>JER$2XBYS$YqkYr!^8RE0}R3$ zPn?~c@+`mH5y0uRKRM8iw-_1UE2r0lxZwEY_{CUlosU-Zo=)#rvNUFBx!2W6P%P(L znkg76RuCqBXWl>YS}l=0?JGyP-gi5NZ@|hd_PAJCYx2qXRKX2p(&4*UMb_3H#%mVV z^VNcD*~YYlDrBAZqoczamzN@}Z0x4oiD|{n@(Z`!*7FW6_c87AUsM0IH&l<~;^G=x zYC=IlnUC6j`SP^a6E@Oko@?2kxYHCrat$A}QB^!%G{w74W%Ln=rV53}T}{?|=aL|H z6pGxOv$4mCBs8^b%q)iUt86VM=DlfY-~Q=}ilwDz7zg4E`1R_-o45O&(M> z7Jb_DmcM=uA0Nx}b`GkxUdZc?ezRHmU?sMc9?t(WT|zBxdU~4GW_ru~RE;I4=?Z5v zHnw1R8wDk)=k1J&w_qkX&30PU3zKS#v7QNTU-`rkX}eG*8khyTFL_4ReKNPQ7=O9L zE*{RjnSh?Bp)oT$Je|`fYO!{FvC2_xaQOQp&g;=}Rx!dx=`}fLCl_btQJxt~4$_|Tt9F=pwJF7G zZnkyMKHVu=sH|I1VawaU?uW5jsV#jB!jV)EHO)nw{8_QEw(LE}Sy$sOCKt7IJ~1mg zQz4c6NgBBTi#GqxghkHT9Yw_HkTj1oW4}6CZ3VfA_@yXMK{!?(ucOTILP1lsfr|?= zcQ<4qI6Pd&*~KNVEL-?xjaBrkydwH0*nu8V=MWfCYq@il>=479_AccM9bpI^VOaj@ z3qDd5lw8zK`@oY0*}Ub>(lkE2vdOX=M4rK6ty5A7B z!&i9y;3}+atOa%1tel$R(%ihvf}H-o!be5Hc-(`ykA=c=k!u~{#07PZ8{1`_Bw&*Ge6P2b z^O!Q1$H|X*x0Od#RaNecsVvt%EjcpD`Qzg%;1_w>*=wIknxA6_%}orMDTS|Wj%(UF zTQ1z}yT-m)UW(x4)Rv}`r?&%eqP=X4}3P7cZuWv zJ=FT69=g-@L|Y4RU-G7TV{L6sqtYx2JkM#t8}80X>bh`?fXBwi=U!fVu(GghHec;4 zYHKIE68^JlJBioST?!W$7xjqCohr9O1N>*tdhC+~o+pWh5oW)%sTC+wlL7^A8g&lY zHZ35HN#ijdhZgxH~4JRbgBZzw}G#lO;Nt#m$r>d$u6_A&J)`E zsW&-^HVTG@nGCgysPId8Gn_{pI=G>zuATrcl`F}~rDbHi1{Z|cWv3BZ?RrLoYhqM-ul?O^W(me`crGaGHY*XX$fn`)tjy~Kf3UOLS@G! zyOZzefMJ;v5x&=k7dJj|^2hh7!Pg5cT0G2dnCz|PRXd}PJZL7U;_2zBaig}jx=PK+ zIOy&DTFbs2pO%geDL9w?*@X9tc_k&Prlz?-t!TwBcTM>U7=15#y-@=USsmA<;GU5d zmYdX+Fb3pUb_(cpA~Etf^V>{X5~_e3K^7Hd_ca$B;+_ zNfD)FTXsp8|~Gws$5 zrTh+Ywb3X-Hsf&`k!E-A{bw;h#lzCbLW*=-bRu{!e-zhm(-H)xx3AxJe*do)Amq6v z7|KWR+=%b2ECQ(wP$Ts?n}$6$U>I&D$=q*bk~W*!ump7xNAZfq*mFy5K@pa6i&b71 z4y^3#pdS`61ZfL%b9tc7-xCvovfzb@jE#+D$HhH^6~Q=Eb=vBf1UTViO5 zunW@D1=`!&ryJcXI>KJ&f?Fpr7V%-Q15O8v0=9J#z|48m`QHGm-5($*K@2GUvlJ8= zlY40DZ>pL?DR^#9M(TIVd+{&>Dm_juK)qTXXfw1HzKXhoud4N`?Hz?Uol4=KV(o@m z_wW@g8kQd=B@@;)bL;eQ`;{>EdU^ve4CM#tfazwERZvm_k3)9`3Z5M%8bOlGMv^Zj z`z%ch(-LKJRIsY~2cig`Ir|=zd7eY-cXtjX68@Bp5xF1}C!YO$P0b zfr-|wbaaRS$z}JwsBeANwNMN!u%M!1M3bZ(=lYfk(WnPRBbl&S~ydln9GT}C?z#D^$G|^h^KloAMCCpfGFwlxz^klhJb=NE&CVt6$B~&eS0M#xkzI$j4SWWE8FoEn)Ll%#A#gdYeyK@XUk+iEd5DSpG+?fMR-f3!!s}DW80bzkHvx*` zxsLmo6^lt4fH|EtsHJp=FgAZXq&fFPeGV%|ZF@J1WBW2w>Gbr}!piC-j@4@NT^K3f zJTV`57T48o#hksSW+KwGB^m03pe)8cc)-Eatf*tpmlSmZ&ye2B&>-b=`}3Ba*`)7< zbPD&BCW(@dPjd~6(MFPEIPgXr^rovk=l|jWjxnr8{~$$~*HJI*1T-X4C?jbJ!qTzd zQRaCvBpN|OUAvLusidn5qwlp(^3got2Gip_mcLTX9sLS;Q!+r1(V)_n@NZo(+8;J3S zM6A(iOQA@!W&o@Z>@Qd$h#WExL(xC%y!vNjlD0t(^9wZ6trXsDeG$0SOv39`+tb^t zSbWAvgzYKmEtSg4L;nQ~t{DT(3>8g?8b(WM_&~N;f&-@Q-* z@fVE8S{x4nYBVuZZSAOwBkb;8$9p*xQLhUJ?jaY1xxu&QJL5%2H5uSOmb&ob)pqP> z^;imcuB55Cll*_wt&v%0mlwRx2kiQD3xrjudG`Esnb7nL_s zzEUGnnnu12pl45|_mzw7#kYH(S}Uu0KGAc)EAMZ=2Rg&M@fy^LZ!NZdGJh3FVLe$Y zaJ(@%0lM|Z01 zVkz$H35HymAJhKXDU{sunre@bXc^FbG}80X^Z7dH+Rv30u=HHlYe*9s!(DlX<9q(8 zX0{~4d)E+&s@y$ z0GmU?7`WveKn#&EVhK4pUES0}uaAcE^72t^B!&19@L4|)h%3utupF{Z?s_!T*H;>} zW6l9w1U{CkmVE$nLE3Ih0sBc~1*$l;_fzxB%N3BpZLR_pG)O#cSh%tI$xH{X>Yw!L zA`~1q29(Jj%Yh)$d=S8B2Agl1Zt|>g^&kb|(}BqJr|=Dc5?EV~?jRO*X%d!8E&Lns z$TXke8GQx4{|mbLZ^F^Z!& z*q*$y@*2bM7UeRvzMJE0Uj2QJ@Ng2I?QrHT_e))g=I18nG>7On(hioc3*I$g>{BEYT?N?F z9pLWA$5eIcX)b)`9eU|6*V$V*&BT~ulBvN*6ibbh6a=^Ecj+H(c2lM9!ihq9dL#f! z;g2)kN-#~?V&^8Xg5UpV)9jc)*7OuO`ubbM6<8Q(W`o3NjmF~LRP!(pa(tf4WgCU0 zyJpZ8*M5Ncz#E#@3>8#Wb3tY#ui)UZOjv>yCjG-LH#03;o(oqgAfeiAGVVfRZy+ZS6rjL! zZihqm58|%61_xC|MT7Q1ju_ft2>jz|Ch1Mrobw9&3YjVydD*^^O({esh42O6+q4DO zf26T!Bp??_2|(jV2r7sX%_rH609=oHibGj!=efOC$w`N_UFXJfTM!U!cX#*cr8ZmP z?dZ*wjxa}E5SXzpN4>T^r~mv(0~e9R6H>p(T3e1DS0c)ddruMuy+ARYusP&$9D_EO zSwl8J(B7v7x?>;+$B(1ZkVNdHBDPW$Ox`Tyk^q2+%v|CfSevS%7hn@$*Yc2|>+)jI zw-`(!%kCqppPkjB*Q))a$y>||uN%z!@k6XPo^hg}q&Yv)roQ{ehe5Mi3XFRgH;mxP zLHaTvzK72lMgt$c9QLmQd5^94j^=kJ<6rYWAq(?JAe$$W%M}=sbBPe zI6Uy)ZP5?IY2JM!FC*gv$apThM0qphsIwrjMv#AN)1)pX7iDG&f`nrJ=)JkQc~lH{ zkUr?|X5&qb@gRbTbJ&|lEinV!4zDlq^f+J#nfq6<0M0sROdg5kVZD)o?&sQ~z;o zJ|^x@U={_W0Tc?as;o2vIS$uKDD!0>OkP1DgRZ2JY0ZL(h{Nq54apy*4(0+XW2(Y* z2bnw5*UV3UM$eZ5$~&zMCysLS~athQ@;rk6yA#O=!C&gBY0xG^?lDy4~PCNW{Qk zdkJW9^Q8sP?e($XCE{PV0doR4+2-q_{0V0RH~utv`?((_Z%#hzPYMSJCx%(@oh0 zd}SbeEb!A59#0C&t7}h9UO*N2{)yuQn=oB&95TSUK_uRN3>+_?8O{9( zU|~8)2?Xl@0ICIApvlX~gnQZu4Nlz$U771w!XZechRl@XjA@9lE&IN`|Em~4q&i4o zGr)K274YE|h_GAJmL+3g@!v0J{v{}=C_$iLb=g(Z_PJQ|m}r>Kes9@nY=) z(%bXS{Gy^UNyetE8Jh-a-OJ(l)#D2#HMJkYAJS|0?cT+} z-Yjm|AKsm+I9-jFwODBO{?2L{$Ix=^knDXnm0w&uj>KJH=}OR(6nLX3(mh4~0{sAy zkHzFrzzckC(?`a2$+)*e1g1&pz_){a>T3e=26&cyBzZI4;98Qks<;)wbM_4oo*)@> z2U~&mNkIBLi#U>3Yji7f*_})Wanus{F0dru4naL;0Dq(OUj(-s*c8>)auj9v$?;7b zKD~dB#pA>b1WlS}A;3$4VL8ACKzF#U{DNYK4K_A5?0T`J`1tr|cvz#ozKH7!b89yc zs?ubAj-rvvA8~mv)_vEbq+y>cpiTc~3CDM{W=~d7@Y7%IpDH)@0LeYTZP}o;tt>La zy5=LUT5dG~^%O}#%X~|Z{7rnjIKEZO zX-L?-C<*k>l;;eOcIoK&@`M~jn-v6B^VziJbg4eL8@jy;zp66oehP5l4*-&giHR@! zZGAFB80y7%Q)Q9NA;6ob(W%$JZ@m5y_|NVyX=D%20qFI;Ipx|ZtN@K3a)9FoxnXWU zCrFL#eh6(!S;P5WudgW(VBy^tBu)km0atetG za6DAnkO929&fLn%>Fzfvq?>{}J33Y%PIYgUk%$Lida&~dBo9*Dbfy8A!ykZ-M4A-R z-sZgFa|Es^V%-(k7M7NCXx=b*jVKGDv##jts5`0qw&vzTAU=d!Ml!qZYuy0CqNFCN z7`Y(1^qwc4TYV{|Iz(6{N>#Rx{&B&a&+hdsfv8XjV?n8=i~RXb(W$Rl34-s%mO- zwP8ck)A<053V=?2qZqsgciXz|z5)JNQCd2TkdTmxS2>v$5RxM~(x6At z$kAHwDPU|hfg_L?77jofKQf*zJmW|p;;`el94{Qo5DsaK2Z>ri%k>%~lDdNrKd1p5 z;GEZSzd7WkhtTUMMd}qIAn}IWA;qZYLle7SZiXn+dczHo_v5YL=O=WTIGA5FN zQEj=51$++DU4ed%qBRRX4af*LFd$Q;R`%f*C}FnmMZ7N((<7mm0FF2>0l0i*0kmP> z;XCMCT*;r!7rtT!#vCJeCdKD+tFq!1GSveNGQCct8VDCQi?QNBRv^lq#J60x^Dr+1 z-wFH@P}t+X|7bQD5Nk6kDim>e&(pwegFjZ%)-D2RCis*%gpaepSuE&#DDUmv1cvQq zi;}ntMN`R+1Kl1S8d^%`CF?DBy1jv0UY+fMzXTh!x3`BBDWFN6H~*vyXkI1V2c7pW zFDF`x`N{tN1R z!M2N-aR6Pe5n^lr7xcH5PCm`9MxV*u)MXO1aGaqjM-!1xB(lH73+>Z0B%Soxw@X z_~8=w4fhgb!dxGj5k+S1s!<%~wyG5S?UH$S9z)$8j#KABj??*358nwX@n#&|(=rI9 z`CL6h^Mqw=qOK$)I2cIQUP=~$^M;*WHA>7#?BRyalHKIqlI=`2AYwCyHtlaN=Y#d$ zQMbJV90(GlwMz52U8vzbdzN2S#aa}Xn7BhSFas6>QgwjYXkTFE*VU;5`~mJaEzFSs z0uBug4TOOs9S_N#o*umW_b4czpY81I@G#GFjj+sB&}Yq){er;@03EL2P}8Bep?MGW z4siBj5ji;`#n#%10R*h=eZn5T=#gpQxy=P}j zbmJI*8sB^*zeKa`Je;9wonzo*$mv(1<=TLIQ1t7jd4`#4=6wY)_P29%gO4PlpsZ|2 z(?|3Ezo;{E@Bj5wP~cy*1&%30)BfFel#g#kcEaVCD$oB6evi&~h ze?NB_{5|OW`%k0y|Ib6m|9yFs{}m3RUB@bTKG8@?S3>GG$z+fEY46Dc=>p8qF>{xv%V zwSY{#M8vChI#Y=pS&r%od-bx~>nO=LM_>&if{#QC@GCQgIVsjzk zow0_VbUz^68>uhcq!^7Q7-dchP1b$2rrJfDkhYl9;%54Yn$0E3 zAXj&tzJ*@obw;D{?LPh8Tf6a6TH$pc1(hYUJiE%mj53MPZ`q5*#!yDG&J!x%NBAxa zOVkb>ofP8f^byotd!L{b5Z~I}B#6m@b|v19Y=f@LR4k%1^w z{ebz}T+bSQE~;<2=idUF40Zp69Y0;mrPFb)rs)1sUFQho{V^IJ>BIOjD=NhOh$W5t zn`EHrzkgf=OZ%jLm_clV!|33MZ}bHYIS}l9Uunc8F%2`i>GM##=fn}u$;X%I@4)Vx zWQqGF5B6~G8BC$YI{a#j`H@6P;KR9u%85wY*Jk6v5;oPM5y!OA-ENL6fu}OL$dqZ~ zj23RQQ@?|}G@5+R*_@U%3-(0kP3Jp&ovWEpeWcTlr2j_~rtAZ%xpU4Z+sh@Wx(|c! z5}afGJ#}K9NcuWVzP|}hI<)6Rlu~qWS}C0OFZ6zK&F+UNQ_`CDV6RI;`_yu;MaMl& z#9VX&o@V3D*)MM9C>}kqDllp+yq0ja>XJ{pbgtvsQ{-qx1*%4Y5lGV=so#muap2+F zpF8;t4Z5^rLmGQca$SWj;ti>lF7I z{`fD4qi>q0tuae(GeOcbK%=}{`EbtO zZlRY+(X-x@^3puki3k{vn#v)EICM&@=o(8vAY-?3UeKKKLg$+CLZ&s1jO*B<#?%`} z*U`Bnzys3qAqp*38rvf!smA&u!Y1a)PE4|DN~6sS^M?}%QycMzn7fS*!lv3qLKjM$ zoWk8dd)`sbK%+LHLt_-ab1rB#e6MszeBjM1uXt_B3|0o6J6pX=C_eei>BFFJzLNY` z3y@l*xp>GZK_lQ7qgBe@FdqZtf|#}jIzv;t!Fs1#TnX$5SU87j(IAW3`{|UXj0}G+*?-RNN#Ob)puK`mx61@V#*zVpQG_| z0<)S}KEo^cwPUgKj)~=?zo-FW^UoG(HA-T^e0nq;Qe#~EK0a;BrF{N?M>a_FB6i;f z6&Rm7S%FtD)`uB{R-mzrAzn3xT^rCa)y!(+~Tl4+ClQVdp}!QG)eyawSP2>ekyNo71`JthM(R|^(s3f!zZ zcETC|Tyd$T6$|Uid#xt%KAbMjC_@TQ-oE~qEkeidZb2jSJQLNoRD?HABg4h7VEDzf zqAPBeqfs@nf}Lx0(x(FBjkxY@_YB_1XtohrB1-WijALV0*lekzgeTQGYSZbp#KpF2 zev4o*CFpNm)T8a5$Te^q7dn6*FmbIS@;YB=4Xa(W|9GAZESi_ucyxxadw|Z>mHGTT z#(h{lXPxmDENV*1vM;woDd;HmI9$`Pstv%=k&II^2E394QR z0vzY`K{2OpF*nVgEM{_gb3^j!Hx(7HiUNJH3Jg3_Bl)4r%BFOcH{!N+x++7p`)PVf za0Sw`ZkS@DMLJOhJNG-TL?e+zUqnEYmHE@x17qB(M7>+&d=6ZrsZz_{=*=njk6@-NQY19G4--8h=Z6A@o<93XbsX| z{!LbrKpnfpevclrqPy~vFGPiP_ts?xOE>i;lgyu+=0P5Rm96I=FCBtX=&q2U)#J#r zWp4TDyy0p62-(NJ-w4ZlLWxA=KNoP2cJeW6@ho>0GFsE=lV2RbUjH!7;q6*sBeS=E zP)SjT<_EsQ3|jTJ+}?qg44uy-qrP-m@lf0@oiagonnu<>Kg1^;o5AdusMT!F@ovH$ z^)|DrrRFT9M}s#{dKOuvC-J91WS&9r3lWJFH1EA~p2jk--a9rH(!}GaWji)#(5L40 z@PnL;S-Z~2axQ&PUsGJ;I|=mU!M*jHz)y5*ZixO#D}f;Vp)+MGr}yY(G?PP2#eRgj zsmeK_Yp-gHpvs|JKs6t$nVNlJW60#b;!!v~`8Xw2j8)L8_O%RFYI;{;!P+Vwoz8pZ z!>=1OrIrc)SGvlJe_r_uVu^;0z=M4kEU4f3%AJ z#EDXf2S(TDQZtip&xJ)1!KdUGr`&Kq~LGJJp@raktI^OEEAx^2tu*kWRs${SCa?!^)X_5$J9srttbr1q9pr z+A%eajBV|yx^XTgh6)Qk^%t3|kGsECKa|kT=jokFw7*Ho?JA7u>86(qe5N9GXum;w zvJS)NE@j$#W;yvnJ%D`9-mFtW_^8KdBTj+|uSA2xOm5L~nr`Z=5x?HI@<8S8FV05X z_orfA-h7Vo3g!!#no9fGth&b6s1ulLJ$AUL{aZ$Rm2G*iNx;waa3(*AlBz~2d@Ej& zTc%7uGy0DBJK0uZ*X>@Lyq9m}suS3UcmeXLL(tkF`<0o9mbLQ=RrJ$5}Lvy_j zTeIYhJgZn{!U9onQZts~V!OKA*C{$wt)U^IHM}~f|9$;;V;5FRjJ&;=LN#0O`6JQH(O zb9<_?Kmd>=XR4A_Py4=pDG!l&4}ENKM;8Opt8O{FE5)V>?^o)=%1tX+ruQZ<+U7Xt zVI|t{UhnycLk+vT=~avdsElHzcIoNd^@^Bp(a|hwy2RA^WkORHX6P2m@PGJ7e~og) zd+A$DLBo6bcI}0$kxuQt$?s`nm(gy9A2G@t5;D}fh|A<*6xsHx?dl$qhDl=A+Lq;Oon^gU*9(h2XYjyzq|rC%N|&!w1u#RS_)yh}UxRe; zDqSONbu7gw^`?y%S(vsyVu;Md;Sio6EZ3JkHh!-T(b0IU6B}=RmmeVM)sMJe)4;by z(%%d}c5A9a<5#xoQeN;XsXl_?MZDXZX05(H|H!k|5{Qg!kH_^OqkwENxG*RgM3Dt7aOdTzA)l!<_ zv*{|w5$nEuqu%GIhR-AdX>?Z@V1+CI-qXA{NuTkc;yojp;uOZ*^_6a&>t(LCl^`SMb6;2m9UAg*4LvEO3E3kwdONN zVN-9dvO`IVP8F|T4fv$Ib3D0ZwVnwd5=rGdJrRN~J^{;_14sFno?t*PzH` z-6eW)Xp)`-hS0{8Zj6_JI5b%i$|bD*kas7LU8Vb8jg7LD^2YM*O8BRSxNcvgPmnVS zPuQ*yoZx{(b&vxQe4~G+8X2hm0ipaVA;~UL%bA{@b2!x5r1erQAne!7AEG$uw2&X8 z*68--~LS&TWp9GnXis?W|z#>!fIXE7thY zwQC7|{z&ob6VqA&Kioc5uX7f-&TZ5qsCBpRxpd7NUH-4~$LQFYSw?d2T%s}*8K4vi zVV>N~!xuOus%CA-JVUlSmE2biSPK+3@~r}I_BP)ilDbzR=iB&guL`rIrNwpDWzw5? z^03lNlwA_)^~n1!PFryIM5(07%oCs_JrkvhOgF(&w|Ymj4@RgeDg-!77AS9r=$Xb5 zBH?4%2h~*gAfoT?R}i6MOi>)}pYnT+;JkwTCugl&UL|f-~H|A=NeLaOmOc zXH11RVu#|e*cBWqjFfSavacJIHSuB&*WK>~poRWXjHi+;e@!L=X);Ev1-mQ&wtzaaxOzLYZ-UK?z~5zK3HVJp$h8*v zp2jgdI0WO7*8C>Muo&;@8r5lE5u(TQOe z_9MPm0dTPMD#1EvuFVbC@HuVe>3dfI5ilq<+gGAjupaK_g$fC!OXEnEeaWaOhT@XE z=?04X3euwGA|Ja_nK~M~gP6!l3@TJ1R&mE?xPc8@n(yr7kU%}k<7Qh5M0FgEkEdtS1 z#cTFyzyw01dHrU7LB@e7U}Am`y9oNVoEzv?*VZFUZX)0Cni!+Y)o(Nt3U}MFyiOsW zpJFR3-empB30mE!PCI=JB#sD2N0g`mpQV^=-ZK;8)fMQGnrkhGqdTG#Ffj-A0i+!= zIGATeku8^}F$4+3HOO}UjNDe{2;*r)%|WY z^pKU}6KVo4rRI}8=b4?8&Rr`xvze76_C0y0Wp@cB`Z(M^Wu|v87$7xDGBybgw`VO! zW7fy>h_lJKzVN=iuu!vtP{gsHQ+Uy2ObGtu6%-Xi73saHc`v2fMN{(t;GCZV%tfwR zpdk(0nn8O`*61fR%o0QuP-qxcn%$~pv5TlkATyc2CTV=%Dnk;|#Bs&YQJMqi%p2}4 z8xGpH@HNNX1^#$N=a_ZhS=ZEn;1Ph!s(*Y4-AqrWOW(jlT6?PdK5Mt$!2eg@l=n}w6t zp*Vw?cbUEyJNMSTaCl_2>fqR%mBw3V@J@~3xGX<&WHZcMw&DAJZlh=T7ONDcNb1@E zQ{q`KU{y@f&m*kl00%`OF7rd~>(U55M{Q3s%($934&=VLeX&#OjLg$qW^!cWCRxHJ zrwc}Gs=d?4&}GBtbi6*|P}T!Z!U7lYS39|hX^f|Z#Bv>kcV&%4|)Tii=f zF;seJU%axM#%NR=;gCQ_*YP8Nc}bM!_4e1x+qd1wm_3viUw68=Z;ZLWZLMj9AK~1> zXEM@U$tIN-q>UuasU9K|r^qo>R!j6fv=r*Z48SmW^g8r?>?;;QbLHM^is=Yt@s!LZ z`U`_pL9C=Haz{7Vh!d;Z3hF%5r)rG7b2{voU!oe39T7^AK5-fiOj~y~B*7?^TBvV0TD8cmK+Slu zdW`b0brT8QzOeK@cn-q2Tyx*q^qtgtS z*s_MO;HfN$sS6td;JeYZ%CxM_6gV2(6RFHg=`LoUlZ;V4X8Jq?m!qRv+83j2i_~rg z14LqfNSucWMce1%iwV!(ruso#4xK{i*KG~E%-y8b@W*X3)Rl*Wf`~e>1{4`kKo7p@ z1f~NjGFav|@+rBAB#mrlP&IGPpFoV&Z+Cg1vXwB8I5@!D`ooN711sCu=C8=<_bov_oRql< z$m){0*N_^iD0S6>4HN@$2O>?Cp~?NbZq{%zW7rgqOl{X5kL~1P=z=7b(hs3_C)Zs| zUXVH9(=bB|8;|CxMx1zYWM$N}&= z^&UyZY4WL1qcV$1+1KZ_EBvPgM^&SsK-}R&KzGZh&IDy9ahIM1a+x3e&{yQcZ<*)Q zQ`E>x_rxzEteiHGTxTvV(i}gM1f~NPto@C4+V3t-z%}O5vthWtRd#DjHL9MVZAAD0 zk}f!mPZer}uS~;rib*L!MOOyK5CW=UtMlSlG4e3kB||GnFnO$E*L!7(Z;UxwT|~Qa5^P zENiiv3XgNe5PFG@1~8b4S0Ac4w8Xr`LH9~{+F2arEm5G1v*ofX)H-@sE`1qy(A9IU zv-7Qznc;$aXAi>N;psSTF=Py=OCNz-bY z+GF*#MxS`697@UzfW8)P)TNBsVDT*wD<(}Gk7DE*1{LXFFL#=B@QzX>DgFG%MS0Jg zURuKV>c>`U@@VXQ8Gpt*jjJhf=vim5=^EE-9Ckl1<1Ubkm$$VUMQ}<2EMb5<5ZmHX z01#d8L@Bf3?P(v@R9$xWT_<8m2MU6~UH_gF^8}57B%^C-&zOd78E5+QLU8mUF2OLL z^LDYGNHd&omE^Uh+Iuvxkw#~%`*;m{pLh4~20E(TDttZ416ip)?fYdcf--C*!}9xw z`@VM`I08@@h(u*eNL(Sq;Cn;#(q1X1D5dT< zAHXy!=m=ka#tXz(G@J82V%uisBg5^ zN}cBQyK|-zLeLGxdyd8!4=Gc1(;xY&95FHif!jHdA*mbn-Us-!;K0HtRt9+h0%=hI z{FHTgiBIk?O_Hcv0Ine0!zHYH$^+A$M%ARsR?`@(_Z%qOK;)vmkY^L_m~6*XDp4Bv zu8U)Dzc6%b3Ttj#DcnC!5F0S?=Z-27SEq(s0%@+DNkeJ7t0T7@@hy$cFo^Tj5Y&X2Q@9y_Y)( zE!ASP0Zzq~C>Ev--VM)PMcW{V4|L%i@%6+f9sBI2pcuxKBLeUn(6YlR^cdqu|4YU{WqcbMl4XF9$c&LSCtV-`h z#r_L7_TE*D^MMd$Yb+b?{%3CL!nuzluLC}k#Gf=w`VIt;p~#_NqLEQE?t94JmB1Iu zezu)Mt|!JX1Re`4SeReFd@;Lrm?Far{)jO`>-jyc81ZyFP*BcA1??>#DoW43$EJ)o zin1y_5t`+qRPt7G?dhfg8UG#S-UnEw%W^}W^S0TINqR89?GH_j7tj!n^S46QcqsgK zYDP^@osaE>ybtMM*2XorJI}P(ehd=(XEfX~7~8Phi6#^25Kyu}8M@oL_i?e5Uw5-IBPSM3c7!%C&h$%hAyqtiC?iwS|e=V<-_B-kDZTNjf2W7dSI+* zxON|O@t)W(`rZjpsNZw>P?~ttdHyHPIHXtN2D0Tp6>{vvK|jJj=T{J(B^le9=suLkMXM3HtRs0~ ztQolog!|>oCT2(4NASIa9xSx_n)KlJMk}X2$-Rh&J>!bt`JcAEXz-qIX9+q7A(yG$ zfZOx%RE|p4&vE%ft%3=^k|@9GCBtYx6}k#}kbrg##;-;g26e&f4^!SU8h+M0ai`iI z`Rgl3IRbd=D%5><8&FW6&dGfzL{YpOBk?G0TmUcYt6S>|`YiT+8_%C`IdhATP_36I3gdzTl(7|!YLsAh_OAKUS# zy?-yd@kG1A2Y=KI2@LA7$7pExhVIr9J#X`Cg-xuzsZIVv?EWA)NrMB^#=rVxE>a*c zBbQ*izUgTFjs-DL+#b!l3f~6Fmp6M$wQgvro zUkCL0!zjV4{MU^zMwBg{vsypILHEk%MF$iH$f66sGq2l$08)dUvJK>rs=V^OJoiC; zCZphx@)Q|yweJ+f#3kA0f#U)@+{RxAOxD!hXYK;7< z*Kta|BqTqLgMR4;{u;gmY&0f$Y&Z+9EM^DE(&L|h5)8D>gwTsLLNcG;mlc<1SfE1& zs~JHT)rqFOV@~~cPp&5EbAGlOFKSP*hFS0J9Td55gz0$~3Ty@+e+=Il;DuSY5?-R% zD~~)8A~}CJ>U?$W%P5Q!^V}C6Yi$hlFk8WZwn#}sOzx-VvUp6#U4`@2N7xL37{Mv) zew|>l*6Y`ofqMTeGbO+21MP^x9`wzXh=83&`fg!hc>#KU+@`>q!>{bTYb-g7J70!B z*UZpJ-`Cy4U0`9L?z2{)$wu*u&u>EQnSZtwIP%OxH6ra}@rgG~I)L>==4I>J$9fZt zd!~`vSQ(;R-?)A*jUq)Wq{@trhWwsk`bVHW^Gz^0_5&1i)jLDV^!#EdDE@6vPx?Xx zL=GBWvQUsAKO|vi)`vvo6aIa$FubS!`ya^vME>^+yvI-e=MiT3*Z2Ij5TtRu|L4vA zeeTMOPpHTz{qxAM4;8rcKhJzJ#PN?o{rg-qBE!GJ`R{GR|MzYGlhyxcLZ)@U`{aqY zqp&%eJMNHjzt!_KFt7CQgGCCt@5QePeey@#4CC4VRf!?HvXjT!@=Q!jX-c$f{kn7l zj~Ol;(KA&Ff=d@AU?k1i?$jr6dkNHX@Px*E493wWyQL4SYir$! z81i{ar5Z)xo!VVnuC!sR?$qGIz+{DKMB|iXx*UJH+-GHpEl?3GsHB7kR?kg>14fT{ zczFDon+vP2=W=p(PS4D|3#xG6B}kds+Q#$UdlL5Rw1PQJ>Asz(&@RV38SKr!uCD;^ z6KcJ|$;pWxs4Cvv+iM3GX9VA>m)`?6ehx1FG36_-$mHSzi!igc7FJfquWx8L{6u;U zS~7w9+RUn|G0k;qE-pe8y(*2vnwFdXs~3LPpx4I-3yb_l&a`jeUR;BM@i=yjtdT7g zu?8~al>)W5&!)b#`XG)|!Sj{pcdPVTQ42MyB<6|aZfS49P5xI9h~_wCa(}Kt5FM>8 z3JOI9t>KUtAHhuM(kZLbnZ3=Oolj#H!n(SoeJ0FrpY>ACnIB3&xBa89A%hAvAWv7o z+}v_Zt1o*Q`)KaqONQ6^w|64u?^q#sxWb;2MBFbRcOxhmF@+4xz)xd5>xm{1(q~Pq z!hg(TN;zl$CvbE;K}T~E1_NP%=y8%{sC>>UQuV>zgRZWw7s_&W=Lh;uPEJ3q*fMi- zF;IY#T3gd=F~q~{P(IG=fg0to#;J%Yt2lNvFoE(N@Flfc3`D$M{});B9glVY{tusa zWM!323eiyZj_jSR>>?{Gdy_4jMA<8ZtZcG(_9mN~nn|_aFE5@W<5<-tX5q zj_2_l8q*tKo0<+1uW70QrRYEX{rzBi+z2u#(Vwwqr4$NTFQ%!Kfq`CQIwW+q&OT<& z<;;#3O^4wA^*Jz}%#dD?9;ZLjj2Rt;D}Zu?kySyhd?DY0v_c>MC*_+AMn>}OCVTc2 zHSFy`uP)Ma^(t2oXKbvUa6Fri|JRIN{E@L7EWM! zJ|z0zx!ykDDKq6r_V5G z=h$xHYW#Gotl_0g?_aq%1xpy5w>Pm6>l3BdL5H>b2fRODk~^)JnYPOZzo$dEb1|9Y zb4M-gx65$S2{T|8J=Z*++b}5P_bE804T@vN`)b(I5s&s^C}&AN-GR5@LM9^Gta)Qp zW~sHx#rzf4zk&nq2@avh%qg-)a8hZ2V7G>sS%fe}iJ1*liJ)sxoZiS(%Y~Jvj*MO^ zE`EY|s;Nm)TwHvP0H4ju#T>}KvVEcT_4Xq{%(QE6Kgu!BWa8)SoFgL5>wQ?6 z80Z;MxgWGQc6`Hkvq@3ABur0J!=u8{Q67AsAF$@`a=}@8)EO_a1h`4e(@YgQQPvCX zTveQxkN&%kBZXnPc9_rnqz3-_?jI4$pC?8@2cO?x9ehPiqOGpZWVOrgdT1_}z|-$q zeT9oaRBV(@)0@YoPe1P;2T zW~AWh)7Rhso1>Rm;==C}-9W_t4Kp69hv(;)&V6e` z6;|RXWi&ZH>|)L-bGwNNLbjWzTpRe8)myg~NH1c~CW8Je>wcQT6?fNmf8}`{(bERx ztq)fnkK-m4m(}$BEgHk@;h9lwTfFaemo8ftey{aW_fi9Byq$KQ4jxTIzBP%Mgv31P zaCgJ5-(i38?MhG?R8>6S?Nq~?{q}oht82wJXtTW)A_5l5CM}zWa$a0a5D^j4T|U{^uPa5DC&vkS*ZjvAig6S<;HgCGwi=&w~ z*jkKRs0cXT=T4TBW4T@LGBFvwI=;g8IHe{<3< z&wU&AnDgpm<^tO4sT&jr^$qDMdaklxX0P3d%4lAF>}W$oWN@4Q+EdAL(ze`*zA>`XkWbh0 zaoG2WB4b`ZRq>_3kEPt0Qu{dKke2#j+jz8j(PS~R4S@(#`H|N9r}1}(bh|veXu*r7 z*N*e%wgh2`ran!ir?$!etpfi5oldvMB6k{2O zKs>aZ7$F3UL;In+M)fU(llnk1zoWtkangqmI96<63LP08?E@FNNQ0!97&_=KulqD0 zU{S+*CyeK^piu3IpPtr*J>+TyR$TOgf`WOf`#(=lPZ#Aykh;qi1HB6ChOM#&{ig~F zNHtmi`1mULn1PHAYL4UMh43XEU59GHMc(VkRS6Em4qMY3H}yf$M+jaKaquOe9Ba$V zQ-w;&<9vaZftB?-Suln-ov+(Pdg^En+sVAxJM{v*wjNx34wo}39*q(2-*yZtG8je* zGE^lUHi*9Cb>>@Z)M%;Nn{O3A1l2E;OB)x})Rj=IVn09b`6g<3M}l5C%U_b@)uwGq z>QqR#tJ(JO4(68ovb;iTT22lE5zrM{d$*yNw8GI@=&Mm18p31mFMYPE+SVTGQ@Nq~ zo*drj=*Sqe?de1Nj5Jbwn47XN+@lb#HYO{65gPbG35`&{h_A3%ka)|@nQ>)}wLP%K zofRh{md1z22Vb+4$THk+symSk>KCuNtsFls2eOV|HDUsVHct?Wz}3EIMGkESm{w778L0>aJd zAm@^C-0G>YSUr#NN!qZmFns418hL80@PRH;4`t$GxFA5YIA8xB4YoS7ITt1P{1jPE z@gWN)NP~7d7*+>mHhzMzr|zY7(=OOzy&nCpgUE=O7rtB&Mj&Y2wo$;O3;QYG86@H~ zF4!C!`SXxFq6q8NH$7(hRmNq3)(Ox`tyKD?+z} zNj;B;*6{vO=9A+SjNF@sa}(sNCYyyRC2jscoCJwNFb%)nBD|U3G;T!vh40)^-0+V0 zLY8B1V}kdcY*iU2u^T#qaQ9@_jwXIKN6^hS>0H*;74>UwamsZCwV|;xGCbx&ovL*( z8Ioxxx04DQWMFOax^6_Nd%5^y=HkD*z+@4w0@Z@*>Pi0o_@tyTXc(;YEG@q~HfpCT z(ed%QXhhF=*$J0wQrnb^d6JWy_&U`=N4B`UY|!$7G>+Gn5v(@)CMG^W>G}#B;>PMc zg@vxpZK;GksK|n^nzeaOyB-_}dtNDEA}UtD#z#a%c!A2ye7a`bHE_op<9Z=1A-Lyo ztZH`r9nY-~^s1ZYu2JypuhCY&9esGdCw#>YdEn1AHUDx;6pS)Fe27mL{6-9mkCg-m z`NpB|YEsv8_nV)8-P|V2T5<+Tc3LKdgnAI5zk`)ApBbyWyG9!X?FNXy=pH=4gB6KEl!O>Lby*D9)rN#J13t+qw*8Wp zh6`5d9!ACQ+j3<5e|wK!4{ov~WSbpTF0W`~k4{@%ek1{)FUjMG=dY&AtV3`h_h0Ly zgOj+=v4P$p8UhvH2(Oka1qsDxmByVp>@^~iQrgb%-GjHX;5IrtbCffV9T@t_L7KY2 z{8{-pevC~0)s%HRzmcxU6HCnq48)jyF?RI_ERSXPgK<<(OH&mYZGLv@Uh{_{Z<;W8 z5@?#m*S7oqijpXVG=0qD(H3^SJw2udnocZr(s`{H$|;2CL#6w(iPXk@6L0(!((BVq zO)H#V;WOS5pR493o3}nWNqG}Eq8lB2xG7ZgV~K=Mo{KpK^(QAUhU3F-A0g4u>Q8?b zY9F!ozr{O0{lB&21Z$_F*r=Q07B1Rd9vav6$B2RE9}W8T;5;U4HDg@^Ha;HJWQ!^+ ztLhJw;^;oyM)t>0=O9;#Muj!~r~5BaGnKK^`vVQy!sa&0XIi1|^1;M=_M9bCTI*zw z>CT;5ut@V&&S?hYv`suf$%ZdJkg}fl*xd@cT*hB6JqqXiESLT5TO(9@H%Lh_N}TnT z%d@kuLB?KN7&YZ{lVa#Bp~1qbt*r$GH5!DKxm|<43CaU6(Bsd8$wxhCHNh0(HZ9kE zFbq0gpuGwNX9Z-X0UF7V1mx_k%%MkXG{GuKZ#Fn9D;BB*R)%DT%JyetJtqmGoo6TT zPT%ip8#I*f_rVRkuR*m^Qk^o)e1kF*gD^BL&&lwPlVi82 z+|c%P@E?43-E$}Fm-+k6%;&w;ZAH$Gp+_N@esn4MlOM7?o$x|j9+1h)KhvzCk*6k$ zyN_=!?1E1)r4e|mmaNMtYhhy}rdTqj=gG>^(&HSv$gaEd>9w5G4x!3(csM-?YrAWE zOAc6Ii8l(tSQd0$b&S?j8uy7=It ztO{(0EJ|<0$5FkfW(hR5OiT<6ycFEOy6bb3KRIu0v2rSedpdg%D5%)iJMRd17gs%$ z>yocu3@VZe3Knztf^wJBM>hJu(!75g*>9LN`eJKT+2z!XD}wvO(G@MAATJB*0DZyC zcYPH5@uRPnRV^tfrQ@E6vuvRt!i6t+ptpyzA_CN$w&5r*U%o_m`TP5e7+*s?wX^$C z(-E$jkBNX5kvT@@SCXI>m*~Loupdb3p(01#Nr;H3C~w!zN~~n?c1vlpQe`0p6A<>r zhk=*NN40g3#_dBO6bJ(D)QXB*(9=mtNo^lWic9C_m1^eexeAB3u`lkSqS1GNIvR}z zanZ?IP;XQslBo=RQ2mBO(}u$W_(N&bc?cT)ihB@lXzzJ3{tE!{6A+t)N-LZOvTqeFMc_{rqEuc?&s7PUN@paYL&`r2Vw#Qh-+iq=4%=hk;<(&* za4W7G*`hNJXP!U)%tdw2ss+!M>9%rKHAF`*sBkHPy$zn8f0=!*ICFz|KXQ@W4ghe-$gSoI7ac&xv*xK27AVIqG0 zlJ(wsy<+p%oXO!Pw{ve6p?J!s8v)l=PQ&lu06{%=chSC-l#H)vlB^T6J140oX0e^B z@=46@kD?d$5k9E@fi;gCQoJ7KgoK39GhLmjp9c_=R7`Ca`goVV9lZ^wdcn`rZ`{mI zApGA35i|uDl%OYhUOJzHNkqhy?CxmYB`J;{YOm1QeZYzqr?S6)|HOR~6cU0?m#+ee zHcq=8Om7&@?~&j@rG$v+ybH-tbWBWb1)n^wD!{F87JTpCwv(P+^lnw7dV-N)#mS%e zR3+w!xVS)C@OPaSLP*I*t39|$LNcod>h+6L#HzXfWeJ{W|7ym>3b=<6+={3<7|{X< zXZqa*>$&5`gx|s1r~%SHFNKbU1qWT$(`L5F!gKoe|WtAJc#U=NWj$=N__S@A@ZCRzG*ON))d#?8EGuG}fVX(22Xp@UWT zEp{^e1fg)-d?UN~4W7}7>+uG&wIh<*&qoJ*W(11~`y(l|*%_#Fc3e2R{!WEAn-tV$ ze4Q$||D5Nq7M3R?;;C%_#!VNjEsdSP+hOWubN-dYD2SJ)XvTLEEFRA}z2PS#$<$Yt zz{O!-c&^EBjV~i%!@<`Jm>84qs<_-5Bf$ z+B-W%Wo55}KM38{A+crXDYzKr=~R<};Sti+r~INlk^xzh?hGbhk^n$^JnKW?w#k{| zNp!i=pT4qAb%`@_NsYxAjZG7d1+HwxH!cST1_-ICL&4h!J%O;dv$GL=ru0k3x50?m z4;LFzZ}O4xwmf5Wd46>@C0`;wDDj~boz@|~IMuT?G+ay(dOBfB7AP zEA)99MW|C#Q%+zX)5J%33MMa3fVLt}3>>dkJfmSl_f391EJe!@J=H!QIW~hja#}&;+D%s z{x_I-Q7_R1m!|_C@%+ZX!?Z}7DuL-J;h&=JBh3_;-_!5bkK-Wv#tnQ1m)>h;K2^z} zFv~>6kCha{trdFjTQJ+J@ZXC~|F^5bZJ`GC)2@+lPEHQ;#adWwL>RcbqS5-U%BJ_v zf=QVKpzz2IT}O=qxrSidA_71((znaDposJ)z-BA!>%N1l&0xL6LOEvz3nY%)ie_SR z5-XIGB6PZhWZLt}ef@XkV1aPN<$%afdL$UP4O@%`3Imj`dk^5ofKB!Y+=O=k-0iA< zRq9_JRp}Yf4joa@V3wlmBs4H0&8;$b#SnCi5}KjEuLSJ@9<8!xO>*0n&eN@>*s9sX zN7}et^Y#K~Ex+G*v$C1WbAVMhQ9J%d0W=<*AMwFVB9h>`6p1(z=Nlg%Kb}7N82|=Y z#IOvZ25!xEAak4IlSiA0Z@y(}Ec4Qxsj8c6g@c8|Q4^|4sSh!tREU-B%HB-)6_0%x z@n~-c0&%AeujW(#t&P%T(_8T+L|%Q-6P8EyixtZBes3=DlPpDKvoK(LYYX$E^av;&Vi7*3=CS*~gniD+JhR*bbimJAQAUy0F15 z-f3A*P#IP2i8^6ciqFeM^>*}o3m94lK=lnjj_fpEbcZjXI#}Rv0sU9lkvT%|0_*g< zUY$oDy7RMVXj~Q(i=&LO0BR!uQuky20H9NXxo;hEOfg_sxup>!<7dA%LJti*xV1D- zTGa`z9JHHqP&Bu-p?S@mnU+uPj2kCo=+OVxbIH!ly?%DI6?@=cAe;gJ+<{imBhTrK zj5`Qr>2wc(d71z?3WtAAgb*FDz%)QJ*GGwO+;|VTEP>;c{ms{}Ul)RN3v8~o>aNt} zEplQ2qw=3e;>G-7 zn(z3+W)Mql7>hNTod|>2;Kt1dF;OhJYu+71PH$>!4lgw-evfXlir#cnt=mHBbmzM2 z%bk4P7TZR#UEkRu^&zww0EFXnCBZZX4(JxHA(#ucL}i!jzoYZU_dX0La9*;{anRf5C6MKi}KXeRQmN@Uf6?u zCL9&kbEqz^uJqTuxsR`9UVXt3@lqzQA**2iuQuH zK0dzI0uIGv@E6(vuNg|P8ssLy!2p}g6?M^janQccA~yrn?}Ws}km-C*NE2?{_Y&8O zgn9q0L(${ON}tJ7miPm(8q^1?Y>jG%2T{?{Mc@NO#b+lav|qfoUX+^C{18Lis%OEqS!$!Xh9&EM`9ci@=&UB!c?MKEfhX( zWtkx4P655>wcHg9kB=SRBr~hKK>%>M2X)+!Y3*v7r>^^J1$h!;Oui=ivUdv$YRsX($v0?eQp5 z)#xw_>>nFj5zOF;tEmw{Ty8}&e}GxVbtsEy?%chb3cs1BEbC>bu?Le?9N28-(=OMy zex5x9zraguq(z-uwjTD!r~EPqeej)eT8dHE=Zb#^K8N}zyGuOa^i}BX4Qg6bhb=b8_e zv^SmpYM$L9K%`&iP!B)h`byjAwUvgeXn!P=HCCuEYdY}Qxc4ry!pL7mREp&Nz(hkb zeQ7siLY{eB`PU463EkVp%6J+!kKNw63XIv`wp($UHZE^iKflu~X4+3Z|I4?i@5+57 znve* z|1+k}a&SyGWTT6Pf^dJ|P9uNhITi+Z-HEun3xd&XqizuY+mZW-r!QZUBTOBez{k-o z06jxlnw9`+6Z*EUuH$1CW@azCYskvf@#F?N%8M)o41|h`iqoV$A2m!&=Mvk)Vg4#1 z;eVtl%4`3Z1k8hciJ27i;iNNp`?d)-c_^6twFlhh;vy418}CIRJi)&Y(@zA^H#Qas zvr)KRD0w_D1$OuLnsAa&TiU?NCM!wQ!J+JENBHvCU_85Mum2~-?;18rIA~a*UjRJI zJ?qP>lIqA<%Vxo@>or)@9yYW0ANt0Lk)fl67bJ#Z_}$wMy!|99ZD+=cI)-3x!o3)K zrncx>Bp)f6qI^sEW?axkmS*3yg`X&jVb-l8m*-r{^ZN)dw5*IT=MBF)6dM=HamQ1`KtmwvCC)!Kc%q{!qO35g2l7whl#)+wvG-%=@Wx>y8;!hO=>l{_s-3E+C) z#1vLP+6srvt=pW)gVr|i$b*MsvU^N@BIHd8V}17MY!1Ki{FbYk(#(Vpb0Vhf*Q{5U zB=@NP7V&JaHt=0x{l~jW>+%Qq`~bY*8k1D6_&=g~7q>HFU~_8uzpF z^3dt1z0doe5xfG>6UNixrl$9hr6aQ6aQgGv*x!v7Ru+uyA0fwbWWgLaz+G>)V*@A` zR!VFtw}u7=yrB+35)=*&E?HZiNh>P0CGgt99AV2-8 zx)=K#=3(_%wp;we-g`P^Fd`{(5#b_wNYhhOUV;5ExhVo|m1}b6QeD+)|5J|AJ<^JI z9*i&)O)c+5d5%8Bf?-E-SNG(H`7dwO*hwGtvIJ4JVw7=HOjv{xHT0-Df@&t5EQVPW zggGx7=5}Wf@|UtL|9%4g!2kZ!VFczx)NzmFPqa{pZ~1~BFNrw7QMZvHT;TQ^o+TK_ zSyy5zR`@|4Sf~ULLptJXPt|`Yetv=>DCnbpaUPQ(2FS zFvFo`VrnV^Bg)^FM-d`zCY4jSxi-H0w=vBBY2j^`=G0esZ&%Mom%lQt^V^reK{d5V zaKF?^;I_ASqeB_+tJMQeoeHxi1n8Q_6IufX{%mT&~O>w)5L;nS6Ll;oyWyZN0q z+E{LeM~?_#*ZKomt+9(4A%g;5ch@Y-Cn@jj$6hbilyt0LtFm89QOhj?<3jBUYmw=T z(l3IpTtLI}$7KZOie=>z8KNG1_QI++tF8l6NDwGALD1vYfXyVbhI&<`vHgp^SO4Pl zK%>U#F;uHcFvUdv#l`Rbtm0Z)l;C=23S6pGD1?Dt5KBOAt0TzeR#<{Vx?C0UnJUyb z?ppRonSG6Q6La?T;vMf9lphT+HUQMPwd1cth2U+6WLzCuTEs+k{;{<>Y3Ej>Wcy5QvdNYX1C!G3uMq*esP*t!=STc)Y>#Z&FtYb}bKNqC_$?>_+PmctKU z=Co9IrD<}qch*pqe}E{B&}xWYG~FArj^lgr32S9f-PdC;W9f?gr`zK-c(d7xe$ zIBMz_;dyM(Ja3*JF#2JCG#8w{40yVviZ7-@ESANTJ765aFOUou?qjzw_ss5!KGvA` zEV<_cNti(;oRSGa4nOUx{Q z$T+=#HW997e9f<|mgNi6u3LV}Is0YgxR^lbf!3$XcySwuZSVn17Z`5vu210_h?9r| zxo9>$TnNWmNX*di4m9`RRv7?E9P^N<(Ew+0A-Gh!K`sD~-AV*E8!(L;kh>UI1bHt@ zFu}c;p7u;;e#fa0Mj;;c`kf1`k}a_XjZ;Dc)H0JytwpBs!4BoHqK`w~2gud3c}cdM346^$jxmUR1}7`lY|4w_G6J_Rb`a@S5QYpcNd%Z0&cqj09QGGa==d-$1>BCo`+_{}5SgM+-#p`n zvyYjUj4Z3mXEQkW;1TI_l79BiE&l(zg(#4>kcm~Djf@x%6+V(AyJ!dpHW3WmS5&<&Khdg$o7DsWEG>n3CO4pvO$K|NR7^f|wW_ zn}KQ9qVL%`2Nx~wIQb{^;j12+{1BC|2zXsSDXBBUq#=cnqW|z{W|X|=Exsd`G|$6j z8P7D2@F_k#C?&-H4k0OR^p7bbHA!KO>rUBFR0jtLQF{Nkh)nMMBSh<L%Rqcl@6BnonwpQoWBlqLmg5@jVjd((^ZZ+;cR zs*+RVu#bE0`SWH>=+rA(54r!EJPx9NT)9@MtPX$fvQKD;^`?a1S0+|?A7wDi@o&O+ z1x$lmEsyUm`0KK^#|N&wH7wfm`8PRRF>6Mu7ED5Trf3qj{zh{LWd1BwpB8)7x2yL= zEcW9YySAJE9#%i;hbw3KMdZ*E$Pg>5t0G{^TND3XIWjU5$)iN*!-U8rTa~Mj)W-o!fB}%>BNsDE(e7T}=D}Nuw*`G zO&QIZvk6|=ux+otkn0I)I~2 zYExB0f}1(~Mxwc@X~1vHXZT%7{OiE>31Q|7(2rzPd__B0c3tdNPk_~ULz6U*>ta#hiTZYE~Vg)5uCwx|BCI%Sr$8nevK@^ZbG*s;YAsRqrLB>@8 zHyK(g^Y#=v;OFlB>5k?O&wXC*H16soD?e^$9SA&|i&0e`$$Sr>~-P9i35V!fAU?z|VrH}j^U zhd30di7kTzg@3g^Tk}n=u#GE?kHPV;)pz4hufV?trlSM>?%fz@XeDXgRi*`4Al>GQ z-ADx4(jozCuuz|aYm9s_DF3z@l|inilw~>wYi{yhP;W!^XyD){f6-y1cTI90)?lw}DL7JBNZSnt;A4 zP3*6V2HV}?y5|V%cdt&u7VtcD_7CDe#d}qM?`m57#glPY46ee{-*#03#gX-$&Y#<* z*!+fF?L|BlIDxf|;55sidT2d(bIl z`_aKs@cj8)0b zA2ri|?9O5qOt&_h#y`z@`uo3C5Ftv^;HL(bT&gllA5@X=Up(M}B_H&yA=8&k0Zu1& zMklMc!vmeCA9(~fbs0B!aKuw@Rg_H@#4q9nB4&|Xh^^(AJKWuYaE??fa5di0C(@-& zZ2+9s8X%;1_m6vR)xO<`W^AS_dUDcOf0DJ?q#1KQQ@qbni~ zW*+C=J4j^)h|#=baBcV!5gF1e`Ud{#-@f6%`1%WQ*%K0|42_KDp?-QbgH>PH6oqV& zV0iC8Zr%z8>CckTiolS1eY%zsV8bS;ct1e)%4n0zPbB*p5H6tP!i`&_CwwsU0`TJk zu1}D=*M@XMcitnNbA9_kzwhnE1c^7IRQXFGsd)Vyja#Va$t-$UBDUx2tu->r{FZ0j z3MdGUvZHyQ#P{kuy7xF(?gD}kblCOk$IMa9{;l)vLvnJN<7!i=S+yl#r^a&A3^`>Q9` z<0|}PIn=Ii-<7qXM~|b}dhKBg30jjeeZ%y)TwY|FE4y2n{dS{aO$%+yZTC&z+wI`i2 z5N_|C{ppOq0NxNf3iQX@L)7fAiZCwE`rq2mau-m2gu5))f!DR8#mAn z(UkR|{!eh)7<>XuW5)+wZNED@;7FQXdXUw0N{Kcns;qXtG#TQRinuQ#e2yQgQSGh<=aUeER z+x@bJ#z^D7k1TV0jtWagRu&op$bY=+I;eAB1e~8B0qJZN7B`?lFtc74lzz<>zXJpd zeF%F&7B)zdFjA26N-=72aZ$g~_dRK2L$(SUtsks8{Iwmw%kf^;KAE(6n1?@|7u(DQMJ7A%ZJLACR`g0ooMvmKohLej@}%>CbE@iQD1RAsIW=oLh=5Qge0BOu@ru z?C2igjH(95TSwz$FY1R+FL=XOMB3ZdaII%jVN|$e`vie_pyO^`iK=LGwDs$nU6PkX zzL<^q9X?n8tMiKyo%mosakT1Rr%PXD8zg~`BdkGLL87V|R}C}ijYHqst~;E%6Q=L7 z&jor){b@fDwESN7tyIJjWcgdIG->YLwa@_AXk@feGsD{t+nz~N#DyyVt1orjkpwP7 zP_OI{Dt5&;6@!op>N(A6DlQR1q}%)ytU??%>(Fyu*rW5WtAZ;e;7&d$6@q7^b5u>z(V{e692$f8i_eoCya z3wC5=s_aVylA;L-L3&{2v!5m0U`bmOrDn;)Px-KPRQQo(b4y3F2cY{JuAwAus+ zB{QOjO^DbYIb>fc!p&RUnh9bXc@mvoaFQhl}*P!ryaV; zttQ10?|WRoqGrdRr~uxo>uj5cM!~e(!hv<~$@2BE=btQwT34 zCb;`G0(4_Y0a91|MRRjA6sGVo+b>Crr)ep@iHtDppArP$e}$|jNO1^(DlZkZaGr4K zi*BxLFF{EG)ZR2usFnY=xsEK70oeBW7=U|V5j7fs#FNWk<{{P|k&mtN-Mca?QpI)Y^);lljF{gfo<238L=t1uZo z1K5Ljsk)4efipXCw`fm{K>;^i!Gn$_eB}W@acBG0ZIsXrGBF8s0_ME|g9x$$Nua1$ zhF^Z$ZRLHbb}fQ}QJ?mHov&isg{gs6u{FIXh@ETsar)x!1L zq_^kDpAsO&E^0ut zfD7LsV~T~lySFhd$F%sy``W!Faw^(}-bett?I!3<=i7$9=;esRN~PK4mPE<8#^%J=V^|J)kVfA;upd1k%kpg5SO z6vZP{wX<#*)3N z&l2HV<%<)gwDslk{P8c7KUw6aL(DxV+OZEaYckr`1X8%K;@=yK2AcQ%p|gSz?wQ$z@vmHfamIngln;qoskB=C7r&0|k2ZN~uEevKBJ2-zE`~T9 zT=Nw@^5y^R3DFqkT8wQ}kF0KOvg5}m0(e1={? zs;gUFW;tYdjXzjPd-X1TW<=M?FnchH)74Yn@VqZ!j8a|S7a*xVNg;4Le2U2|hl;+? zqtd`U)LqX_KdkNa@V&Z%AbcYphfY5Y9ojX{h_w|JVsstWROeEDM%`Nd%jskxciH|; zZnZD_)33n0_ZTC>XneFPGxcj}Suzt2H$^7Ca~LUvV%zluV7-m(FgzR;iVewFsPZv( zmu+<|Uemzqo#sT#m*_}KxTPXf$t-;5nl~Nt!xKv^?P&!Pm+gOe6o ziZb4C>(9t`!zTrqUQ|rX=jZ1&-yxUz(!=9oO^?4$jV0zEZ6De;%LV+RqN1AP`QV|^ zQDg=Qe;f7aiD<#-9^|zbziPrnMMFD*tHv1;Q`}iL7*ut1x@j-Bu^`_mIRaV;WDxrK z#RV_$w|bfAzGwFJDIqyO$}e85!uX3Zy2y4}VYPTo#x7f!U`inI_Ybz)-WQ2)yiW0q z9y;#ZelL!x+k8N-7B0Y|($=cAQHvq-uxu~aQ9(ay=xv>;gFyVqpWD&nj#d0$n5{H; zLqD=Mu!Wjsf0Q+^2s7T=)xLS2dDL5R7l&$%&jnKuOdPyRdpM0dwfyhmEZUI6C#R{j z7rqK_AeSR^IStj`Tv;|WWv>p?F|21heP}!PcfjnU;hix(ets8R?Kt0EiT8Y^B{L0D z`|3odK#W^X3b8MxWBn4S{~*-D-CS6^<$_xtZM}}WT5+g&XJqx46rRD^+&5|dhGLtt zW#0gXnADG56@tR!_MM?N-b^^(GZFb8X1(SvG|w;Aul^{pEYd7DOq)B`=uSNsdoiih z>%F`cFR%PDsXIBzkr7AxVt4iKaSrME@~0P;cM;U1^36+O9-V9apFfi+I2F^5YhNBs1Z6_Wf5PUMz(!7yMExwKYF@x~Pq@;(`G?D4| z+e&fog8hu#TVf&%1lYo9}B`#4<>tHlN7bh$YyO4 z`v>qDfzAEct|jd%yP&CR$M9T^=OFn3Xbcu7{A(|3oObLJnXe6)I(a;!VcnbWH&xZJ z;L_yBDjcVyzwMR5EcjVE75(qfxu=%GE9-j;1%XaY8 z7DFgbeU?>IW_I^6njU+({`(|}idaf*VEc6Tk|MM1T_Lxi!;*$$Wz*hXhAP3-r!4<` z6irg>NSBW|6!%V$SDjV5KgUEEWYj@6o6tYNBqM43$tHW#WTx=lwbZED8-{p{!V^nAZO8t*;4 z?UgLRr}yM-EZcj;MSq$^xsB{h6$53TZAD>ZRacYG{?%>I$1W+oXJxC4+8YL8bB z1b(4EV(-(h-pgcCI6j*X!97!0EqW5)oxpEg@Ro|2dV>ns-;8W*geBv0@7@)$uOM~b za43-9x|LE>^Sg5T9p%D!%vO*br~&@+Ab@Zon7 zfnI4@*}%|{n4BE0S}qa=T#Z`mJk89>`;r`}nFA0*v?77(z}QH5w-E!QT-%iFpj0@4 z(MBUl7ztNZ%zU=h>YF_#zw^JJThOsgjz>1eNmR?9>&^tp+*_V>G>raiLNHW!CQgop z<1b@ab5j1=yI?3b{Mx|oP+}!wi0f#(XPRi4Pd&4Anpk|{701hyC9SrIF2nXWPhjbw zXmSQUclp#Ea+hAYx3+7LImg0yxu0TnsgaXpNqOx;xobO0ec}1cMAu}s;MIC1&QQ+D z9GY!L6S2)&4f-GX@Qh6xf@HUiX=cjx&}>JV+*b<^22T#D$Itg;nuymftd|5`j)H<| zqD@xcHMm_(ztp&|CM2kGH_-uyU?7b5`Rv4~{`fDRf}n=TJK_X)-P`_(TJR^jV{%m1 zqxb(G7l4JgKlLy| z?B9aN@AxlYjsd2W1??jI2JrvYs}`$L_g?JQ%MU8ClKyZc*gYfYwK*4!E-|W<$WKXy zP+NDG8U*0iN5uPF|t^#97zBftQw8gk9jsKTehJs-=r zuLStQ5uTh!GaT}FaK5vnJj{}>J`OfO?C>`8iAAjNBBu}$v#5o_5 zF?@1##9PwhJwAWdYo_fR#$?$mk*`wt#ww>xmsTx4)bS{$==P(eyX>!DmavU)?DuH! zdLKlevn~;r%H|ZEsVg)s7RyenQylbJgbZs{%Wm6N3h^>VWQ|Pdc`9g|%$Fv%+$z{7 zyhbpxOK{Z9$S5Z%*-N*z`6$cNdIep=VsCNdr{`wU%l)d~Wj=3B%X0cQcF!0DOYi$hLmj7b-`<( z>u!QS?Kj~-!VO3g{?I7FM&83mk0jIkx8c>rL-6b1&`>iRC8Dlp&2KHMm04l{OqC7j zH!B@Tef-wkd~qRMxD|wmO3Xm`&7G{#Em-ECIl)KJy6@k3^X84^9{&6H?|Z~Rz(LCx z9n=&+Agku=aJp{_TE^!rF@RyPf%qIWlgPB^d#_^RW2&Czr1#rQCe)%`aiaZD=~3$Cp03c<#k<} z3yorpf@3W7)Yup}Lr9%>^4fzJg7}Lo-zcD>T$)i#o*oZo`Ekg0qK#AbPSnM|WzdfA zzF5ocFe~lnHc7MU6MG>kOsV#jot-lwFGJ}E#Ztz{@*9i+e`Ty`tugK0cY4ErQL3p6 z@5qpU{xL>(Ickt3+g-6+JRFu`22ALFG% zogyNWTW-3I;aoj)TII$s)F!2OT8d)nqB{J|)+q}_7Bmx$R!Fo&#IGCC>LzD4 zdjDwFy?28{Ev#7H=5t6(Wzqd)QbnhTPsDe-&wI;k6Dn=KAlBV+ph4)J;SXL7O1_)ZZ7n>c-cERzPX(@vZ0ZIw;^S; z0dxw4E8+Mgg_jq?mDj7tdOfNjCua^~qoaSF{sHMf46$ihE46z-1W*APwMYsE5M+_d z2l&C=52O*`IMNN5jaR?PVo@8-0+7@h1qBl!3*8!o^_W;pSwBRqthNfH@e$bA*yroU z!qNEQpBe5M7HRlzTq-ImO6I8Wb+Jk>Q)?@7J83P*dwSNDWYt3&wg@2d;BjLF?GcrL zlM;-HrKGNb?&E3J;JfqVcSw2VYSiN*&HM!g4sChz9r~VPvKCGYUkn!oiea72S0WA^ zE}onsmu8xGm$)XXuucYz{W97xh;QDghmw;)WhtVhzo`+i-j_i?O=~QY8M`=S_=4HrgI3%1Umt|L zp0>L=?XQ{$(Fv$fX0o%Hkwr&Go(>q!=od_FS>Qc={W{IgL?vwUdqF`~S(zH#SCGcb z#>Vzk+;8~_a}wMdKqh)wWp@tF?My&#(x=)reOp6$Dw_2`z23#6iV z>@2kXE1QMS*?I-`aDj}V>xyxFcD4thjga}S2)-7cr-R9@Iu0um#AG}wx6Qg64at_q zq8*iUibQ&POFdY&m13(az9y^poi+cIVZL5(6BKHT!4bqqav*mWZuu za=9cnx)qNUpYY$|GG7mJle9_Af9v(P)v_bcD#VD@b6Qs_IY3!(y4^5>inM+HbJ3!) zI6LbDs*;w@{&~hP6KA*h78ZL9%lf7{rQWzRd9Ywyw|y-YhHvO$M8YKVh4wU6oG*T-Oz14c$b<1)Sivia|dNKl7CD7rkv z8}Hj7z*RvO)*n!Pk-l}XDfWuMW(E*j8x(F3La5iUCdkw<}F4lWGzh2 zTynv+WMFL_p|0!f2Wz-0|AaBR5?yXtf%dXwE~q@EuG?rq`E3ClTEW9IS1AP5+k!KT zzV|Y2yt?_E{_=eGrvTX-N#fapubzE!FI;J%jWTRkVqPTv=JQZ4f8={=l&-<}ut&vq z)ShjnT&u-(q7FHn7Jat8Woo~5q33J&-Aj46{SRc7bF#MFXVwn*r*xE{s!CExt= zN5rR|x$1sFY=YusDhjr^{u5_~0bb9;H%>Ze3#_UO%m<72m^X7j^`K0TznDKbkTQFv zfNRTsyF(6_9@c#X0#7fwu6a7T)R57y_{k%h=yASvvG+{?Jrzei<5hL|Y@w%G>>@%` zzRVOEPto(ChUXha^_X*p|L*BdtuUG|)`|1|bk5<-fV5`;mlsQ?uK!;>GdjkQ@6Cp? zv$KO(pQ%d*VyLvy21Ma@JR=Yk1F_hny7OYYiB+&J1ISQ|Z#_o)A(NmWb>Zk0Z9zkW zNU~$8R=yf2*O207fMDD}@&-;zaR3KH&M#6wCas`AQ$&kI*?~0z#VrU1)Cpg)gP3SXsbJn&$Kx?I0`|K z0X(xX)45URsM1r zS$(r?6R6vip8I5~m2A1S*v{y_9+{Iu81Fu1K-B+Z>rLRXT-)y9TS*ZqB*|2!Qb|%~ zDl#Q9B+0BKB2(t6$dHgJWJ;1GQ^*t|V-ku`W+9m~M)y=;=-1XSvUqW9F ztL)`DnHdb+?uio3MBF5L`S|P~N+2 z?sBJeG31En#hV`($NaB8db%NxkL``<#z^&#^`A_)CEomQ|NAPKn|eh`PGIQ=CtVe} zR6$O0$!~r&a^>*U)RDo;YKLK!5H4x)M?g)oe!picJbG2xU4G3K>xK+9wsQUnR`H!% zN@_0*Z0u3}L-|h)Hr=?FZd2uj$k0$SVhCQ;<4+;pC^z?}?9F#eGsu4YWWN0QZAXVT zxRo63LxhM`Op+VB6vB>WPxjNRMLa8+wZYh=L77|3k+P*bsH-uZKse{2 z8F=eUA3JS~vaj4RiR}Ys5|TT=+luZHwyFYkfVsL5otkmF(Yj;_smS5Sn8m6ZTGT9d0 zm%n)RmB2UsVzX}-cfNcSB`cf#Ftxo2jyti-I~-_fnSC8v#C}GtRGR1SjcV}SWXn2` z*?P&Z|Mtp-*>F5=_6xfS$Q;q;NPRi?dd5_MXgfud$Ir2n8JlZU=e^omK70+Ys!I}W zx5(UFx{=5HQE?0-yRuXE!|%^ezHl=WNRMcUj@sGCx;0E&@E9XDw}+)E%Bs{u)hiR+ zpIE}4Oe{*HxNjbZ!T(80KdUn|)MJkk0TEGugKrCkTB~wQ+x_Jev^)mwfKt zg$^aLPVBq#Quht-BHzYoUJD`f zuD>If!oj0iJLj`qX-sa4zNPaT2T-?4IuAEbb4E{*TuR?VQOb{5DdGd~yeCp!DQHYX z6z}A97+wotFvweE_Ahy*A%5(r&oQai*m5oNSl6SE4n4m>W%|@N96V&uQ!O_YC8p7t zg&qd5GmmOJ1RP&<-mrf9JoNeuCNpfc8da~%rjDdEbYT}vC_5H)SM=x=-n;5wnk&AP zUS-gH{VR6lA=zY8LGr`$kE)9L%hO&75nI5?`vbume-Do9x&=kNaWI^qK@BRcb4|rL%*rsjxV*ImXbjgX8kSS zUTF(*K72iSY9VgACrX~jyXf;oR_+L&yG5}?jJnAkf136n?cr;Dc@EpA+a*)%=XZDA znV~9*`*1KI-1lM5rh0K#nz;Sfhn1ZJS7ig|&Rn^_R$LHaO51pUL?z_3=$Xd*yN0T^ zKPliurMGKB^>exT^UW(`J?b7yeJmSpnI{xV#(w{C5;RS7$CswZE%(*;%1>qOLjx&kHtI*D zP>FId<##|EAByEp#}Q901@LK8lLxQLDKX6oCTky;4jp*p(DQAohqKb?t>KgG7ePgz zIcF9%e*JOJ?YK3*?^YBZnwQ}J$;~439CjC4+x&2RiSI(Sgc{FnJ>im@!_!9qJR4Tq zzF(6coKn9mxlg;{{TnC#6OJ0)9p}!Dkc@77kdF#=g(iLoeIiFe&4{=CD*SZOHD|H5 zpl(@R#r{GaVYu7!NRW25M3Tlq2>^Oj>A*z zOr8hw>RVfm)zycYGB){h+wZvD=LSODJivvn#<3U)!!G{sqrPUz8LtlrKH$W zYY$IgWV8S)JKLd=z+>}q{3Z95c?JunXpUrsC(<{X6kN4Q%WoR|GxU)Rje(`_V@go6)ChxAyZuxS3=|?)%y%)a1 zxl_W?W>ak6arEao(AqY{k*_&CHPu%CaKX(d;rh&8CS^t{KAv^a-HjP`^ym48;T!+ni;76SZjhKI-G8r zJqT!#r$&DRg|E_9R0ah$o8^nx^K~X>igUnmbzu)BN{##Xso_K00E-=|pTX|nJYX|js3_U`@l4^8);CD(e@-#E25 zYA{u8`;V+)kVf43GUBWG%-lp9#?*NKi9I*EFV@tnyN0Evl_pBNJ0wJOa8zzsb-Hnj zhdX})JORSc)Izc`HoWV{kW3t zro}=LzSC2BC4VN=Wo>nW{!ra3VP}sY52?|i9v9PpXRsI{w!Up!Nr=If)i6yVqKte( zN&Dqf_qCHe;X58**nwYdFzaBgn~n(|x>7wI7nEJx1aR%Qr^9r`wC>XPvcSb#; zG{>neh5z;VE!AnC%_}+AEi=DqD|eiK(sw)dm_Ur*omf{@{kSmMQLM z^PH5R6ZP(9ulQNj@{wMH+_supgA2AfX@0X8GOSXJ%cP_w0`@Tf*nHBlyk+psyT>h+ z_yynZ5u^Na-8cTDwVCkEmQCbzQ7)xh;{; zzbjv<0+qJ;BMIr7;fMEi^jeOTCEM$0`j=l`-@duFJ`Af>E6VvMce`7X`g`XqZT6hSz)s=U*);BaHmzO7^1$Z{Kwp#6C?+Nv}jjq;9gil0z zn=N?P_wOa9^vjshOfCXpSA-E~7(x$1D&vNZsz7B zNv~2}C0*UP+A%losD}FY?+4(>Y7F!M@tPeP2!uLG?b4;u*C!4gqE2tS*J4&>p1&`= zzOJFcj)xCKZ}*oFxeP6OR@QTut&Gz56{lI^F`g2N@vqk$Rup=Qp3X*92 zhp*4SHxiQ=AD2|`sAHGn?+dh&uzer17HV<7mOB&&;8;s z*oZ4(5yD7GV# z!E(Jsw@}3Gn(*7-FHWqz8r!gVNR?AU;jHPC6_bumi<2X%#a8C4iToD*j_e6TncUYu zDADpt@-q$i4!dqvjyrT6ONQ@2c*N~b&l#T96iW+d(&@VF@mdwC)f9Mi_)S@^|I4cL zPfo91D&^Q6-dU6CH(oL?x#`JevCSRs1N$gvR{ABAt`=O(I9{OF&;4WS ze7l5O?a~$0i45&dYn}EA{>`}_ihLxTB5~GfEZOUa-u{?sA~}BN4QEP8O}_Tvh)SDc zY8LZdT@?=p1~gQHKtl)>EYAK6K7Fm}PTE2h>!mrsmwS}C<(qHn#17^Z1SH4I(6UEc zHoegAFSI&zMNlD_>U;2+dR$i4NOhIo$1x~G^@Ov|{o4;ymPDuZnJ#Qi(AgxOPuL)w z*U;e96MO+GDE!f*pVaSPw3&y6jnBu5i^*kP^7wpCI0v&ha5M9S5`#DIpxYZ5pB~hD zX$boh%z%beRmoxsxq7%UwpP!<>?H%$UAt>#GJ5fn`#D)1r-hE}k=a;{y&nw{8BoqJ zBdHs*mBJvn)bH=~P!99zsbF*gX13MFIU@9%@JItKy+}_7dJoedXp>y*dIy(10^uJz zbborEp*!&=%L>2ZB`vJ1hB2bG59H~>!a};otCXaaD1)_X{r6Svtgle2 zyeTNZZx@-tB}cJ+$3RGr!QIpRwKrZ18VY@Gvv~TZM{(mqj7c&iVK}`{F3N zqn9n+e%<2kUX_EG!!&Sbc&D8}X0PEefC>h|xsEES%4SRB@DRMh)X2C@aZdM!E$yoX z+DFc)jV?qLD+JQ)+y9ob>+pi!_eR#$H#xb{ z$F3gclKn~9nwF!Tk>^OG{<*a=?Nvi`qn5|I5gD9G!>fI(&F8<08#SAmj+LpSv{wwK ze$n^N-(Us=hf=Q|RwBg%~_tvpoXR7NvditcFqU*B_I@=u)em zk>SOR<+}~p^mR0!z446v-I*MnsAFw+fKF1B(;Kf-zJh2)&?G>Sw z{o=?FJ?{PeU_JZIC#NR@?sN#Su5(b z9C?Fj&9NiL!r~$Xm~~v7hjRCQjL<6;3{Y&jZI$KS?M_j=LS0oNWZ*dD^zvyvpJ)Em zdR~(vr3t`M<()qS1*_#keoE}PH^s4=YZ=j5RBls=|H_prgPIoC&uys`fjJDGyR^*A zVWNmmI?T0c0X!zxomCka{b^i*J7-czITS0Vy$G;VXB+G{=Md|K@002I1 z5U#0W%81LUnaDF+aFFUpe$31PtgF-|f8dEGg+WL@y2#U(cL7 zM}rSc;Mw4GF%s9Oq1brl%o)%tw=sQ$DI!(u0mS*i!$Y@c&si)MU@*NBhax?3y7V@p z+bv=@ObyFbYHHnXu`Wp1+ysJkmfSb;fFyvVWp}(*kXFV?{wSlI4s4Qhw2%DSq!v>& z&&X%p4k>&2V4G{JwArw>4Lzs^%IS;AY6l(|(VFj3UMTn0yqFd0p88WntIOx3>fQPq zDY@-^)K)iFpD?7i>5qIf&o4f%?&*b8u)lo)1TD=bhSV*Npw;;2xYD5$drDV%D1sKI zI5)l?KX^<3TK?Cr%qVj_%upSWFQvC!kLVyJ*PmX0OgYF9#lqY)YbAJD^m0pO(R-~q zv7OA3bT>{w%C$_PoEaO{Z9m6U^QZLLy=wEpo3-Wwu^C;Z5Y&e>#oY)UH<&}CUKatjm?MD7{0PyKeyY9 z<_1SpL-r+02F<+bTm5wbem~B8o}Tjn`SELQO)yLPvc|d83%N#j-Fa6N==0q?{_F$! zD>R;O$yZvG?xaq~eWXYFoAamZLdQN=I^Vd(=;9eU%b?)w&YS3=SHHm7#-=LxPq!M4 zB=pZJBT8_b6T?&9oj2HyKA*CNIlRYwxw7QF#`2bUwG z@Errf=Rl(k1hB30?csXJw2AL^DNO*o21{`>OzQB@nql68oSeM5S)eT5-P_xnFpr_$ zw#}9xZReulUf<)fV(F#E-UN@W9+$Dh*s0)A5fK>~7^fnezTUnP*e|$?uMz}%vs(E(jN ze%I65siEh(r?8D~F>-ZgkB4jf!SqJCi&;AgZPq?!Qc#E%1e}%`Fj{e!Z zUe%%exDT&kMQYBom?+n%|A;B19sj$9C26EWo9RBI{`%z|p9fBh2%Rq9z<-%VbJL)af)IE~+dGzttZ9U}Ur!OW<8o#c-+S#5rJGtvB z_DY-AuOi?3@+bE2Zi`DBRKI+L_w2Z&cFkb8%mp9v<(v`O!x?(?svNa}pZHuE%@#LPi{axx`P4r~ft=dnL-+x9|QKW#O*JsW-BuBereQ z?$fPLqN)ZZJ{rR7;CVbOb&1UKbjryKxB~gU_!vqH5+kGYV=0oROK?#B4N6 zr1{kB>e0VD{e?aGyx<6n%|9(So%M4I3y-Hc85-iwq7fFZn0O*6Q0n0ZS{llVdqGd0 z7%wloiO)ZZ65i}Z+xzVoxnb!qqtHJGR&|$+D$0bL9ER*_+qI&k^`xVM6>C{daD&*l zWm>R29n)Q(6XF@V{_%6PaCp9{W_XFE%Jw%*s$SnB8%^ICGJR7qzSu4kMjEHFtbI}9 zYFvVv;NaoI;ZcWPb>1*3mNe+qd{(I`HPvnsc5*v;69x6K+8(Oj{a=e~_1VmX=oRU_ zN+Z5Fozr?{@wVK!Qj zkapSY{PV8=ewnfs+0nhHtPyok5B}gB(t)H`M^%r;Hh$tBeAZ%CIP~!H(|3ao(|xC) zhD9Iu7yc}_mk-0DHSC}-THo|cObXW40^r}k`N9wQ z3|tpZojOHWY9Mn*>BydAfCr9cv#cbzmjkSZ?flPGBR=_izrKJ6K1SNJ%--oVzDu6^ zM97)5X9H)2PC??eY15{#or9@u=AC)h!|k2Auo26hV|e=XDPhPtI{j44bM23R#WLKm zXWnk4J+G@fuFQZL4h%*5!fF3*%L@kesUj-&lA?)m%oVFKgfHr2YbM@ogR2i*Dj)107hP#9k- zu7Y-FzEC$;%c_F3%F0jip1e2HDy5bd+mD9Xn|0x`Vpk;m(vnhB{m?X}prAmAj-3Z|7@y&K z&}JT~&+oM3$s(utfd~j2m5T09l5v9L)I4r)H2-T>Qq3j)5$a4KK2fbbIABKUQp3JF zxNKJb)URlBc(R08RR8=_86*dxk;Rkr^oFs_WrQb%hlU~>C!_s1N&0ua>J}QB$Za9} zj~)$8O>j{X8|ML)ki9vB@aa-A^#k@Ky7Hshs&BZNlzCjUG34u_cZ?ANGvWdMWE8SC zWUzLZsOl1>CT5Qtdh+vrg97PoU*BVUZ6?kbYG`Y&wY`xId$N)8QyRcHHPbnqV|K-F z?$Xjmd~Or|ExDVHbKY$#A?7)Q?Tr%xk4kx|)+Q#xF-Wf9$NOEU$MIht9c$EQPY{-Q zyHAVRoK7YW>~6dew=D*^&$m4>hAAZLPz1JnnD^y4;ZbdMdo~pQ;OCUid-D1C z_}q7KsjA4oJ%e$n@mcp5FJHc~qTf{ELeumz_LPGy*voM-k5H2{K}?NWbWi3avW=OO zPI;i26c1IyxRi~W3qAc4tpjn1yV~>Y`jkr>UY0yN(Mxx%toX~K-v8P%`{g(RCXXYx zEk(x5-BG+_V^_}?FUdYBeY7mlbv-RM9^TrjIoceJ*&WQ*UlsWz0n>an%blyH1>($}%-!V`IjJ~v3PPaxg{Ik^-yKP56jA~ zzrUZDdHVM4x~1i&anH@!yf;ptK8@6^cMgqyetsJXv)G;y*@}Vcz!+G|lHdUBMI1>u z++f4jMYo9v>5}hmI}%>sfnf%C|AnfMHTU#<1pSioP6Z=XghyO*OC3CFmf&`|;VtZD zY6Fjy`J+G4DBR1EbFmU(d?_-VkEGniFsP4!t!&TrHMQ`)^f{(Rua3nmw3nu6o}iXg zm0XpRS}VTi`Y?s)2Wr{wKag`fqU~JI=$3Z+P3TH5Q>0FoDd~-^{MS*Qj6=Tv5sn(e z?&4dYjNXCnr;4WP(rW*;l-yVx!< zrDKR2Q572!5)rBUJv)LcL0G#p2l+xIYX>#s$Px^8>wmVTgK^!*#Z_fdY5Ee^eQ9m6 zToplkX!#S9N2zi=?|W4hRqnaVyI;$?Jy?A%Y-e+uMW2}sXZ_LJ*vw2-1LIl^i@pxY z-tOmHAQiIxf41e}n)`WF!f!AKur}={t>8yS*aJg-_w3cHFo?ue#U}D>25XK+k=c$5 zF68HZ)O=8XMgJ^WWAxFDUg&brv9KJ9iDyDk7h|**&Jv^yy)_hYqSjW$`34WK1iWxa zdr%uJ-j|@C;$fxm6+Yqt^Vr`bo@>_t61r5FMgB~!ua;9%Q$Kz4MptYo9QkmBTQKN5 za1Xb>b@ul5HkC}3H8gpy*%483I5U+X8Ej}9q-SSu!ea-JkEkhv@(T%Bx#CZ=_2kI4 zo7;8UI?hdbjdcIHd%@B=aCP?jOn7XxI-f7yCNb%qzdKue$d{6|>VcSr9Ou;3zg2h{ z**0v`qy0a&mJ35$S{LW$ra_}CnNEO8B(6_dTKyQaSM1F)=MMoJY7dY{DpliVap#u7 zO)zTP@2VRoG_R}TA|H=~h&-9qeoRC}0f}yQr6xUw0wT3M z?=_BWiG0s?BYuCaos|F+$nmHT#da^dA-ybHn+G45!}Ry zk*(-T5sD~d<9!C6tH*g&6S#zgS}hyl(M3q=aQbw?b%s#qTFnl&^z^8}s0ePpSkaId zq@3kBryO0HM}JZ#u+-06iJMpY7<0VV8KVn(Fs+YZ43YL~-%TRYiPV`XevCsk4`P{p z_0#3j9vHpu`0-=+(_iYlzR_N^D|@fMU@oZpe_y)&2f4aWdE{fXfB;OYlJgN)z6b~V zzAG#7=pJKmbynlZKH-_!VD5D{|XM= zrusF2Lf+2YK*dJHLrP3c?D_NOh9GOv*Ir&;jD=U8FB6j&%lxJ#0wU`y{n<#e*-qYnyvm$z>GL6xCSuxb+ZOs8tDR5x;jhg9@Su52Ydvgwd zP%;oA{Yt#7qShiHn&O%1_kV0VFQC^?e9x1~2}Qlvs;mseAhl+!V#j_Oymptqb*fwT|V{fWozC5ODpss#LF1a5vYZGMfwSM{X3g54IcDo2X1aK8n z-Yxz9t>{-%ZFA2A5tE1~Q!+II=mil1#r}haAv^{kJ`e~p2vYqDVhrI-(^}*~STVv{ zxK4C99c4>`%g+O+Wn}OITY>UFajW>zvYSGTNmMndi5`y<*Z+*ryNn-Z+*;x|HH=iV zx%v4Zmty06Lj0$eD-N!bec@N;5pL5jkroy6m-f{9p|wyuPyY7GkI7@|oz2xLuk|5T zDC%knX}NMHB`kdV?zfNrFbr^RtZND$o@tBulh__IAj5xMv;Cd>uK!hX6}I>jb27hI zRyHog4{1Ev@7tc~j&ID_O(BuVr>3DFc82f|tFmZ)ZKb}h?!mSdS)9L^sRT-^ zf!pjBTH0$6zPL?SY_?L|;022_!V?W}1~$wBA(9JBh)g1=Q818BU6j&fvE!iV ze|xeUob=MFZnUFcN(^a2j?c{Z`g!Z#eLS!f3 z%&H*Ff-q@D+CUWlo@Xy#-iJM8JWl4?F89T50zjai$ZBezH#Tf83unW5;Th9goE32@ zJO)VX&OI$1F$#r%7V-9ZRa=ezz;lwiH-70dzesJWgVy!srRWd8F4>TqwO!%zQC51= z=Ti880IwI>0vdnuL2(TKp+Zz`|08*3_xwZ5T|nv;2Cusicp#m> zbV-qrJmU*!8iDl18kcxT&ODmKz7^LLs~jp<(OTgf9erOmSIjsgEWz-m#~b+5B)BhJ z(#p~&rZ(Ql(LFofW+0eeh zbw**fu`71FYE{sGKaQEge?5+b`jZr^0J~na|+402JZ8bc8v-+`EY%X;4*T76h_+0eT>6k zTOax2eJXVimHK9Ka_X}iEPKo13kyYvj7|dQVB{SA`AHvDJLSl)4U%|KY%14nP677; zo9~M4c3euW?mTNl)_UR_y-@gGNq&FB($$&6=@XAjdhOI3udsbxMOJa-hDZJu?*F~m zW&gUm!C%+lLN+kn|1Rv3xV&N#uv(S{iOu=@j?rd+%mMk|y9b>!xSB)p33QBscQMR? z_bd-bUQ{lc7cZLR>)cLCpv2Y9jB;-4>iPh{_Yu#vsQr)aFw2L_``3{%NrHmaThEkJ z(qDRSqf>E35GaH{-eFK--|-VC#AP+` zD9bBH2V=VV__@gn>lkXr;f@A3vbd}pw_@U>V~4r2f4sL`p9!C3DR1VwWE909IcL}Y zMN+h6IcxsEPnsRXL}nZL=FQ=ttI)D~`czg-atQf(Ug~L2i;I_E2u0k2(cd$)0$>wi zctuk)BKJ*5!7G^r+%!VNU}n~ba1}Q1uO=<+?X`auKImcz!ucF0h>xFN^5;>k?oZFp zd9kKSqLUnNf~_70y&dd6QD4eHP7ERDt&bsB&>QaZTwg`QS?bTUOpo&jtH-oAJJDtv zRWGP{ovxK(8?zfIVA~qp2|wd61MmU+#fn0NN#hB}v18#d??o{u3i*0=_}1|1Kc1Z> zvyY!QNqF{6O+G6b4PT+yv_n(nl*FkSr8fhiW)gDrK`IVmAFf<;Ft;#&v9R3s@kU$g zhcA;KK3efa1=KumF?(~4;bst}(;&?gmOHwiSQ=aA=2wzG8~C#L5e@CTDWB;cKWLc#l}G-k{dHjWSGM>8CP@kM(V5`SY`%>2RIZl} z(bAkZvDM+a;UKP}Ul!s!JeegPqkQj!Y%OKzE}oixb+yAEwB&6+9N^LPn^6p|88S_$ zDR^I^%B9Ffr>qq4wpoC6QuFweKDi*Ldxjhd|2l=Xgs{?Y5+ZoA$8F|ny1Ek2x6XSd zk2gb@Py5#9QH8m?=C3P{J0}+S6*rKGv_y~qxFstQ`>ls8DW4`pHxdcD_ui?-d68IX zLb>TEm6VjKWURR8C{f^%y*(W8RFjVgK{wiKkfII=z=w1XYR9RbY81ui5iE~YM0Ed4 z941bmI(6HL555t^#!4a)H#3A+2)G>Y>OQJLCdBU$)+k_rsy-L*+`iq5h$RRJ2sq77 zREdG6^NFPfQHCFvlA6GUbg=`I`T&GjDNTjm&M<#6K%Vqaf z6g$_~DF*sZ`{Kq=<$u%-u z-~HIDus}#8n5cb!%-^~(c+(h27y!;J$EUPUF`_kyxlVEdAY~gc{&D4uRNBEd*-=3w zVNP*4yuNEdq zH2CwOi%LJUC!zXz2Zzi;G)dH5Gib28(@4WQFOza7`KO@9eGVK zwTy-Z?^C+kQJ<=4k^++C^7;lhwj1q;7qN~E-F~OlD43qKca4v$decJm{vS;v|GF{H z9Ws34MNtjYA~Xhw)JCAJ06+G?)BPPg4q4qh$P->qYy#L9bj#d!BXogLb+-_r!%<4S z17Af1iy#{VMs$}YEKj03`1A8(Ih_@9cu2v+rI|Lo*NzPW>W3_jK^a;5R59GJ;G5*+ zfMaBM_(lT*gE(nVwxFOO;$Z~0?t@Tw5gt4LuE3t1*opWOAut9M9`KO0vMzxif1k!|QACp3_}dRJXm z<*;RZp;HOtO8J56>H(dCqdBg$k6Nr=olKcKb@nnZpLzEl`oQ@SF#LnM(T$@py`L2;&+>Ojay5uyd(wj15W z`36cq=OUGP-a)x`)Z>rSeRgR!997u8>3Wc))K%_jAmQ%${K~$6wE!n^U6S5}Xk5L@ zO|lOVcV>3X80ifM1g@&CPI~$BWo`T-+$1q|w3#Tmw&0Umw4aHWMkCn}rAbGrt1#*j zqAVeDY*5i}p`xmMu9ln)Z*KiP+|o4Ioo0w2H}p1e()=j!xup7&`CE?Y6rUvFxkl$4!WP4M(2y*1AryjimKD7Pe)RxE2Rzm|Why;^tky~EB0 z)~ouGzCL3+22$@Rjc!E#?eG^BP01T))QZRo-qU2yhmDtLYX+{b4p14N&M#bfT+}YR zsoAsXFV9Z+=l!_!R+fxL1WyiexaH+BB*KwBMEq?DJp+Re_CYFw2M>m&3KC9V)K+<8 za{>xU(n=@hcu}}(NnCB_;^H!dW*6=JN@%WZel+hT25lrP-$ENT2)C#}k*;g#%B*8F zYwtEkWX>51G3S66WZSbF&QMqgL@F;XB_Xzjjp~EM#1O#9LEJaswT&bIJ|w1YLaZ|p z)`|{4F}~HpDHVU?MC|l2VdkJpJ7%*WIr?C|=U(c2z4bG^lzGm$`a!iE|HIk2r~B@= z{KAWE)Un;ca>M;q1tox!rFF8ggdY}q4hYju6BYJ~URj>j4U zMs}MIJ)CS{DEgW8KMUKW7MH3Jqp$>o2CWJp!AR?9Gx~}9�=Wt;Mt}WDy1GGSEGm zSy|P_>=4gWwM+i?Hv+A3*Lq7ac%Wvtnkf&ZpYqgSQS^xki6i;UfJ8r zjwSB|t`6ODwab?S0UQ*#=#X$b2uyL>whjUJXHj6utEue((Yvg>p)UN(7cDoKT9H_? z+E1b=c%Cs)^x@;lqqlU_+J9duh1!X2DnCbOLLe`i

E%{q*yVGv{O$+b^pw4;CST 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 z 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%0DHVhT&ErHM;MlbIASq90!&9bSbUHNliy^ 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�#efO&Qj=Mm_a9 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ξ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

x!$PYU{$6L#_95Y>N1pqr8W61~&|RGr8& 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ξ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ξ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

2ZnL++?=1yQ>&CTO3Rl; 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 literal 0 HcmV?d00001 diff --git a/screenshots/memoqueue_cloze_1.png b/screenshots/memoqueue_cloze_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0a7b99e3c9fd6f047b77ac578931e068471385 GIT binary patch literal 165686 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ξ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 q=dT*guB!O;&Hs=8t literal 0 HcmV?d00001 diff --git a/screenshots/memoqueue_recognition_1.png b/screenshots/memoqueue_recognition_1.png new file mode 100644 index 0000000000000000000000000000000000000000..538269f2e25dc0857e8df683fb2349908206481a GIT binary patch literal 208067 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ξ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 m=O@?!%gEHnBQL-g~ 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 literal 0 HcmV?d00001 diff --git a/screenshots/memoqueue_recognition_2.png b/screenshots/memoqueue_recognition_2.png new file mode 100644 index 0000000000000000000000000000000000000000..920c150fb4753768d78e5d5fe69a363c40dbd9d2 GIT binary patch literal 225157 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ξ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 z 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ξ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

cX6|64iX$dLlF#B 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

{ib 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வJIvaKrLX`q#uFBycf=8QLs=#^pz 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 literal 0 HcmV?d00001 diff --git a/screenshots/precache_1.png b/screenshots/precache_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4a838b85c8c4051098762b7903245813f1ef0b GIT binary patch literal 242493 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ξ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 z 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 K|epAHVom@s=d>Igd*>q5^_~d{pJy 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ξfFjM^!i`ZcD_+XJVOLuX^;E{wnnQtaJjs%xWZzE=`Ng&+Sz(i40 zJwHh{-AXQNWet^}2h_2705AmSiR{?eLj-THfkojRvOF?vZA&O4vtfF#+_lZ~O(z9ZZm93L+QyrRT8Y+e)GuacY-2y)=8rPEpt9_ahda#}O5 zKDysp7eNHL@jroNPEn88l&&s=KND)(5-ACJCL$)O*}?$?W|bC%R^1K^0wV@&xiLaZa3xdF?52*H<*DhI%4s&eIu{Ex_HzoCle8PZ`Pm^ok$4%%vYC z=GC0ujS4=nktmm&%k=Zp7LJp%=R!cWN_ckoxYWWY$d7X!L6#lRMXI+{U6&Xa7Y5zU zbH4eja*Rgt?W9=kWwwaBu>aYwHpt;PTbrBLYU_j!_6`>|z_)fX#v{&f5seo_9P$g` zkR9se(qGQG4Qr$WdSo5H=Dph(>$O_UDCuG(XHDM)1=oH)4YU zkKBB`I^nLK89uc)ls|uxH*o*(2-0w>W^8dVl`J?p&;6u}9yw~u)$EyY>>m&1%V0x# zMO0q8iJb|#poG6LS6QU*u~rMEz33n|Ii&mP8B(24)rWLHPp5I#r$Yl{KFftJ*Y`%;BX0(+YtRq*uBN-i?u|12B;eTDOWIRkh{l%W!{^JAO}}gNk+=ee0wG@AoQn)<{9zg*svXQ|(lfcj=G zhch8H$u%h~D!S&Lv8oCb6({wk^%wa*Rq;|%Qb6Zi8O~@!@B0cE-2Fr22rie)nwuMZ zYznPL0xhj1JNwT)GIbGCm;aXET>5)Ywf9KCe0`fYMmW_`70UILc`0mmsJoLbyV-&8 z4tdetZH5jCDz4^U$_(4u<?`kJ751I{reM_ANSHpa`5oCrqJ0@ zIf+U6JENncf%AunR%(hEo>eq!8IWIQ^Lla&=1Tw&0-M7q&q#RKm&ayW+(1px(i@ ztm-62v>UX|h(V*ndRNW`3!kT)b}Hsl5eO>nj#Z!E>w$rR9AMaIR>u~5Z$`_$0HS5( z$@>hf`oplWJkaCtlUxC+kz1ov^>%d(i3jX9Ct{-n*df0mDwRzcTfEAZ>vGS+l(BZo zEnGOJVsk*C)jB&f^CZcyigtH^Sk-0Y=v6xrG!)!@-qc7g%z#Y1+4n-=XcXzJ`tj<* zrdPPFjva8`mOuu>hH+FI*b8A*o2z59jx<5kq2UOG?$)~_7<^c{$C3+9M#m;m(VP`_ z{XVg*%q&rXjvsS;MEhf8OCoH855lF?**Kc}4zaiPK$u|Y3Y%he^~m;5BBWou9sHyC z5`mx+IJczeHOc8I;9&}^K{yZoV1qVs4GTv4l=kFV$li=(6%O(A42wlk)0scUZ$uPr zkSYWUuaOv1xxno;k~g`*^o$!hcQV;oRYlw<>hA zQ<;xYJ)qwrNSqVCz2S=OCYJj*f|_P8%O&XE@%-0mt=J^uOqWPtHj?qLgACs>bPD)z zJ8f;8!g73uc{dOjdvH%3?CRxmiI?z8-t38&ccEp9KH$B%v$x?xx)d*WX-S|$dc08yN zEc|Os4B~lUkpkI1k+gpbp7iB#BG5ESitr`fG9Us5@prjvcw@|`rY2htBuI8TG>6x_ zbqk(|$gd~{9~~P*FD?pinA}fMN0gm3Nl97h8?YK*yelGOAY^*Jv0uVN6nrqd!hRNR zmTM*C9>#doV*T9(b^fD4=|Fu%;mxpIn8Y>lA`;07ByNU8N;=!G2?jI(5Cwbb?fK*v z(W74r6w%ksPyGrqgL>cpbOL0cUVOa#&*FyyMsZ_-QMzCAGm$P38!OnOK4#?Z{z14? z7U=0yKm;au4&**OGE`ISa|N3(!i+?97{J?D& z=s)K|_cQc>r+unxMbl+p1;Tb(vhkZ$wP{%_L3gbU+icP8{1)%pLZ3^60Y~)MVNyw{ z96#65Iq{#{7RlRMqEMRv6t0Jf(ljX z8*dLndO=FeKJEL)tr@K*En{v?bd)g{<^Dc4h8>5OVkj^ z6W1a^G*YdO?NF^P0s$ECg5-R&%u&hI<%nCHA$82Pdbk+~T5J9>#evF^*-ti1v`xN zGmu7cyy5%WHbeO@Lv(7qZqsIFCl0(Pzx;LC`DSmrl^zw)o_ceA0&QzG7@RQ^LetISrjrPc-&X=rGO3nURnM$rq6!W{%pKkDa)iMs_RKLIjH z87#7@?xHw)^}VTN~0H0eWPRhw*O^_@=! z1pSj+^FhA#+(Vd^k8v{tclQm~WO;dRi4HR>y-sUpp{WJK4V>iPazKxc~!t z$3);;bMDHyo|)MK{1Et^B??tJN!nnHx-XJ|(48N)uz^8r?pJRvl!NmPWiX$AYFJ1s z30%`9Q@#9}%DyT`ozF(YIlqK1e<)a~WE0oQex?8yxL>{DuXB(IYY}IWE)y2XhJ03c zsJQj;^5bLKvjfn6h@&5&Lyc@1Jb@x+9uj-?5@Zo$wHbE_cI7U;LVa@0@NH)1k+9o( z5tXk<2SIvf+_Alf5kN9o``$Zl;Nf>mz2m)-Q&U?PpsUPw=|(#bl0ijhhovLh6Pfdh z{H*^6P#7KgfbqF0noi4Iy?_K&)Vcz=LRmcV3I-=ovfNTyyb!YjlBJgX;vjS|x}>&Y z?S&VE8L+{dERtB}uaXt1Uh# z`u{VS#^L{?-sn66HY`H8M`n2`ZuZsY8uhj<9BIOX&Gj2P9|%|4fORD z`DKMRH2e4O9Ss^IaP!o|&46kQ$Zr4JxC<}j;2cAz;Q68U7D3EfXJyZ-k4DoLPde1w zY|H14Cy<#_u{;jD8f3vd+hl@zm1!4X1zD@}0);n#KYu zd4D2~HOj_j)Ws)JSgS*!yk`*}(et&`Se?1TtSn!8fEG~EMB>ZJ0N#n1iU`RgHa9jp zLMK;LR2^1Q^n@ekY^!Lj0f^|^hlY@7zUStYEtw+RTwywtzxcBGD@>FY0lL~xyyev9 zLXg(VHJ8x}3Mc$m3&7heDzYJ+S{;cH7!n0ceK$}R_SQByIJm3XC7|%a(&t3pWTfQm z>uA~7`Q!~AWPdZdK@a4-R)CT_n(+F)GEFHMV-ma&5UYDw7fD|G#bE&N+U76d_W#@H zoN&7OdW$go*7dpZ)0{ceX_X|@*|3#*ZO3W3O_WeIVk%(uQyU%UgK@gr9XE1!LKr^P zt8d(|FWku3S5!hAco%&219XF<^BqvQcv5_VVtnHVWYv z%cohkAQ5>~#UZ(auHirRJvw-8hEU6kIPVQIQVONDS-)R$IKCeD0vxF=hpsrHB_5QF6y)p}$uO#@4L>(aHj z$-C1BRS|u~pb&2dZ4u-xM5=CyZLr5kg(iDl!8A?jQvaJvkK|#%MS;q{zQUAiA{oJJ z@O`{Pc|e|osza$rO@r50EKV)~&7>snc9O!?r-gfuP=I7rvchBgdD7dHL8+Y9$6(so z93!vKh4G#~J~Cf6Bte&8GKIITA1Rn;m6p3+F2Qg;yYTu56$i(mQ7NpbP}XuQ_+fs& zV9^qZjYh|0N>;Q;ET+hBu2RXvrj~KbxByWx_=Ui$q4GmYKUQjyTeEbsLxnTz)2Hj@ z!E2-~-Rw3^;-hOI4a)I$>OU_+R^XK9RCnIrrV+w%$a11=B;8Nr2jsGwu1EV zcuziPStJ3(5-$QM$pjibtet%DvCoBqzQMuVg@uJqbzBcU07Jxn4o<(7%yR}&Mu}Rg zmAN<<%dq*xt_xF&dC|Fc@!zmR@xP;k3&KQeH|!cyT7SM9vbBl(F6?nfBjO)HT5m`p zC9WRv#V1n^<%%aPxyI^uCzvGUQEca$u*FA|h(&2v&b3X4(ALm|XZ4nHbjQyOqW@ zc}UI&Rcv{dbBufH3&hX+AHMjP=4DwtxK<3Ti@oD!UR`u}%LP!ac<9B>)5|V+9OazE%`Z<8A zY5QgEj=&-KamN^VOTxRe8+N3!VsNm^VO;47uT_zL-0?`Tt9`bV@NzlyS=UHYgsd$) zZhDfUM3UwDe7~Z}onYJxzS>R?sGm%=Em_If2)vu^=rLz@o#TkqSR4ZO+6HXqC> zpvY5>b{wS#Y%oY(GkctOd`#O+XtF(4hyMMNu5L`OKxH3XEuebC6^oMvrPpf`|CK7{ z!}SL+vG>@BsBWjsrl&f!23oZ?33X|`px*$ z8nczim4G>rDlo533-SNH$Ia<0Y_@Jh1feiXaID;~Om&hQ=bq_*rHR9p7}MGvAG@7! z!0mgR9v{1PfS}ApD0VeOCb{5>ZRe$TtwzHi*J&E~3on~ZF{isH&ab@Gg08jI0dQJ==SZ+cd=IvuNNH^xKN+yeoCY1?hfDYhVA|(gUVLvj^Ah5r4H5WzwGii zfX32k-jEb|>uFk(o@6a}QFl<^T`tmd`%J}d6plFG?jK(CiHZ&KmB_A#mFL0}G&D7H zQlR_haLG0)4n^zIgF}3d_v!h!<^KBLie<$NTNdp{Yt7@>?hXDk9$uA78nqUBv6=2| znkC@Lex;TB%N!W=W?}cfF3w4MMz53_LtpS;@vimGG4j=z5tQ(lw&p8zXD4xCdT5HZR#~5=S)**E>^V~}(vst|1cBZ37_lCq3&Mb9)&?E7mfd{~= zW&hMa3WHqGcXu`#gtLG`>U`ILf><|$&~?Zu`#NnxQb@<9>(x_z9f}96xR^y}Hhent zJ?T*c?<*vX;y9 zg^$i?e=Rb~$xLn&G|LDrz3?7orwFil_X2(9;7s>W!S`tgA%6Ng9alkc$(Yr9#HUZdWh=&YcLOtIkE`swnNcK{5R4wm9GYquD(PG z`xGTyNh*0|$Dz1uTJ)eesmaixTeXoE~1_`JZbQsQn#_;kqHuFcGem z#$9ihcyVXYE=!$S4Z6{>(Nqbs%WGdFaTLXr-mAn4+N&e?<VlGe@@q{)zFi zrIl-An|v$RhpWA9RI|q$Ig5*)ebL+NKX+^{tVlS~O~-F@fH35A*b*glS37NM&06r3 zh27)>+S*A=W4F7%kFd!6xA6oKYNi_Tir&h50{gX(w)#%-Qa&_IH5ODlpB!^;*X`9n z^Lm`ek^J!TpXagkg-TvImj6r^`H^M#km5DCZRySOrF^2ypsQ+6p zOm1u8W6JLj$6|0p^_97Hl-O?8*XmhJ|G82`wuKe&!Jyw9h)Ow8tZYP*7yn<={$}8S zm=F4mpM<-T8tBvJ;!n6XzP`w6WG4*yZ;wN5g{O3T2G0KXz}fo-wna`eIvq_d%I$wc zIP8H7VuC7pw`+mZuwB67P@-edBm0|A`TxdKs2=bD1Bg>uk(=+WubhJh@83Z)MdwfX;z#i6%H<4hu~yd<~nK zvy1D`0skFZ^GCk=X}ICpNKqF4Mp}3yD!0vCA~{*l#tLL^nxP>>hv(T0i^znGdT@ry z|8q7Vgz3s`%pP(jd53_v(WGZux2##^_g1(sD}PIFa_*w;tW#_^`_3%hOvHarQ?lWn z-u(P1575!1$jq!B@Jog6k`)K=pk$f&!@#s3xYBrbU^IH*_@-(7Z3*b$|MLn&YPU(s z&oFb(%2Ma153nyu>Xz5yP++sfK-|WQHMRzWd|WA%cX}+BmqzRIjc|L=0LhGcdq|?5+<-V(f5Cwy`uq3(9vy7Q$d`TVGrF4mzeSoQ~`9!C8B2*RNg}lMA!Tx0>^ymM6#gY3r z$+SxUBuipSn7?AyOJQp*BKX4mWp>}B_^5EJ-I{XL;3$$tQ@$HvG^T}frlYY$Z?F0Y zhl2Qjzs_wGezi>`dnqy0vra2|^G5^G-MElRy3Kt-I!1^_@>66hnF;AVW`D z&q|24@Bg{K|GY_m7qG_>a5UXk?`RcP*><(EE$Ok{-chYjS#g76D97)9zl(Z}sl5=| z$`Me?j{3h}(G=nTcE5PjJ=Sx&4XuYUZ7cNfPjJFQy}UV8d!KOsEoQGWZxH5yc@2r= z(4i^whSePk|moLqNz}9k;R3wF4S8 zn)pnyAcEC$R)CT|PN_h)+Uh|z>zl~GAI;6&;dpGh9;TFSZG5JzQNQAPhf+AW?9MTg zlGHkgh>1st(FABP^wl!VN(gINq2ast7Op($!YfH3FSz`_;oW4cx0`}RGP6ryosN6B z$NNK25>C^P9~mzePHehVlqauAoXX>>&WiE#=eMliH_O4X1-A}!@I}gnLNmh*a485| zQ9(hbl<&daxQ1a|HI_}8!xd{LQJu(QhC>m{u?@phXliQu>xXi3aiL-pGTwWtE%ZsL% zre=#RJZiKFRBM~!?@m^gb37dc)ClZ|TK3@&?hkNO#| zKPxDWevq;e_KyQ`sNlXM{c{ZLZaS|;+I~LH>`pXelZYer^bDlHpb%6Tt$5LEw+Y!R zGNUEEBeVhj;X=`Y1iHNkdxm+Q7kvJ~w4O38cYmeepF9Jz;}(2H%M;1II{XEB>;@&_ z9Np=B0eX+zeEXV_0pMnlyp<|cY@r@QyJ0%|pyrdL?I9bg~$6|&33qJRA&#ej@T zOQXZ!wM$J)8#AwcxgXiyrR?eKjJ>R3wYPT&7*dJuGjwrxkBv_XW@b^EeU!Mpb%~9O zqs2&(?;eS~^?&!e&#ZZPdB;pya|;R(Qs70YjzniecFGIMm{ zS95~yuB6_O(C0xgjIXc1Dm{DKj?X%mWsvgcJm3B<1Ry7Qqtz; z=7)3>=A@hwNwl?0|7F~+NrA zkE%#ek?0no%V-Ik_jnR6N;o7f^q8isxW#x6<6@0fM1vVOBo;GPtBE?^*z6kr=H`;b zP?4zc&<6XbEJB}}r^{6%aR_BMV&^i>W^}~C3c(>G>yP=mmZ;UIck#avThg~ClglW?a4Ofp9Rjw@JXq|#*(~0km*^zwf&heCBLNPEf;NweeU!|nR`QO9g$b--;g#!M6pn+A{J}(keVMKo9 z9~LJZK?@1}w;pg29M;qi`WN1_^L~8?1H*FCa}q2UX0ljpgW;Y5bNc8|x;JxU7`MTJ~AFdU7YcY?>vz(<-qN6_z{^dE)o z#WbCsLnSQiDFruo(B!1DukYJJ`K-4)BN-GVo!8Iea*g&zXE!%H9RUb(n=iRF=TG%I zYez>`#21&Btc`Vvpm!(&`syI5HzqcAkKgona7n}Nh(~DRV@GoBLBJ3+`0SCi<{KA- z4iUWx5|)Qp97AIx7T1364sz5to^Ch#x-V`2C`g&D?!`5moztWdOrYbXL}eq6m$hr% z=n~5{^|r%Ma5$Vc1dQlqQ>B7m(nl4frWKS?69aP z$*s@F#=J&%MT`r}Uq90|dxMGTzWtt_=L;9vS3bK+~jo5{3PJ?u*q99ckCB$wD zQrk1s1FV01VI*8!0fLbCm2N|ynVFfT=gH9Eo{jqD3l+&aI*S!^+&HH?J3;57Xz^4` zYHI&=TGL`&M1=iv(s^BjdL&i{Hp)UHs(uA38pjtJWiD45sQ$PJA}#Y3+V` zKtY_z7vjfY0ensK8UPET^box7k>~iz-*H>46gjQE~ zt!PBP`$JjuS1s$$zyx}*2=q^P6J8&mHw_I9r#Ji*u&}V1ZZ2$k*v()Y{GFN#pov!C z@wkm5564^Eyfoe8!eciTFgJ&vu@S)=_OQ0L{xPgqY!r%Rxl-u|gQAaQ03O6)i0sKy zF-+QL=l3B@*VD^a)6=v4qAIBbVzpw}yM=B@jib7GT7}7HAp)nzb}=(Hj9Kq0N}Mpvr#imo z3chZ83r||TV&LO7Nl)i(z8L?)klY)A&(#gn#fSkq$=?vJ_y*+$HFG~dKYN_b6_6HS zXIbhx4S&fxqDTwaYXXUvr-gt+%#@|ex1O7t2MxH#qc zYVbL1mWVkx5`7>a#@a^)0-Y%W-u_VSjxe4b6@=#c;~NmFR_~P)T*BDW+Uk0;^a9sq ztl8qyHz*G>EDnz;1X{2^YG>eRxy|1ZxYJcH+R#MWEUg802~sp;4_2i3_@NPO9nXO_ z&xbcr5=NYxK_AqGsN)rzRb=cPE*j9xj?GL^($fk26A;LlsKzq=k>C;kjf_OLv}h9N zl);PrLc_=RFOOtk`hNVO!<_mAcjJk@e75()}&MxjkRCJ?--boemD#koK-ZMb!@ z7F${0zp~J5^9V@cu!&8IH=FvIFHRlL>@h3P!^<<<+QYN56OK0~A|^Vv*A-zo-x4rk zG7R7RtJ3C0P`%bt^2S7;0Q@0QXgD0XLR6i#h;cqOvr_3$f84lK zCF+pOZbrMSz@t*4X;8l|nx}a7K zPvMSZstFNCudW?OsOQw-W_^m5uyu0i>YBrWfq_w`W@~J0q>PvHn}~>wMTZaYEh#A> z&im{>PD(++vaz97V=FZ>B}qah;N?XEPC6nn19|F@BX>gd3JSX+}%@s$d0zFP^g^B=boVB^^kT} z9$~Qh!)q|*CAMOLWbNRNk{W{F>Hbe98V%q1cjX8*%m z+p}@9=UWGy4V{lYB}ptUCw_Y>BnXDgI8((zv9W1GwFev!w%@-O2)Ql{zf)67(rib4 zQZ6erfz7g3elaSctS7AwwBvu`3^Nq%S{|8FntYz7EOaHH$(xdwAOE&YhZz}@Jm6x7 zz|xH8BqfEQtNJ;-EAM5P&12Sm`5PC*Ov;pq8bG+UW zs>JD|+U6p6cRmr@l8XOU=RpPzn3t!H@kN3aG?clnE`-vGXHae~Ktp#}KM0nZ73*cK zu;{h**Qe}BUbc`boEDq`AT({j8vm{E?&@I5sApKq#AWuA2Z*HJc=$B23O7r|1~Sh2}>CPpPxLNjFmtCA+*?-XJC={Sd6&5yWC_ zf3xh#%)-()G(^Thk$9Mj-<%`)+1XU?Xr2uW{^Hyj&cJ4mjZGOyZM?YK+6idky`vM0 z^o$>rz6dV__)f74KJefp_jjV`A5x{SM{2Rfbzrp4=H*SD<(zQ?yYae)4Vp@0j69-% zls$Yq!_$NadA!80t3JeBMJiAu3tN$RN+dD2O_nI=W@5Zn+cNl^w(m)|rItYbsQ>~Z zGQsD;CHEVo^M^{PhhUKH--@;=LG9v0COnnVJ1{`PeytZh?zz`jRZ;i&Gyw4)4L_`12M1%g=>Zf1 zMZYiLuRFLJxdP)Q)XU&ch4?B{lhM(o;rLFHfYZxz({oaSn{c=R8vuqae)^y92b9vvt1rsFt@rnnyh7K3=OwN3I#b^;c)3U$XojI z;TnUGba}WeGiu)7r&Qo_;^|_IK!1T=Z!t#iX2-T%#+l6BQx5krT4Ur{1YaLc0DMG0N#Uq)aZJFrBQFy15$VxBAJ3}InMpV=1xz`%c_sy@lol;rmdab-;t4# z_eI)m9ktO_Ez}N(WwZ~J7_)X0y6%$3R@=T z!Z>yY9&zwPGeyTH;38(0p)@ zOG6TY&pqrn`wc8Z4>0m_eSh{H`#C<)|ucXawRv!4rd!f`@d4BJn`oiI3>iQffaK8D)}{4I~ud`Z6sD*z){~dCR3HGCe)Lz%z)QVV%_kg|>(DE#bY< z;kv9pfB(Kol2$Qo&q#c{SH^|EG^C7IS@9kohTlX+mLQGkF{eE}J0s`e!7o(qXuQCt z`;0&9clwbbmPE>UHnH{DrV=;30_?F+jyR8NY zRNufLS}M=Qr2$>L6jugURGzm57qdTz`K3S$ladF{*a%kj>muSw|H<=4nvJ&RCv3gIp92Tz4<@Ey5^>rY_m;#A ztIV3RLcbsshs|$)33lxa_U6tQ^dxnt;v_4|eqvwO!f0GzLT$K8nGY8Pj$2bw4tG?D z*=<*`iN(Aa!F{pnupmn4-mRP@Z=s+1*8fFYnSd>qg^4MeMT!hS(#cY#l(f6G6kw45 z1Zr+Njk*--(ppjP-_9q~@%{1CXU{b#ee%?5jrvrIKH_Q1+`ChD1~`1m1s+p)3eYI{ z0+H5Qdy{$G5Ks4)`NA+-W!^AJ$IezuMPyeO2&PYsmQd}F_suc^xnv+dPvo}+Mb=|a z+Q+cSgGhfbrO#a4j-?c28v=;*?r5boWw@95~5tuvs2h*nTlYcywrgt^R78Nz*Z zSkKkHeoOte$W(=2(AU4tYCb9^Rj4{&=BMfGXs(u=n>y|RyCqtP0wqQm9t&=va(8xy zcjbrk)Tk(d+M=&GOdh7u#E@}PWTD>A0bKkZ0}Yi1E>~9^0a{XII8tPLd(%iP(>!Ta zRaKS|6CfZhpXv$Q4n)Q&aB`tyVD!=$h(lI5&e{8A2^5dTXdudc871YfYq4mUaB*>!Xx4U%K#%6QWA`V}4NO_gz|j>T zOt8HM(&*S6mQNV*&rkQK{j=cO;pgkjgsY9Wp~{%!r2-N0M9q`wb2UUnHroe$goD)T zt^MRJIY86pU{&>SNK`Ug2hxb$C{>}buOCv?>}-(A1m%8siB#UWuHjSt&yXf_3EtI% z1L4=l6wzi@Ia?8ReKfzix%n^RBe%jLeEs@)5z)prR zakPB7wpP&=9&GAG8U|Qt-Gp&aZfz%jfUmP&7>>^Av2}9F^J;Ap5z}HTmZ^5_R0r%1 z0#qVpu3=)gal)RJr_1{4&sd%_;Wn93hC$1^M>u@tjx2*UGSK8j*gR}b+E%6Sy@|v z>H)O9?cF(MOiU~woK0(+l*K@}57KC2d)GA5?)ktD4xlonPC5+AagJg z+St@6>6x#2xDU66)3`xU$kXeDCJ*!lB~=tCP|B8?9E#ub>*$E7$#2^%*3A8r&!k}d zlaVijmy*|2BO>sly{pkcUmr2h7k8?2?{Pd-M0~~Y;W`a#W_x=`gAT zGj&LS=`ieF^*Nktj^|w8Y z&_>4PBd8YJUhL?1!c#B1!w3Q*BT;lbFIu~vI-X!qZtoY~_Rt$#o=lB5~gz32ZBWr_|N*tWG&&AY&bNhQH~p^Wl0><3o2l=;psFSGdJnpX*qLg1^3*x~ZOC z84o9Fsq^Vp~uq6=AV!jzR(yUJe*h8p+$t9h-uN~zjF8zhW8b-V}XlP5S~o!|`a0tTzzdc}BP z+Uoa|c|z&8t|W(@2FJPU9aT64gD@yL=kMP+Ce7Kv=VP+t{0t6eQd)gmV|BqpMD+J? z#XG9`J6*xh-PKKA%iX=pE70-r3u@5p9Wfg`YkygrE?r=?#uo&{CE$^@W<_&hrC&}B zgbAJiUiNjrIlh?USb1Z6;w3mAyiOb~;bOJ;E!}1*nI<~=@$mxfJgnn_E;==)V^EIY zqYoXu;+)KF$1We!qikvl`?HB*0(~w!XIw>O`T8X20DXK=y2gvQ&XcBeh=xv zQHYCow=yRuy5DpR4TTp@@R5%HwhmGz-iWWvF$MdwI`L5~aGd9>fFw~Ow|u)cZ%Q}6 z2GDiZ4|cvN6I}@c34kCR5(ee0uVfBO34T7bTwy3b+x~KPMH)0+c3!nK^1s6N^7Dze zb4r>Qk`*p}<R7$lQYD>1GmD)>+YDN z;6HpvM6ZpFxwcDLFcJE((fJAbVw-{S@@O^-lEK+>WSy+tb|+#_o1D7n6FlZ8P>0mi zI08Be%-_;GoU4u;X}|3sr3dPwRGu*^_EeFIUT>7o;c{!Fa1cTykLR=tez$K;4J-3F zOM}w`J5^yJU}ba0%m>57rUA>`JurYCylM&YSyV&aoEq@czc0L1T00d1-5H(c8)oOM zvbwYL#aR~l>@7)baVWx;u&|x2?dtf}z`w2@4e62SloXSgY(N$yHZ-^ZjRFo9b~Rmr zx^i6B!-GdWCN_G&skSmCM7@-pfuXz?*{DvwP}y>}VeX$2p+J1W`pimVjQ*CZ_sudd zU;164yrl~?+}MnGWe^^RHRBP<1qMU6_W@Wua4rI_@Ho`2ibg7QKWNu`L5|d#i^h_N zn~t?45$Ut@5&7`CUyqf7vFy&KBl~Oz(%tdoZy}w!T*H;lu&|%-@43Ff$4ePi$zsAo z<%mbDZY}e^KIsX*R6$S&KqyX(-|nZ_0Nx|}WS|v1hP8zgug$jji}@6Ea-8h+#3PHX)J$WPTIc!+-CIn2n#nRdeQnYykJ_Zj&H~eQoDJ0AW#Pt6%}n+)f0is zcPn5=_dH`_l@PPyz#AemvUngeWC42CQL;eU z+1@_ay}m4v%U`qIt8=xHHeM=;a}DY7>FLhy`0ZQ2w|&F?#u)*?igHIZflaT?`~l+< z=GtPW9M2HKWH@c3BQI1UiqY{@0D@YDb_5LA0|zbC8^?RPMALXz=Yx58vKM4v=9Kv> z3IxB--k12WDoD##th$p%WrMzYGV-1Ou~$bt;#G7bZ@q#p)u`PB4giOZZlsu)7+SXr zJd(tLv&&Q6za657OYQ=*mhnbkyt{^mWGJCCRYwRU@)W0S77edPzh7+AC6s^btH|<8 zVs<4q=n1dqX0Vl&Mb@Z4(S0l~AFXwuXuCTW*Taq`*41R>WRMee6AR38_CH%G7YaDH z)U-M7V%Qu^V)2N}F!&1iA)t#uBkqd3i9r*NJjUf3F6d3V5tEQ4J9dOFL>_OWx=Xq#}~QgKTfCr^nDPNJqQV>+AK4xeWOnF&RL(O4b%ly+*0+5uM%y ztA(?R3!`;^4l|6gDA3-Y9-hLUIBTMjt<%ouXgZVd)nZz$v{@GkVUN{>Yn|v?E zrNM=-A|knlqj+!x@Z%R4nC>gV2@(<#pZX}5(!@&1d3l#kTk1Cz)Nv))6qO}OsVwKK z!k;~L^2NgU@vEXc>?VJ%0bX3Cyf%HiTPJJpB5BP20xk z+FS7`V7qu#KuxyeEswaoUj%8RRf+eOYZ1Jk8&jKa9HGdr9>}tYTn~SZH8eL?diibb zM!dWwv!d-C8rrfqBn7}Yu)R{HluXG?XR}7iN~`j4Z_h`XI#0W`2|7tAD|EMnfWSIG zPF8MYb)QWsCx-1Uq+e8@;bQam5le!X9}r-I98f_1b*TYX6?J*x=6D5&Nl~k-s|Ee? zfJp=&V|2J1?YKXwFsn(qP=8`L-14?_C1-tqU1%to4FI10sFI$NAXU*iN8^LA6@uC>z_8 zQHPMr;G%x`U>apnt3GYDC~|YGwKtceQK+&nbzTj<8{QM?`~0G;5>}&sJ)SAZtBrR9 z&t|S{0xFzAjfyA$DdSk|y`-e2*MkUmP#t!VK^V#0Z=o*Hs*Yegm`=%4W05UQjgIya z%V8?PE>-z*b!wZ6|4~v(mYjw=B@k)fVe1_8`j}rpUx*k^QZhF$FH5CRp>QfUA1ifD zd;gLcP~l&TXEJLp?##mr%w%|TF!Gygri>AuI5jvjwfA(Cx4ab|_#Gaxk)Yf{sy-oT zEV{uT81O{e>8w3=oRkh($j}r285oFN=5^Zh04@(;i$ElpC8VIB0AL(9Jb_@z(beFp z@frgjDwbSbj<;HW3)e48_t9d*bfpXlkh1mUEfG?ALd9d_8(VEHynA%X?DRi%ZJnnv z@!j3mHCnFwzh!>90$LpN*@ymD_EQym8V4W$-EJ5Gpi+b3Y-GTl4wO{H1N2mDKK<$Q zeg4|}Lh+NVcc008Dzh^M{oD`9OH**<~!ADcL9*gZ_(!LfDP!G&MPJ+c-@J!m{4b{FN~@%$lG`WOX%*llcr#oJQWm z>A@vQcgN^>rL>sFh0`O9%h3<+#5iCJ4`f~1({!A=*nvV>x^w68hy<)Z zBKebtC(Q`YNBAlHmv+w;DduZjefSegEB4t;4~ARwwh-IS|~(wIFuWSV6FMr*(Og4Drc7) zU_Y7N2B{WS$#t>qVGUHqpG_vq@3rc50}181sw2ms+)D;+ zIvS66es3Z7##(7^j+YE>%6L1B1yp}HcZcoW-rw5;ZWovRH_EP}OvFc)klb7mcAF*R zs+lnwgNyU?!E1qOK*Vm07!9~SH%?#f&!rJ=4?;S+{&^D8d?= zIqH=#F!XGHPHgCOql_L+S>eFZMkgc$f+`I&CSicE58{qg-q<*Kk>i?Jd77UZFekrwi~l(2 zBxDR10c_-2=49dbSbJuJM#hNDJ8V*pwQx{k9KPSs-0bk&0oDA`Da_8v?v10Au>l~B zMBLmyuT2#J1>~zKT>yosz9MmEF~7@0ovT|$c4oVHKr}X)VEF#p<;hCo_E0i$yu{t} z1J~hvb)q57!_{US2AGG_6W?3h!u0&LI|4^^XE<%P$qJ^~`G{$kAZ#Y^dC!p6{lWX> zE!reCCZNO&$K);=+)wxx>P|#T6|)qJ;gI1wfa>*LA-h0rg8T=)ZzUeYwe~f&An06wS|3bD>35NBW5CLj$MFr z@W2NC%d9y%l|S&WgyGo~T@o@`!g^{S%S0}FO2g;m6__wS`4s{q$Jtm<#)nPFhnpO; z*zT5#W!9=H7MZw2>iCcqFCFt!)&t<(0!sMi_U3D$frjpc2lwOrj_9ypBy~;9u|^Qt z_IS}X)`C~7sYL|vv&hKE_*`yb>b2(Q^Tivtdc&H=gOjeR2WFF$z9alk{=i65VO(kz z+6WZAQgzk>i^So{5;aI5X@kG10v1}3|4&(@WL}{%L;G`twU$n{(*PFFOc5q1Rt!P0 zg3s-|XuRxLs$${HcmPZ~bQ-KC8~Jp`LG%{NDCOYzt*&={p|r}?wX+|0W$?JVs((D~ ztOs0Km~c?!?2~U8NEC{NxgZ(x@bE}fpEU<#pa2jqT=cF`xxdx@Mn}1ww^F3 z5_+g}+}O zT6ExX_HS7()h+E4sngH2%7)rYs1#3?tW*TI@TB?3XURt;Cj^FuvXrXV{Tovl2Fzmb z;2`UO(IaPr(*e7V*A<=8a(eHNXU{Qny#tkn?zcMs0|}ymuuJ7% z!C!Y&eZJY%jjpa(n4WoX0YZYHZA|(c5j#K(6%~}kT_XAA4oa2!P|!QrQW#+4o-%Bh zOs7Xj{|yXJ2xVSw_s*Cqo?!+s?Edn&?>s)AY6n6r64xgv2nP5FK51nRjsv(R2ND#3 zGotoVMSta^Qerz>?)bChIa5Sfc;LZ4*l?Ccv|4Ddf}LaL!m%jCoszQ=jVe{Ctnb>-*&7Kv1^=`JR*%BlUYa^mN(6pX(!0IbI98 zE?K)^ISJjdkuQidTFs8#Gd)4=FI;_R?Fblo9W@Ga$!<;uKw#$d+%B2pDt|Q>n9gP6 zWPW)tm$tU1$7ayV2WM}xOe?liZ0uWJ@WEaG(f!rF{q`Z3pvBm4opR(KU9b`2dY8SZ zmq!bD-#Ivt@p=Abb&5+!No89~Fd7N_zL77U9DFonx3fE&9F8=8v&3!L7qbEjk8CLL z(iZlSHwMUVXT$D<-*{1cj$IFQ^1~#h$UUVxfXk;U>^K9pGYHH9L5D^rFlL+w6qrIz z6Me{jhp1Naws>AmX(1{};P|2tZ&Od#m_g6os1R-?g@2{2Qu#lQ>FW6l#>#pfJ=h&o z?H3bQTqGztbv5m{5eDf-8@Xl)xTusAiv&n^IxW@SZLlnxo4?!~`V1BA9UQpqb2D*0 zQ+6_7R!`br$azURH=!CW@1$69!v&{rww4zof(3KN>`zzqVu1^S65uF|Sg1GPbh<~(5l7xx&--$?Ts@Q9{>+#h9WCh5vW1kV zN&i1dw#vxC!_xzxJ-vy9Qc_aV)A@$Vnu_c7m|bLiFvrnnn4wi7==#WXwt^1_M+#K# z1B72*Fd`~Kii>HqwY5dh|CMPrqCw1*tyDA;O=0hTejb5ix11FLjv-g~a}n|uwm#CL z4qWgI|1CBGcxCP%n6LrDLI*u@7b#$-a3%^A>b0%52etmBw?4>Irv40#WZ{Ci+r%r3 zlgjJz0~NCVaSPNdb7V17_PS)B*xU>wa9CoRoXjuQdRQdGI8;lJ2>JYf1|mtw${KeS zO<68iO%3Kyv9iXg5qbmJ)eGQm&;a^pvwnpMp%v=%a?~~8n-Zy-5P3Y>DxttqlauK< zr!P=Ivg9dm4|bW@trw*O;IkZ$CxcN6+T|8IU4S0l2Y8>MYzHa$T6Gyi<+#7!7;S&h zSN%z@{4+C?_|nSz8WXBOOaL{I8a2E>aLgk7>*?Xgl;U{e<^kv#KoGH``C1@>WqqmF z7G+M|Hv@aV)$NKgTJnOQgqC(N_h%IoV3mLTfT+HHxH;Bf!vIE2uZImepwSNeV#?uk zek4Q>^39jQooIBRpw|gDoG>035&QwfUlx;Np6SvR)0iqnutQc?^>P&phj>Hj78e&y zxR$XrP{lKA+Jt{qvo zwW5Hd27(CiyYXR;&>D=7k4pux$V-`1r?A^VIqv0mZ}ImW^EcQ;`O*6-wev$qN#wn{ zv9VON(2PTozqs6%7DA1Z8FlI3LdsUEz(juo$5s?ay#{Zzr1?M- zE7jMl%hcAQyu4|EQYlh_W9i+W zECc9+!Tx^IEcQa!R{s6)@Gv+67RI00$ZIs!^5s&fF(50vp2X;3hfng%WL(`{Q9sC6 zT~S)D9c__e#EX%BQyo88fIooD4}`Js45yOPaj&>y;bY?o5A=-@(ZBqPakytAN9bO` z772O>NWfD6Vs_0AE-@b3hj?WgC-;4^moo-bS1G@rR{a9t(j~L+AykO)SMYI-4k7s!+KQ4GC|OB3lm<7-sAo9P)&N>NJDHm@zW# z?d-@{SYj(G`hh$gR}1DJVNR$0iW8AChc~Yc+~|=JR-%x0Ndvl{^AT!R`SpLj0E;pa zP+fv2%b!K#n3W`fa-0CNJdthW032q5Gi7Oapl4xC znJloi`|X&-C*t#!u7!orCZ~P*dh3t-GsU4oS)Vv5VIy}kD43~3&?&yd1jir~?@I}F4RUL1O>j*}``~}4qPbXi!vVt2p6EcQwMVmA$%O0LQRA$>_(7-#l z1!^520&2^i+I>5WRnY|YW&-*#k7e6AtafuaPL{7b2M+bh(*P7#y*UHaXuU+ zu(8qlTxqS8BM*6*1`L6_!A@`XADQ9*2tN8?}fUBa>ha# zoDFBA1OpG4y}SVPSKWAX#Q$eU#{+5Bn?B|Gx!KTU2Y?d5gHU3~y12MhSlke_z34@V zlEm}54O6_lWV6Qn`t=GkOsA^2M)+6ebBA>mcIRtZ{{H=2qTSr~Zz62D)jg8SVJ9{{ z+6TB_CnnGt8079RX>K(%42~mLP*+bP6_bJ$lO)%tOE))n_p3QMIRQcCv_D-Y^8|eb zv_Oa?X)%yG8|_Gv!Dh`7VZ}uPK8kT*)B)a_C;%4Y>M7Pf#WLCa6+(xR7XI9tOPV6) z3>d1WmPtuU=+z8w*<>8}^gy;NM17f+qC~Y9$P@z`@BisZ;pFY!Aap9D7@n}Cd{1BJ zjrRp%8Tb0Knk~aFrIwGF-PSfrp{v&y2?~C-qJj~9prJUFW_Y-1sI67GNI5#o52n&= zfZcrh_p1eP=e+Z{TtsYbJ0BqhMr%I{s7Z|<9fEdK@(Y8`&)-3HKMpXOu0kMxH##=gq5oDmyDvu}iAPddl~R+Zk8rzDAu6SO;|%BGL>u#l>%L zZ%+aLdbHpK;{h;tcLYJ-JrW)`;^(@<-g+oFtUqE4Mk+iX=#f7@4rE@|Vha!J;o(6L zrKf)`Kg#wO=MM|rSUB`5(+i$4E=YB>((KoQN=7CVW=&ZiVpi*=M{_doQje5|C zgBRkk1Qzaw@0YBHCJ$iS!OwE!IisVZMC9c^IUP*r17n5p6F2-#2z{GeqJkYkFdY(Rgg{N z@(Zm-@bU5aw;242c{}!`!aBmBvZDont}3&Dt-V^Ss`GbFO;BC^vwCU5?rus8hZ8Q9 zS)rj(vOE347wN%|$IEP<&xv#zSU-SkM59zLR}@>4%95d^H&>;2YjmysTbn+a=fmaN z)6MeQ1w)&D_vOv26BWTr-7qnzU{nI)vw^Fh+m*jQ#Nv_@)X(Ct#pX=s>ly7%Qmb)s z80g|CMDPJD!RGnr#M%3&CTBp69+~N&d;A?l9J3MV)ys9f{TmGmXmltV08MjK<_T! z;D$p3cZcS&DVClUitAl_`Ljbhd6Ux-@Sul-t}c(qKH6C2+DJ%jY!fj=!j3%_lVH=? zAFp!NbuOIgSe4U(GXODXmzRcj@CPIQ=}XP%?^hWx@N69%giBRYa1@r77JnK!(9dP^uBxigMh6mIccfka+55vLS_4tW36W{*AO6fk-{k+?z!R)>*0n6W?<3f ze;wFvx#~U;5fig}d4|;ENb&z#_77<90BWe+?^L0AtC+Fk#su8mlA#rQ8yNWWhuVqM z0!~cFNJdt@iOVDekvrvVJR<7Up@=Gt}u7axQwy*Ep#OeN#-(h*j%UNnuLZ z_C$+I$k>Q>O$K!2p%#zmn%$6@%o@Yvazh4Ff+4YUR6@e=!pnr~wY#gU{lm2tc#Kl* zd<+-MlPIvTh@X^_M1}N;B_$A8! zn48I|cCkI=Qm7=3On4Ux`5@DJ8jezfE|=;| z1YgNP{DHNCADC_)pKka?nTvMqzJCX19t^6Rrlt=;sHG|c&yX;4weBcK3$;caDdiW( z$_tH{S*svBO9X!-CnEAuDj2ri>o<~3=NXC-<&Ta_9R#zJ5Ml1&w+2Xnzuv1Y8*-Ee`}bbDFN z(BO9U*$?KL0yyobET+*^$igN}M!-Je?GEz{-_@vxaA|X*fq+KA?LGR%eYjYgvPGj( zWwY{Ty##|G92C-9MYV<|Mu43Hdh_7pC5!J{$k&|>+9G$yN@=*iAFUPJw2=fG>J#$O zIvypw10KrXzbV`9?=_awd6?S&R3>cnyy*3BdXW4b)}qy^lww8u`SY=d)AJfoILGU^ z{1gp1p0Q3ADp4`X{k3>?6L07J#0<148?DpkApmPXmyf1WOsB0d0-VOciyPQG&y(2|Rx#BpXu-d_+SF1FXnvSAe3eGU%?)4g99JOCm?AcwqqIS#jm+`nqp( zbBd^+s@|^BoN0yiZ>mz@yiG&?I1kr_b$3}kLfD*@>Ak}D4hD+JZ+y^x*OQz$TT?6N@f$>~|k9#R7?AyLw7@m3nKZqFA+@30SyVp65CFlI~C^3cM}r ztCfJt_={^p_%#bX-Kj3NS|pR-*{yBv_I6}AvRPXKtYBj-KmHmy+Pz4a>J5H|g{(gn zo+!3!Yh{;dv$+R>x#{N^5F6S!U*vTmUQ#*x#`zPITI;W70@7|+;*wH%O&Zz#^Qsli z)Rjy|(yD*iAJ}D0|9bJ}5%h18`+`E!%BP(2Qr_D>IAKlcf*+dS;DBYMsc;{%84CdX z${WAFUR7&ssBp2)r-vJ}i;jzy#by{FsU{8C(QVB8OaBXEbl+O|HCBM zn@V@Q+}iUD8T5hIo)h#&(rdMKfRzQ`T%oH{GuR$BJdmRrNx*7ju8r`Cojt;){pAf1 zI>0RRfwCp{M%y*wt^PpR=C`A*7T6#Tas!0U{>Jux5J&%bG3$HeG59*g4*iJdA&ojF z@8g@W4}5U|YC(Q3ueMtF&S?J6wxjqfTjezh;b(sU@2^kzb)zt$0G$Zhg9n$Izaynf zTxY6ExHV|3KxhzibEg1~oCHvdKnX~9wpzg2|GKlb_6Fm4=#zdLPkcyu`(4CgswFc^ zH6r|{4W!&>c~5Tgz`;Rj>y-$-y{auxZmjp5wC4*xxzYZ5AOX_1@m`e?)&V5!-kegR zis{U;r*Fbr(7gzphP5v8ArWnTz^?lVc((ysgmwj~x|;7P6*!%N&O;%WA(k^H&ra$O z)GmjeV_wjO^p}fYea#tU?!{IUyK4B)c`9OJ&>(mc`9Z&06bI9|7u#=sY|*Gzn+>QG zDVJF??)td?zTFVXQ$fcuv!vY>2i7)9rTnmAi3*Reg}p~K#Kek@1V(b0=;)mtAi)g| zk}@!$0Pgmd+6<^mfV%}Lrz?}k6CV%-EH=+_k4=WCUyD_UKr3TFs298IGZyIM`Vxjo zQtxGhiuW*TPB?m`Q%Yr{rKPz$vtu-gi$tSZy0$xJ;Bj|nsr`{7e^ft~I5MIj2nG=P z|A(`;46C~9zD7X>lvF`FL|R(9k(8G1?(QxD=~B8=IyT*%(jc+v?(UAWc;0ya=X^Y0 zyzfidn_sLo*O+6BIp^x;rZhk}*VpXKxC2)|fUTV2dwk@ruEkd$83{mhbP_5)u`x>r zepcwn$;tUtsq<x}rD&;==HD@< zUZZUpwbWJvhXXC`f`N4+=sh?2{i8?EUb_A*Q#1<@>x=Q|OO|h9QaZu=p;jvW)V7qa z1*SJFuxX#3L0Zerp@c;vI>4yX;NTjpD~N!uR*Da}8&JGi?zF%eHcre(2N=CXQkxf5 zT~KY0fcV;t`AdKj38H!nZyhxF|j~UCRrCD`P+3x|s6F&M14<>Sr z6!r@LXyto0yR`cS231zTf`2oF9`Y#Ue^2AQ(Q*|SPU9Jg`nxiI=b2e$qVRf zLfK=WMFElE(ld=!XZvbExs;T6tm#`Z4>JBJ8tB7!dAJY>fzSh!YdJMC1F>xUuy8tB z3niF$5)bHkP^fS`l?++gHsFdcd}K9EKN@A^X;(=S=s=}+ic^6T%nRAO;Z9}02~ zKNZcc!9~wIF-b`sP|!AbcXB82bUBpFl4C0*`1rW>3e=LJv%UmLALZJX`SCPHRD66d zz*~J)Z!Ld;>ZI>sJA#(IVYtEB(db1=$!?xz%nc0l!>L-#e>f|I0C@tG2Pv@45-S5pFugUxLM(3vzXXFz~KQj zI$i7SoeBRankg$JxajGO2qfJ=TU(HUK2tbFcexbd3ZI`5%d>J&W4+W4N;lYDw&|Vr z=ZEY;HPz#!GNHtZ*1Obyt$O~afHFr)9Q2uUJ_I~=XM4L3z`nMiC^?$m^G}7)Ct`pQ z-y`;IX({OG6TNr5NSgFilJ+`aq@ccgmdZg+448O87of9Zg~)sPY-&)a_2wi_2ciW7 zD<(9a7H&Hm?BgB;`K4~z!#3b?N}x={$%%>?F}+ADGg0n z<<{_-TppI|@iOd7c(k?i#L5n0rxVJpiVjM7ky=coBJc0G-(*H~4)5UxlWTtfrsZ^a zE?VV$Tm$&|!~lBCCnS^}!kv5uz>sFnxNfAavrW9Ulgrah0C=9i@41`Bk&GvnsOX&5 zIT?`gi8*hLGPV7i?HxtP?hf5SsX}W@v#qTys4FkmT{Akw7XA)C!vaK-A3~oP?}skT zGyb?d`+9u88&lmcPF2(HA0PF6ZeOms_YT6lqoE7Gc( zsZW5)_-i1i6cWn9jO6@b3e0)YYe z82{Cd3|P#y_&M&eF_>(>KBf72B_bjMBo!s8uM#UDTGv=CNCPAJXqA{gr*nnI{cDHC zO>lPqij7qy_51y8%yh9BM@*~_IB3hYDaj6W+B^8>SY!Fx=RbY6NUmr;H>Ir)T}zWq;p@!~I<%a}r76Gr&M2R-6d{aFZ-e0oaYg3ZYEo;WAV9% zJdd*hEl;Zl)MmGm+cUPPwQoPw&U>J5Y<%E;=ry)!?EVx)1VyqfpKg7@=T zdRmcL&=L)42`yIvdR|t2y}x|k%l4|v8rIW*Ek>t(?Ee1#g2K`sJ=W;dR4H-sFItiD zpbFvN^z`)JUg+YksYprZO4ost{^%ZKqGYPLS4~ZgoT{oYXmKDc?7!`xR#;@tskuh| zLmDF3oUUfWdc&`@q(SNRRImDGQW>cD#eBi!pe$t)!`^oEOZ>ccwYIcQ0wEiX+4+lI@>!uqb$EzPY5RA>o^o)6@^+akUcL`8tC)kd{js=~T{~!yco`vs3D) zk0d;)dz&NOI}R1bGD}9v^I*UWFcLj0?3=@hQX(Rp;1isH`wFY0gp`!z z^XZM5nYrtepCJZTyxqux^XcfzEBm#m?k3Q(|DL)ZZVUWUQ&UqiP<#{?hFs{T(o$kn zIdeT}?bWNT?GX_ZW8mog7ZfCn?p^H9d1nmFhUqQa1)}EU+koTUV`8KDLu9X@q9V)l zeI7Np77w7nh=x%vBSb#YyLJYg-0|H9dm=QH-X-vPu!m#`4I1o3c86k~UO>DO`};pX zUT+zH>c@cV?&43m>m+*O1Ho6q+?=}g=HO_i_6SD%aW#A1^Gb6tktg|z_xgwP;zNdV@?<(S zi74ht4n24Ox|lMU{@8Uzcn2G+n~b5PsCd@g>(%yjcM?7Cbti|2czUyzo^H6*@}Qe8 zj4Y(?&gFhZ(6-|cP^t+=FPoTK8w-8qy}7wT#)%{R@>H@?diH0;7@mUOfe#`zXH!?2`w#%6;)~| z@Xcun)9m2&l8}#r%?v7xj@_E8w0who$FfC!Cv%Zzm6Vq9Do8wd%v9~@FFq{`YI&~> zlcVRK0PfYA;F{tK}#O$SzGe< zC3@QKvrnVBUQ18gn1pI6vpJi7+)B%$98Bg)9^pP^xPiL?e(Cu1r&FlM9-g*-KTEXh zvCo|#wIT3%;D{GqKX?IU<}a{~CfH0W`bAOJO%E3oQAlq)ji0nDX=;uiL2o|pS^sEl z?G5&7xIV(TJ=8#e-ksfK!#zw!`ZbtE=F;m!Ob!lMTdtsW18yZ)6sw3A0)RA=j*-YD~tziZ5O#McS3lBVJ8f z^nlt-9|_dLQmMe^73^6%IlfZX3QvIJcKG{C+B?ISZFOZSUa6>i>x_|`K2pZ}Ru{z9 zf|3&b(?3Om`Y;jrJeao8z?q57N)vBRE~9t3pBVO+{v$bS0AR6BuaqCZikaeo@Q|BJ z4$5D8%GY|a`K<8Kc&@1ky{^BOYTFRdx1OQ_ix^IWiBr9X#pAU;CcWCIv)h^Sho!wX{$6}Dofg%<(MA)K6#nw_(ud#-m2X?vaE{P1TzMZzK? z8u_Pgy;;h2^pS)l6-&z_82WSp88v$Wl1R{?!>RFQWUrqVWDA^ruWtFWyYv{(js?-| zdMV=cD!E+l5oACyn}m`P`CC;47Zocyn2o|y!UEF*kGo{;P?J#Ub`xfuFUdEnSiCaF zxI4SSe(v&9c!Ut;s8<57VZg!%ORQNdQY3rFPRR;{SYGXnsx0XuG9I4qdCiT>f@*4? zBcG0(6ImS*0e!aVkEONCIy0*dP?2Q4(R=%?VO{WK#eyPxjcU*4k?6}ky2ZgZ74S(6 z2oT}DJ{AO|)!zl@#bGJ7#WoT&p1=R*tPDXJ4R99y)@%gSBZPYzY{+PGDTBUMVW0~D z+n7O(!;`CY=awcynmCB2yaOG zw_|6!Kh3D7melumkaW?EjFlX|l?a2(2J|eiw<$2f%KP&Ntgrl%qN7U|&vLaU6Iiw- z2YI16z}yVGXJwSOq%GZF?r3T1laZ01YOvvrq2ff1n>vaD9Kq+YYTKlRCi8SMGJSxm zbvrOXlfah_@w}k+xUDp1(|lSRZw*Z<{?R6RZqpl)p3#)$ODt$d`T6s@$+VZ#OGe{M zNo4q!;DFqB`ZwSGcke<@dx>9AkmSRMSZw5g?~bq#C|=TyZX@ z`Tm0lO`w85Z`^i{mQ9p<%AqnZIEkok4P8Po(iv2p^if9BO+#CQZUf z;6R+H$Km61=#immj>Um$69)~=#Dh|y<%`=oqf=6^??!|tn46JYIRTkhr~Uq>sQ$7XOczF{lhK)fh>O{m-Dl9a9REUDtjHDbS(e=KVE?KNR?VIeIbGNt+SJC3U9z9 ziS$ZU35bg$g6`>Hhg0oWUPyzO@^m#JgDv}O1OVBaZirWBdBkiRi25$gT7<6Gutq~k zux-Cm@XgHk*fWz*@bJ((K}!*m+1sqf4~zn@VYd#G5SM=k60PRqS@X+cfEE7XgRyaS z;N80C6@&Mp#`bG=a#Hfu3pXmN@D?9ytwn~%qdY!hKKjT7_si2xqKBWiUny_&8MbdO z=)FX|+HJsMC@3yo?QXpf2S!3Ub!99Tet?xZyzbd$K$g(-Fx)tA)2W9^moO48VWl&i zqDrIP5|#e&>GtzbJJ8(P>AfH2LC_7ZRpXG?7-SmZ9qAb&l2-=bld*Mn15oD%R_i^= z-jpRc4v#i&_coa>lFZpX)?Y7OPkE!UUpvr|k#{*KFiC*T8qnhAj~Z z70Cv{;~9C>&Qa1)WtNw}30#N}$!<5R29i3zg(OXIuo%qs1Fr|Kw`fOZELa+WrNPbz zvkQi8&BetjyGd;UeY^ic)_TJ`4OlZ_;Qe61;X!R7DJ6w+(-{~Ym4aV=|MpcB+{TAk z1?WT;bdM27%A^X>E1f8Qz<+#W_uR3vvJ#e(o<7o~Rl%dl5l>3$cMiq?^=*sw0RPQ{ z*Dju0>rwL8r8~|`bPA2`tCqVZQVOy&Fwj$OUUs*#v@~K%%OyCFur7W5Ph0&PpP_=r z1_Y&Au2ktow>{04^X`$#^C|V~oe{5hV^0T9H-sYDF!+xq5$Us=mI)E=_-Ii>N# z>y@RY`deJAc@U`T-rm}Oy4u2Kzw5v$#u^o-01_FO^^?%Ht<72qStypjRRAdanSdm# zLD+2W!MviIt=7dq&CRI*{0V8CH$7Z(O&>Tp9nOC+L*fLhDI&FzQ?reT(<33W)@tRT zb_r>6w04dFBR&Q!)REmua|T?g1SxVkxv1dK&`uNPEcpY?w-d9A0kr)V^tE%HiA>$h z0SgQW^t@nP8i(CFCE!hCVq;Ihe6xz1HQG$uw<@0rtPXA+QwY0m?+gunl3%5dJU4H^ z;q#*5Qa&&mNdtCeuauf8Ry8$su7~>$4o$kx)J4}L;0rvr=y>n`3R=uH(CQ673xze7 z2+G<#J~&WmIbyp#`aAz3ngA66^l#a%;f4Z(qluN-iXU2hR>8U(Hu1T?P|Xh z9i+hNU{P=-=tYV&7AQejKBygDTn?OT(Z>Q)G1}KomK`_>mRh2v)N33PRVe8pIwOb8 z`_nDa@!B^Cii)Yme4_GdYO@C_;HAtRwe$|+Kr4(6)Ij?hNqc*wgM))qU+onSULut6 zaOT>o?;3LbU^dM#m=vGLZTcS4dXnqLj)D>nSQPwtCbz_g5^V05x z)-_c0I1N(IQ88$)=*SY#>DF@A>eIZQb+fD764r+?t%C~yPt@wFT-xmp7%6|Ov+Xr~ zbal28I56Gpj^=oA!OVuR7)^NB9-aDL;48pVcPUh;`&?M(N420MR^yRDA4;gp3B7lC zLjF|xpMjr6JxpHnD$nhNY7XWm7vigrL6;A&^Ysi;B=AU{Lv>N|UCEzwilG{GKeKAekbfIeGN2}De8<7yPu}?K)YMMLyXOuV&C-G3t5zH? z>t^z`Ac92%O&Xbilz5;SGGaPWqDBpTnY=()xH5|c6dzEm1D-1919wPBh|9_hpPZ~} zw_v0Pd~(Sh-sWQeaR2H?YYV@+I#>GRJXZdJkzq%7MlFOVw7X+!Xzw}eOuw1Oy6(tM zUki=&iWu>F47HFY)5`+sztNEB0LaD(o-V4}27fOCLIjiye`I)BT3=6wF&_~g-oCTX zEr{}hNe94u6HC*bn03T|pmA=4PH%^PIdqza<&R-j-Jnz$L|RVSyYQ z>!XM)5HuiYy##e%)6kN~L544$V!!9*vx-cfnySe^YA25l{(0?k|LR3JVPxRtCBIHJ zb#QR-^@Gp9pUtt+so~(9zC5a#vFOkX&MYZ8a}?Hobs1ScIx#V^gZqV*HO{3dHfeS? z-+RutSczK6TtlcnyOfliG{c0ss=E4O&kgZKD`Yw$;rsVHJp%^ph7=)mBBH=q2`2yKNQgIsY8fE0l%SS<(zMqRi_ z-gqW-FMAR4b9~Rigv-bmLECuu1W>MTl*4;1SS#(JhxtV&ZW7sJ3}BE_v90YhPtn8M zq(mQ6T@tDokYT zr;@Tc@C8LjnOKA%Pr*}#_%0pw;$j7|EQ-6j3de8RySd>?=P~J}a|+AW+4iB_uZzkY zr`Im61XFn9I|(gqJ8-7CZ=!|a@Fa=0UdKw5EA(f4$MDY-w7WiuO#Aap!^J^>xA>#V ztqH@=)+MSC0W)z#uX})0!P2}ve=M9dD_2`%zzzc-+SyG8)Jra-wLZ}b2CN?+=kfIh zqmQAdEYz!v6#OO${iJl7V*b!PwHG;-EedvI7QNP|_sMW~@mBU+>AmT^ zop^GB5=XTDy-JpxC6W5sF zds|^a0S*WuKsFQrtmk{m@Jhh+i*tRM-bGq!L4-eS_@}6CFM%{9>wDzoeH0f8Pd}fn z`R5{_cP+CxIj8yJ!V`(IZXwN{wWye0g0^w>?4|)ZDuvzFH~n!R>)D?74i0XAp;nvc zkG4nzjow}jLDR!wWBi1fZm@xR3(Zz=bc#-1_V*w!B7%B#I8%!AH5cm?M?A-%Z!ViYVZz?JG*UQOgcB7lWoGsnl!-j6AQ}7txGb1V2b2ri)o-ZQ!Qcj@NH+7V~}b>2>|RQ+3lpvS!(&t?ic zDKa`?9!>Y09P%r6@}%|@S$8UPOUspOTdqe~_;3qWF3{PeYwyBoR%TT%E-kHRz}r=J zfm;Xgt?>#S24ypV)c|}lGJNL`FI2J|!~4rC84v*6B|S6`efxZSTc2L>-L9b1Xu0r! zV(ImTt3_qB=3)X~yPw*RyKE0yQqJXR^6g(7mGifKf*0SAzwu=px4%Ky*6@A|osEqG ztU=fo^=rOqZR;}L5e~r9*y_>vB=WvoxpMR(NMm;mv7D>9`kX*jO5;~<_O+yz36>ty z)Aa!4qPE+|?>?68%-2|Y7LBQ>%Ju>EZ*oZBH8H%b_9C>A1gfxV2MC@rwB@D?hgSx4 zS*o#EKbMH66I?Ppc$YH3b2kOGW27o;lS6)44Gl@TagPXp=@Ht)%@DHKitHeyfKvo4 zJmJ$L`n=n~5NHx1%d=jwb>hNV619WGkw;h89-^NX*~LG4bIXZU?Q{Rn&ECSgH^0{( zVRo|PZenf1bBr+1TiP*MAmg&t&7(|n0m}ow#hSnB^0+4Ll5)EW?Q0BU=4GgEq;J>H zS7ExzS(EciN*bdoO9h0$6tcAOoviZm-{43CN&n;mj~!=VR~Tz{}?)A3CEYD@Pr5Dd$Gsn$W+wNcy(`e;w=V+p*rJv_hi zY-U?e64xkvQT;GkB5ZCiT|L960ieICEuCQ(^c6~l)lAdSlmQ=yp>q0+haVoVX z0!!drURRg6PfTpr2nOI`F>!GPHYDPoZ^3H?e*{&!;SKB`)IG{^@(N*#VQ5UFlU!HR zuU~!qx&2k#?#t5ktn&3HTk8~+Dudhkx0aI&$nhk^<4w58qMZN#{*KqgS>Jnk=@q!o z1w4i%I${YY<<(Nc-jsc$|P8ISE-J zmHE$={O6AifgZNbwIZz3yE@Xpgm9^SeI!4FmQP$<4yvKD7%C1AFIsMfASVFs);&dE z{Z2~icqSflhtwwm-~9KU&gikBC|0LM4)=W5kRXBga0`tpQSf6G+E};l?^i?q&Cd@O zL0V7&12Chi3i^(mf@zhNRu3ZhsDZoxy_O(qaTjEH4LwrX(MlvwyFhQxi>oXznxE`} z!{kU9nDh;4d=EFOQ`Wyoeg5x*5W)^t)$#?OaBmMwNZA(9Xn)b?>s?{F$BIhC;k!U5 z_Ts-+i9~~48~ab-fi&3HC%Vh$tun~nj4luOe)O)%I{%Nmv8U!Hej7Gact!Ho^N%cB zkd`cj?w0}hd2F%w|GnB2=amzc;6Bt(Vi?H09AE$YZhpSiTP7v8Nqbfyf1#`V_Y<#) zZ)H}CwtkZ${-4G0pMMLYPOvcY@Djt6{2xDROSVhLI;)w^j%Fa-egmBpqfaLJ?;?6l zOvkoTF74Ro6zr!(N-Asf=y3I7yHJKl`hR={F`bfTH&dfo;Ne}D>!)DfP;G{R+{gd> zi)HApM`;w>4NG zpEoJB`kpM=-x7!%Lpe{E|xo{#t6FL?ex+l^mB|5<-sFaW68$z?TgbOhb&(x|!+ z0JXHRQ6N`?$43}C1Soou1v0t}m!c2hSwdCdXPa2)vMd=;h*)FBgh{@MNy|BFDj}W* zFuJa~ykA?J)Z7Xe$<|%1D@Vpl@@s#q(obYDGCZg=pCC(FxYYW5Xj<7S<{|Hrl`B!H< z=8-Ge5Q4_1*6B{<^>g3=HJmYdh?Ig{k2SF)A`HVioP>kwohFgdg(Nm#03PO`{w+(i z%WZx9bh&%F+qZ9OYKZzGn0Cvf?;NrG0aY2DDi&sV{Bj8^yAQpGQFmVDa-Z*S1dry^ zpa}8^2@6Z&YLs0QFFlM^EgobnUZz z?iB|Zo9(}Ev|Mf!8!C>Lbr)4@qTH=pW1rm4$L}8#v1VG#A#T`jRrHF-OgM*<0^0Vo zN^j{zfs*@gTrPp}09U+!prD{c84XsaLs9?xkB30im7~}1fq2flSQDLf&)pMF*q7#s zzy&vR2jnyR&JNf0O@nMo#5YRRwF`CMc#6^a$~>>MoQ`-h4tJ-@<@2bp(?q?r=xS+H z{~}N;$!e(*>=GqK4^4>q*jLv|r%)ZrXJt@Jl%|VnSQIzZtApG>+BgJUruDY-B!RGO z0+&7~P{UoC2m#kWPA(IM4c6T8-GhO#(HG|_hyBa8y)Q}qNovCw@rB9%iS~5tzKz;WhOxkuzyIIX}V0WJ#q7Vr(aR| zrLS)=qdvz!n?hRnToF29x86l1f))PJ`P=XhbT~##BsQ7^!N+4=c1=25T=y0Z2{Gv| z1LoDMJ5%f0qDJ?L+1Z}cNpn?pYgUreGY}^(ni?(0J}CMad=(T#r;z?o6cIwl!RV8+ zFDWUK4U*^p1H<1jF&S2eJ{^fs65^1WAIDVQ`Uif>M?Q2$6(&IXQ|vP0>EQS3ZD! zna`a0Lkf54W@cS$dp-STGJjhxD*7*o#xd&#l13z6>FJwOO5)-J?6!qVL6(v3lZS2)`t#Gp&OY#0 zN|!dhdH zRsyraZpbaJL=A~wQHr+p{vmzL)8dptirF6bgg@?jo4Ti_I+u$fAjzPi>#Z3 z<@8>FNV;|wIX?nzy?a&9!Lg1y^d=l{>f~uYlVdQQhhzd(XNS_7$@U)m{b~sedkQM( zOM}C^U$Np)uTpDDT`yP(GRN+&6Me2&%OpH*&P)U@NxGz265;rga13!sP6KdyXzVi$Py_ z0XN4+tJT)tDaxU#(O)sSH|k6}&=4IL)zzd5&7wrSLnAo27~y84NakS5)n~@0gcKXi z4TI((Fky7KU&n$xPzgDD7!@nNm1Gu(J%f!^L`8*!k&;lXs055iS!@0=%4-iVK&)3^ zT-x3Yk3mU8;0o7WgUNc`LT?A==`FvP4Z!4Y6r;sy?xK z+r4n)zTqw)e@vQz$N(%nn(^H1TFra%f+7Vrc)0nc1+r-9@f>0pL9lqg(|f_H`C=#Zb$Li3PcZw< zJ@JWKbKSfZE^e}Ft0@wZR~2sF*}QQi2v$KzISWQxZJC{53r^w&4q+zj5TpdpTU7?m zVhFce)n+?b)*2OgNYpBpdeblsPJ9U_-+EH>kDOV7F19*R+H*J4dkI8Mq4Z_wPpL+j`L+YsB_K- zNN~rgbXdb$URr^bTR)XX{}lBwx)~5#H=TXW2QAp-7(B42>QshfVq}%HV0mKNL&Ae~ zhr zS!Fsd+YM5*WE{a0>!jecQLj0Yb4L3H>~Dfs3!p=v;OL$sP$F@Yl7g!ffKVS)+f#nN z+3mtj=yW&(;q~Aj@yx)aPZ$6P$UA*T{qh7sYDZ$5lJQjEmCm{?^jgsS1z(L|$AQz- zycQi@zsHPGP=n^pi4qW4Mq19rBcYpE(I5{8G%af*k6F}54Is6goScBd5;=Kw_rB7M zw+|%2FBm_v(KSSHSvLj)tR>#xKU3j}6{|Q|HDdvsYEkIue}Nqaye#BCt^W1kwVQ+V z^t>8rR*`oAB7<&B&B#P?16M6K8{gIS1h`>p=~VyT&p=-s-x+JIuG}4c0tS{JgXe9$ z@Jo-o*)H5^Z9Z)vh>@09T4wfY0${Ml=Ixf&(_;jbSw}|{d>*ea6X{&c2og1kWY`l7 z|Hlgu5Rfa)G)f_bAE{cDQ&s%QfoXDj;z4RMXL#$ZTz`bOCk$5%{CcP){z#!?@~86H zAMF{&WA_{Yf1CxYTj}(sJ?t-dzm9|oN-M!L<;E zG^Erd;T0i=5Jft2M#ge%DRMP4^GVHA5T1c2&!`g4ul+|QTJ+bh9GUlUSxcKEY3(ns z7JbHa)@R}$hf6&Xz;x~vyZYl>4@$&sM^4GyNY^{R4Uf~(9LXex2+WP2 zJvg3M_1LVZs!ghKS-qNg^pvUx4sx4T_j}4r3D~6aB*bkwUwk!a?EGq|h=N(^51wde z04gj$1S+o~N60y~x97Df^9x9!g}3`CZBwa@B$uD-%y)*saiIrod1$)a7b0EujTLXk4=}B?AQVVKV{_n;WTeIKiZ4 z7C%Vb9-36wH&8RHOH!|ti?cGzw<`EBLlf(nAY@dGzf;|>)@;}lI1X^ZLF#xhMp3@) zfD7Pi*^Gr|gio8fDo9DOf2U)q{Z`Rb@8w(ah!5x?2fG;HZSVU%+LoJ~5xwdjMkfVg z4%NgM#aI3JK#JNNObF0|^aAhD6?AbOoEGf((%>^W8?h;LbQ|O84T1B-V4@lM^As80 zMPBwIK3Yts%3PVRMU$&1Zmt^_wd|hcZ)p%r)W!td)DW`~k-kYt>Hhm^Ycbu#;&9KO zcBfOum9jrynJy?AVVhfp41vz=3ALA_=UtDu5B%-xU+;{Z`ZqC;ZyT<-G%5s^zP{)O zM~mBJJ25gu2TlUDk{YNxYMn;uDC27Xr{EW3^aWI6+;&e3UEN*B6OeSHt;2`u{Z!*h zj#RqYSxaVS))P=ye6lgZGx+DtTK!o~^7R0pmNFV37K!PoW>j%JHrqjo9`k&i4eWq2 z#PH&Fs7`~f(A@00^UNFe1)0&~c~KtBbh$bG9+y>NQnI=W7(MZw85eUf^~0>BA_RKU zF#rj8kM@89Ut2q8f|g87DEV*B!pTe_`3OGx1u&AQ-qJZEpc1T12g_Gg*G4DC^@J5f zkHHUoU5UIsb545EN7%~e<}IUP#YR*z7nDU=Ra5Qn^$7T4@U~bj7ksiPB^%7}jpR`| zRB^CT;FHwVRLY%RcIOznbQrB)b%SJo)PcLzhHT>lK6h`jjyVRX+7L=gQs<CPBP5S?Kxx1`I*Tlhl)xB_@Q#qbU_<73Mk*tP-G7?6FxAlkmhY+@Ugn!x^U9 z@uGO9OqGRG=Qakk^890SDk+x7L(|b`!3DM_40;dH{E&Xm0toxnQ&9go9hTLUAGidi zsaC_!4#YK)NMyKyKm%jF14=m8`*j?E1_S0io%~IgZ!6*)lWRcutOW@q+)ZbL6vm&N zTn6_ZW)EI^&^tXhvtV!b*8j$}s~f)MafPIpBWKpUA}1%-5s&Ygun5VrxwtNW2Y5s7 zE0aNT^fTj;kHfgVmjsRMuDL=yq#c1oC11a0E?5Em8X)Eg!3Kj$uIVa6E_grU-L7D# zlNDF^WohXmgaD#O?iECqAU9Y9hUaaDYZ}X~cf%BlSL;hXO1W<+%HmPJyQ- zJVVGQ5Z)dIMeD!{fe~3pTkDK`;R%p@W}Ahrsj5)a$N9vlN<7#+a)i$6b$qCo%kEfl1Or?!=BS>-rFUZ)rF1K|J-T$d4>R40wH{N+z`XAZ?0 zG~7HlA2o9fqxrkG)#{!**N+jtK>F3K)5uu|sgd_}9wp)oL6KCdG=*{haOwSrRlEPh zkTYY=xp(U-WBLGsnW~cQv01P5_(N?ku5F7Kustv10JURFWz(QhJX4qG8HmbczsoXT ze@;#wK_qBph1x5V3jZRxW5NEe1m^xWa>O2_19evsbAP|dtlhLWhs+&pJ~qZh#dG}x z@A#={t>pzSSiLrS9bVK%@)b8_%nUXj@Idp#r7#mD7*^Hxvjg13CoeOb2#^id} zlNVpc$McH|bk}<45*VDA0m`{MtdruwZ{|I&3@cB_zO=q}!OPkBu)F!1vxK#bSXcZ@ zB95s+P96ZIjEP|hVIoOtYBNoiSiRCIT`LYzslTN`ns#az81BiHXIZf_neWILv*`Vh6B$M7wy~JM9C%aMQCfBQa>`KH9_#hoW(c$sp}R#-jI& zB{76E3(4KW=XvhXvM7`C+k?U1fwm7m-4;ee0Yms4PG1yIGiw2^Aaq}6JOQ2EaD2_; zB4&a>9f?YbZQ)`iK3)7XBesf|2f8Nje`5fKK{K-~$S4gJ7gs1R6A91x({eT3d6^uo z#fQ{#{j~*9T!#W$_6tJ*A%o)Hi2m3dI1macKKM=Xe6QMGSz3u62*-t-Tm6j zE^xifY8-RQYJRY9-1vGJ+A3t^h6^%Dgu`Y(GU!NNW+=7+9Q$P z`||5*iLFPKli-Bv_=ng@d`=IVa~F`?iHQgGPS}pK7uvj{qB1s4LK#5W_xTka+gEJ< zk{a9Bcc8L2obD5O555_nWA4vWiF|l-@A`QwaGY2ku*Q{WNJyCLoSBp;;mtxm3W)yE z%o`UzU`s^a&HV)^A2M$hx~Xe+WH%nSX2R@t0I&0^tHY!7LOEO;5(<;lES$JN{Q(fI zB_ybg#Rr1J838Zb{cE2FWMtsNC|JmFYPqm#d;NOX+E?sOH@U`?tq*x@C|Aq-4D?)j zhaj`Q^-S5Nyx*A|UJ<)R@zESR_V;JU<8GUgr?b$-b%Qv&h}(PU30jU^!IWxE%^ZlS z3X@SotrXZ^+6;9SC9r!TBcKu)jy(G99{xHW!UyqIBN4=Xc){f(ZwYfQEeMvdEHD<1F3ExckQd+~Um$s7!$D zhj9{~k*Cto^JM|cYyWSl;-0k|-^^x;oa~sx_7jX$wf^HycE0nRS1FpJ1eS&iNEzkdwa;&S#?(M_Irm z=O;Q${>pdCda=Jo)925tHs{t8!>ISGf{|F7Y=KnKXPuO8di{CbGWTyi1@)4u|%B57=R33ET|TQrjg)rZ+c*BGUEWa`fx_mY{T7nR7SIjD15h#P05#;-x0X?`&w7 zclRz0-#A~fy}xp82B4TfiR_Px7KE1ZX zNxpV<=X!R4Htl}Q;01})r+8VU*{H{wo=T}#IVUDAxeR2V=VUt)8aiX3H+d`dPV8ZM z=@D?ECSbWq0S4FB7E?Nnj>FnpJ5Q!QDR`|nDkUbU+k%{xH2|clF4oM@> z3Xs^hgBE~j+TPu)q-bBG!3-@F1$e)%%GI-F6qzP;rt6w9o05)p?aJFLxWABJX99>8 z!0Xb)O9W`oPF$=`Kqc9qo+o}6`xw~S2YC9i`FQ~&Be!@mDc`SaA1^i`lhxHJpLyN= zIBe%tK7OC8seahEg_(-@VPhzTGNfBM+WEw%66VIEnz%sEb`&8!7plhY8S^_0w9$V_ zTT*iE(K2e(%A3w-mWZz`x&s0=UUe&1UZ{j>vlY5ycsRhq_D>7xAE~H(e4FO;$(-G? z#>^PEFD&Nj15uJ|Gbh37IanZvxi#zToogt0;4(5GHmw|nr)#h)towOdxGTM7=4>RD zEdE%Q$qYCrkBi$NdoKo{P}xEMB~K2)sL=Ri^wlwvxYNwQlvzR-35_kDSt9No2V>=B zxad8S(}3S87%B@mc<6$Qqr@qkiug&$Fg|N3(%}4i)`2iEk$d&ZkC&UBD*&4Syvnl7 zxL^Ls;cyiOF_Go08yLROIeOjioRe7)%yWnOgRji3f~%qI!%xD<`28@4f8*n?OI0ax ze~%PiB!6nTS}yE-e$^mT42&QYESg+)xNKR!;3wB@e@fUVzYalSJa`wmPcVU=g|N=x7gpF8kVt7M~M zOuMOsbc2ctj|(-R#vojrDJv*d+737+foSbYUQzXuU$@-`z&vSJ;SYPPma@*G8~ZAz zpPt{*T3LE3t~D#1(w_r9kDslrkJc4TOjLBV8w#RS#FbRv3)+vaMDGvSpXs8<>PPuHxi+JLZ130^p6KD zAtLLblDH#|pz%lLM!<{SS7~QD+*hH(mYzIPv_q7jh7`BvXmKEymaFdRFbCj4Cg-VY zfJJ@R@`m%#KCDLl=Wq^}8Um#ROx(_|F+=Nn6ZOpi-vImnu=kf?RrcE#Fbble2%?~L zs5A(IbSo_>h)9DVjdZ6X3Me7nENPMM?ve)SE^*O|?l_aZ|NGhdoDb*Y`|0(%9LZrV~+8m`_5%%*Xf_k0JR2roNgcp68TmcV23MYq?DE>Qk~D_y^<0?I7N9S zS(4rcw&~($D5^F7%@Giwz0t#yH{zxsL%KHtkOS~bQ`!_An9iWR|^v$-sqa45!`$K`#l88r>)`|8M5xOa zp=LuU5gAaUe9QTJP~Mh>g_gviO>)3BA*f@;43M}RH*9`}eDGj^1<6hbuFAQC!`$&@ z{2iBI2PJnE#lLbU`Uk@KN_kTodM7rk_I3>3pS73?-1}qED6Vgd$}#{!8A-icEa35HU<1^^My2*F%kr2 z0Q>^rHP#i!_3af2!u1#lc5MF)>Q^3YrM*Ag3*BndNMk)G%$9YW7 zOZkW+L%Zpao!X{K2tJ^s^5jcoObBRPV+z+Hgs^U9R&5=-D;@Z;k>UiDw$5!iC+{C* zxGNbMX)yRvu&N#K2yt7}d67L)%(a4zQvza4mYRirP~9yw zUA^VNgEpd&K#uLb+iZe!$_k~+3YY%9pVPTDWvA3K9hg?1GcG}aj{q5@=O#k@h=VDV z$=D8o(3~|tHU2M1l1(^2bX>gRN_cJKTBEZ8L!9UFyRJMMM87^dy*gTp-f1sVnA5lMq)oHWfX=smXH)MsB=N9-=L3pL(B>vv^t z7y-eQ(Wk@t!}*%5+pn9e1RM*^j<_ZrCNO&<$ct zlFudBtp4H*nsIUM;o3U}=6G3^XpDI+`5mx@%+1}E>u!4cCMSQSri2+3)caC^CLk ze)Y1=+{$WkW8&fi%5(KjqUSknPh|X#&R_iO5xZWBvO>#lnaWBx=kvvpiw#3O2on4{ zO?$dTjpQHK>v3)m4SNQ!anF0psfI|iMjlH8i6~wS}(pu`qmvALd*?i-1)ST z>Cl-v%jAdD(Xj~J`gRWEHuvs&b>+6#)Dt1vr;Z{!L@AZIiO;AI=5z7tCLfET?r>tE z!3)pao+xNb_hN>=#Qfan{eVc^%_+0>M`r+JcGAjZkSVmHVNn1!LTHXksVE(yG z0P@$?fQstKEb0wOz&T3ya!yV7b4Wll`1SXTorE@Pe@ugYoZPh@0UCrJf6>OPt+E!o zL(eW8WcZbc&1xU#A$24AsM{E&+fVSX!MnL|c}qjXu8%A9 z?Vmk^>n0theh>fUW^N|(rNM5NC{W9>aB;$VrolpHS@{9wzVoIhGI2qrUp-c1oS2*V zMV5-Vl;jgb8BAHiE@}>;i1QE65}j8b5ArCuU-EK&4y(b_aI$8L>N@uCLW2>?SdG?N zm!;+Pg{Zo-l!JW5-t+U<(_#y;JZ_i=(=GxerkQAyZpe4h-GqR=c95ag>P?<(b=}PC zn@g!Z^NT&k44_+hRYK;vku3`MYrnVq;?+x}kVi{IWWvGNrt9BbQyACyJOGa!En-p{ zO^>3&8HgFtzs1Ijo5|q!hlFsJl~f+H$w`_>U!QxEWWpLQTS*LC2MEranUk?qt*gXK ztN0Wd+16?LU$v_BK7?=n>DtQ}b>6_}U(%SESVv0>O+KGKe+!B1n4M)qc^!tVinkR? z?6gZOF4`;I*uxDRJu}3)%#a;^ny+U5`1ycG;A?rbN$v5X{F;cpPi~^l{DQukO*ejH zQ@n@OmoJ?r`%0z{M0nzU`C02HCqvDFj{QLp{NTOUL*RoY%-3;3<;gjR0vEP+A*V?h zC?C(>XXTC+5k3h$coLPA^yZekZ8({#uGEVcx1Fr2BLK_;|x?-+e$LT zIQvi1NnKa<7{};dzo+L(hOz0pRbnUO{ej*ZAB_czN_Q@p;Rb*0jY$wMC1|6&YiBIX z2hDOdOGn*^YkEkcN0y6)kqs`Q-{0VutOQDi^@?}@8tHz^9W3BgkevJw-OoQrJn4n? zsr?=L-n#}x6WUdOBfiv!Vp2PVNtqGq;3f2=5IHO)dN!uqc~YhWvM-sqIIumEKl$#UG^H z16uYE`#lOh33XFZTOS1B)`Pk6|HRNF$kOp$tkBkj<=hjf!RsNv)Ug$29<_)*@dQ*^|dB9*g zu4zv1;QZrT!}QCy)E6b^$;7Tvh!1TiuB?!PAu&?Ilvyx5?J z$l7l+--h5?XA}z^4ezLf$J{Ii8hFcS)y+2xmA2;TvOAj?>i+?-dV zxm^Ck1^7KR)!El~o37{@w2O+O%cNoFsD6~pktDk7!!0eFuMn)0M@^%qsC$8?2-2Ph z+Flzh@jPE)yZzYIv=FJNlBoiesR6gqdtJk3mvgJa&Etu`_vs`f4Gk~Z)k?C=Yw-y& z&rSS_s>20x94#>ZJWZpc53zetFU-l=m56}=Ns8XtJ~lMTln}TL?2NxJl|3o5hMf9z zGF5I9kH>Y^T>09DE`Cy%}q8q4Pj?CvD~T? zV^_=gOj2ZX$bn2o3c2AhOerXU?jok|Xa6raNKslvJjpQs`NAD?LHF=4 zKS{HPx5CIp-F2QPKh=7Y(k^ab$ISAMBK);#(vS%pPtfC=tx85$L=v`^k1u+C>spEP zxfT>HVEWH@JC&XY%A@sc)9oO6XMSk27C>~`Dqggja#nr5&ppDrVRujLbU(QFiB*qW zuC5IWO#Bc;+{YHP2Fs#1WddM%3CgS3pRS}SL-+{0NwPAd5>o`ofR}pZPn@yVu>rX1 z|0Td0^Rw?6mII3_vm2iKyb$@f^vL#Woye|7%|=uwtuLJ(++p)Dql81f+DJ-~M=Jmd zrMvtTLnV7_0`}4SL9D^8J|(!gcNO9~pcd2Kn=sG8fcC!8rCB%QW^zSZ#J((V48&ob zwI6*i`PC4q(=@lu<)2jOqJ1htFM{phqJi4eY2OzU%WmRx9BiAkYI(3~m6fzR$3pF3 zwmf0u_3Qq7f^_m3GE1q-xIA}ONJ*bRSI~F$q$DwA6qk?)MF@PtJD`}IJd#1hT>@4z zkn6x9=(3)Zvv$hheK<<&UHlAkwQ&Ld<>gf}CxXSEsT011vGs+P8eR@n;tEcClR9nq2y|%8OD>k3)8oZLHfDUFpQBiOI>o>(R@I=#8 z3`*2V$jMVP%7Pn`-oT-CChYW}_WI?PL?z{$Kp=^D%}* zFG+(Ra^JFdyj3dsEkKi1v+iXLeeO1Dv7Ix3j`jAp>APB=CWJg~I7^E2S5rKLzn4Ge zjtiVGv_;Lmm$Ofu)>N0chJg`wff!77vFlq+2y~~hFn@-rP^urxJXJN z#-R(vU$`;6s!h+>YW*JG_eW}g0e!F5?>LjN_O7h~2^E!*+Y}_vAqHX^I&XcTIcY0*dtOAlMeCqpdY#v|U;rl7ZS5+yp*MhV52?2^(H=;Tgfb-TiH< zx^oK5k0G!JpiB|x>vdij?;E6qT%Fb_5&$Y+wRd!IQ$%O8U}Kwn`@Nzf;>(H#Cn*rJrcCFi}2>(X<=APrl>VIXph&ZFCWUvA8TH=Yq$S6 z^7PYvZhxZNcwqn+YW-QLh(>O7SH!fq?G6}}O|Va_TiYnA`}GR_Uqgsi^466e%#=%J zcp%xgT}Plh>&^3gx#inr6i9I+(p;fJ-v=b=|;-6>#mCMMsedQ^A!61U=EK1-~%#=Op|>r;PZH+ykZxw?)r z-kf~#w2E*2mM_h9h@c@qLdO1Iw}G%k&y-5o1ns%RRLh0SjwynM*e3J9jt^t`b!-vI zcN9&-Oq}`aq{|mU@&3csR}a{L{{7Rxel>qn{$JGa|NgG|m7ENo_O;`Ql^S24!@*Ch z^h^8{Lk-1wNy#rLD{6K zb%*}DodgcZUINH>doO>F2M!N$mX&}HVE_F2GhaQWu0)|Y#+T{0Nl80UUKeiUL0ca!W)53I;1z08ps7FCRJYBJEH`5l;og^wA;#Ki2KoOVVH zg3&kOuL8Y>D_{T()i;Z=!j{!YBCDp)xEABZH%c@Dfp9WY>k%*L^4o39kl@ap2B+E` z3h$2}l`>VpRz0q;@CnM0(z1F>^5MgWXrq-5%Z5g|)|3}Hkf3_CFle%J&30w!<0tH)EbW5Zg1x@4{i>UgOW zT!ZImS;ZPPBK%X&ns*b?|5!V!Db!m$anknla4tV;xig)OImoNhoYE{J^ygpCFIfUL zQU98&|N2Xd9s1U=A(`DMU$~W9cYdks+y`irtEsgd)BcshB`9A3V zOipT{ZPZXO4LhDUD4{M~4f+nLmDP zCSpswxd|8*#elRu+Hj60&zt1?4<9xXj6Qqp4^~th*OXb z#;2G16*fw(_vG&`6*JAJc>Ckr+)gB==HUvZnk@T<7c{t4CbT#`fIjf^RkP%hdeQxa z>_68NXLPy}Uj|Nh3Z6Cdna%yp^xV zvZd7Ev&5Cl9--VGutuC47tz@0E$&E>hx~LP^H{U+zF@NpVy+=^W+BRKr*hdsjr$Xc zdco<5tkm*S!XX!iUtnJtDV3z3FFTQ))x|@c>n$T{ouA^ zb=#4j?v0Q*p!u#Otg7}rPbxA0Jd$k{xQ$8r5PQ^ELJb&c0);VZNYca*!Wa{LWmD-!=V(_)mIr1y&K^kbqB_1>ob zG?G{Z_tM2ultb~!WPa#$*3&pHUkF)`DOZ)@GkYl8YkjZrr# zw5OvZO})Y3w({?nuV2TCjPbzQvIUwX29~w#!tUL>*Mfm3Sid)-tLW}teQ+t&JuPM+ zE+xgm$@xcUZ2$~2Vnn=Z+tjS{Ie2ky6A`sV)twrasgG9JWk_vmXR1^RZ!9g%merlH z)E%}w_6rF36E|}Ta?TP2n5(bzbmVPqpP)fUx`E7%#l^(}_aobp5)Gl_g_!VgaV;%! zG}v}2?NGHRxii}mURJA7@(=j9^ZyD`S52gdI!xM~nS{O-gxwB9=I&%6=T}_W3}-xy z+pcfu-7L*$F3x_9UVSBYf_Aa>o87a}<<3Bn{;1=R&k1cSHBs^%-y0g+zuY=sKWehj zh-gb-wi_#d=*!rCM{w(y(Ml zhwswbrNV5-xM^39-ML%^bNu}2f$_jkt=yQ!Qx^wtuct2b1;4qCAl2h(oa=r%Pvy}h3M93$%u>KmBx zhWdn$)ap^52Li!I02L*A9-G1vgoO$xPLa)mBsfFdxJfoORPAh5)8va+WYBhNI8Rp*EG}MV zC@hW^7+98VruLhZBNN@U5Xd~QGiD(nAxeO=xSl<$?VN#xa>U?L(CBVY=o8Q|w3sOE z_E=@Oud^c5#F*jX#5};DH>w<^zjhI4I-<}OKtOZF5xt8LFZddi`Rbl?2 zUsTilV!iMC-NsVKfC{W}eAKy*-@~)JJ-S|`rW!3SYR^{ZesqiS&VJgG|U?RRuE|^>zcrw}T~ziq}6caZVOI>2(`@e68;{m$;J`Po~Wq z3mu**H-E(mk<44=;i3P;gW~t0-#sEk&Df2Uh`@^5NR6XD*bBrAh>%HZyXBeE@7Hhg zrvjNs&B*9KqU)8gy}h+Ml&4)aJhU(e=Yz#eEd_Llj?|qylv+;7h>2n3Rc~WcdF+O) za+ggxl8tCPQK0$WqL?3gt!oIeQnpSFsWoOk!t;2U-7rj8c0a+=o|X$upW5C>Ta?8$ ztVO{N`F(ZV2=Bfb?%HEB+iTM`+B^agF=GXs#dzCsBZ@9v^3Q{2tDL&2`MAStGDuzK z178+nM#o=Qk;?mU5Io#J$X+k=-gB|i)6gGS~bva;@nOmb~89SYMzY7{TNQ+}W7 zHNAos*78^A&)n=7osM%}__L4KQpR?6pE}yoh|%qo8@f|gd6XV}(+x@L`7>I)yYzf& zqkfFAD{@QmH_$ga$XpM-9#a|)O>zc>2PL*1c9tqnZ!0w}$CY&(Ia-oG-Vkg)Gj!)mFflX3MjV`l*HCOa zQ2sa8oPn8n0Y=1bUCoJ?Ji0q^uMGx;xjgR$gEcQXrQz3lm*4f5ddh``g7&mmx(55xkc#UepJW^za{He`=&2^*|;#LAD1-6lgPrArOiX6L}qV>S~!! zN{EYFUz{DJsAfS(e7Y6vm0DMa0JlP$HVUVFi?Jsj=o zq<>g{(R zDBH!0(WZ5+W=RNXW|1v)URi&*pSVBu{zxkUX&SS2_pL+XN#fwT#lorELXV}B zb$Ve~oKaBIooiWvb+I*PUng0thF!x(2FD$^m9n_PT#r!{{zpxEZwag#6|o< zTky_GR-Ur9c6Y9JmGf@DRC{mlrKIN4k_pH&LwpOWyFp;tR`2p~KH{~`90Y0KGfmf6 zXSQ%~aWC^8%c^y56eHq%i|Qhzu~BrRa+MXuh-O){r%J9fQTdKLu2=lB0==qx!4Jxq z?~7hHgF2VLpWkej?itgaJ9m71eT%H;8rkVFCgTL@!RGri92pX8)Gx4}Z@%&RNecL- zL0&U*-23zJhaPO+eCqu@1;6W83y^721-1%i^;OI0;n>&sG7V(goMpe*MAqIIHvJ`Q z=ULa?{S~<}-vr3Wk_D`w=s{Tp7U*F&CUJZCG^XW>}2u7Wa5*iXf#Y0i=>%V{Y znW|hheHG2(xJz{W%$baFF)WPqIfNUkamH*qDXInfj!Z|(N(-1>UVAGyP!H;A?M4Lg zlf4;p*XMciu6b^^y&f?3%H}?aZuV`O6Ic>?^4I$5dn{Eg%s|5PUCV+tHN%%wGj+zo z8YN#ute9^s-Ie>M+OlVtaHFJ5ICnk)BT?uMtJE^{KT+OwCrG6_!lR;gKqvQwii-HV zcPtQFvt+5}Y>%>AamO*T?&COCM9rfkmwh0P4ldXNZRuMS{LN*xdn_PfYVz(~i&+Vf z=|Jp%p`eWtlppQ|N{U_b=I0Cz4a393`$k51=%lIqLavJ62VSmg&2&WSCLswQ_n}46 z5$j^1%Z`y{#UkN|X@Ix)l|<+H8=|73T4{+Lot-gU=7fM5*i@wzE${e&t>T@#cmEvo zXR0t=W(gzaHna8Up0I^f4hPeNN4mg9`N!yJ;%TpoGj`oo=A_j0xVm+cI<2s(lA9dr zd~HR8L*j!>*DkhZpP=U0MIZ0J`1L%pL5B>>uJ8TATBehy}_;3wQOp zM_)e;;JchGFa;&p(MdJ#k~V%U`SB`|ww(MHvi)K({gZQ6Ivw2k=1)~-a zm~au?=r=95c|+$RW<)B0#gIwzJ*fs!S&Gi@7I?bJe3S7P`9#@*g#&$@Dzd;t<6(^d zoWX`{=8JFmM53tg{zXIQ1Vn)p9}v~V-252lO_H6dmdIZ1tnGGb(si#V^DPIx{gYhM zFl9`)43JU*?o%1*QUzv~u_M`GWBLpAV+9$pYmRNvp^7M~oP{hNd3r!DAuuK1wGpr~ zCrkzG!tj^gn~9`YcErnnQtElzFbE7=flWDXp2yC{Ru6~rShY)$RG6MM_mf&UMFd;t z7Z!wakzFxj`ufRjqy7Z+Y{c$S%;?4hvp;__K?WWTqct`*2HKi;h=`Emj3`A_Rl;Dw z?d!Tn9j{F+Ez?1K7>*eY4Gowxpu6Y`{&DX^uVdXJpM_7OG;o@7AWBN=NmxW{3!-Q; zbHHQ+|Gx6YNKLe*l@eC4A->ZAD2UO)26&Ak8RLO1r(4s%*RChula=sPZ zR^7T$T_*|2N^x=j{lDUQh^mu~s^AH$y36q5^k~OrvjMA32zPtgI$+FDB=Pwp2OHk_ zKz$6Q{=v@pc;3R7@w6^K<4zdz5al>Q?C-VLzhZ}~aq&bb%Cssn1i;yKiV7@>Ng$AV zjrgEj;~EO--DIgLD^-H!+mQlSR9t|P>O@nSR~_Q~0S9K-y^rl*`ro$bmFgFan=X^m z2+IVwWW8=UPp0$STX~*tC{93_{j9;{ijBCs2M-nK+&k%Q8-C06Y5C;e)k!53$e}-x zL>gO#sm{j}f!ldXk89AFaQ0&Ok+ku0z}r0ajA?Wz=6-lwgCRLB{Gw&Vit+7EWTX#%3}^U^`OgrO02J3H;xhFTZkmAgnAezX8)P_k*e#3W7B(WRMH$x7bFv zJNhL~5}e+Ih9`2G-z(lQ(KW@m~;-b*siXwTF-qdEBQxUy)Jhc$Q{w@>+8|Z&dw<5>2y4g3>D&e8|IpP z+u~Jz{rY7c@rcys&#yaj=>_QHm$=x2IuJ*ew=cHiIg}YXe6My#X+0|<SeMg zFQ*291J(N3Jl%R`+|*}<>(sK7WIxfY*{IBJO^Z1~-sA3D$({P{Pp56V!7ej{ADiYj zc|X}qWvgsdy;)hRm*7?EZ}6(+JU{a!1YkL!BPVr$MYhN<7<)fjM4P?zd4Wh4GCgI; z#AUI`mQ)~qM)AWgiS@{|Ko@gW?@srG(N^DQ5^{l&zeT-I{S=x;Mu?J!emEOgT`OUE z&HaJ?KXII2*2w6OoN}g182K^~L!7M{lS8x(X>$esH2^x+#!EU4JWNa&Aib(tb?r?Q zGH^`7!#!f%DKze-1ap)(ukTM974?sfN*k^|ux|bj7r>Af*^9`?&JHLo<%Xil()xOf z1vf@dddJ@0-d!Rh0`RR97rz=469dHku$Y+V{}#{uF=RFk5F01~PojqNaLKsyZ5JUn z@Vjo@PNMsJAVFTDL0yJ{p1v(5zRx*8l3KIO(h%~BOT1yMD4}Gds;cT}FV9Qf*q9!T zg@xsPkx$>>?zjqw1_kl&(ksM&FE1Z;z^~VS^=c?Ouf^GMZS)y{u^}NLckkUhI;+%X zl}Wq8x+X88HQcexgtV(AR*jo_ReFP*sANJTOR3OSfxk>AOu|v-E<|c_M$EKa+B9vS z3mxZ{dfar)G>?zU8S+1m%cj#ODKqhEkA3JD^z?oUtD3ULfv(_=>-6O7b}~0+;@TJE zKL92}Obc}q1Z%fd(#BW_smR;NM~xV7K4yC4H(AU8SkL8~h4N8vD^shfd=oeCJm!Rz`&iO)`fq{(KRGA|aUuKB?E~)d}S)q;W-OG~g zzqfTQg-byE8Wxsauh7Bf`3Y(#3~}lMhi$rC%zP|rb#-Am1L0WpsYs#DEqV4bCNC{@ zv`04}qYO5&vO91VCW+GTWT_rkzg`g%%-xeMf|30rM4o?Pht%>eKKB}G)?x7H zq-Ksp%?Qkx4-cdxHtJ0(cV~|R7z=Wh#R-&jrRC&1{Tw6eL8|?SMf{uLEV&X zY+GGHyu;Tge40Zo!(v0ZM-tbbPgXp^E0Jj*(CqzfPeLm2U-81L9bUVV?r&Ihs-vqm zD!)cBzqVcKdywd{uO93Y*UgRJHz^f zn1z7uMz#4#Z-PKn%U2?do~dK0Ao6E0rbA}S%Ovmgv!J81v(rvnHvj-3&&`ii<;S={ z7TKshvAp~bdis$)3DitXU*Ml122^5b#bl#?`0zB*6+9oN#R#6nb?1hWAxck+8Mc2v zG&P}WHc2esxDelcW~RI#>W_0H+v=IV-1V%#sfGFqOqn)G%@WsMYE89&Ymm{=prJ~z z&|6I+Ma3Q6Tgu&D3%`#2B$-`vZB1lBL@9qR)`C()S6W7k0iq*hJBzW&jt!M$Q3TQ{ zJU^Q)gm!=+CXNWD^i||GX+&tgUN2(N|Ej5!o1a!d@gW<0K0vF)oB?Nv=If*)_bGpl zJP~5XwBC0wC$IHFxqE-SagBIND-ZjBVIIt!twGUHT=to~VqezNz}QpMeqCT%-e0OKa0 zpa|5-qq1|o4;e9iqI07`R~3EzLG3{ed*D~E(*>#%p;v5AEICP)81ClkmG_(2N9>~+ z=b;^>`W#flIc(yI)ARj6Tt-G_6bchLIXU5xk**Ee zdO(O~?&Jkq)p4n?^`FiNVLi@x}^0N~%hIGu+vv&0u;$LuEc9MGniYL?HU=oar zIpcy%m=;60)Xmt&{xq7Ip$cOcV*ZSnMxBla8beti>u>sHX>atpQ2!kN7xT(Pz)1nP zI$FQb`7kv%+me9f)ueFdOMRL};juh!;SE(NM$4or#j(VRNF*DV(3j@u+ohC0|0<&5 z(<%nMW=}2Ti4ft%g%*-eoN_u4_Q`ri3gj1in_SaP3t!6pB!AZmmZkV~q_=yW*(pCf zT;z##!_y7j@T6`CH`~GaP8pz>+560l|aN)ZNZU}-$i%kh21)>%anQ<7O|A;5Nsjj-T6U|^^LiK%K zv?9{nhz2YamP;Dz5~Nm5mL2z%uX9=_B;IcAmM!eNmdUF;-g+Ws#*n$3Ug8#Aa`U%8 z&XBUkguM1deR-PABuU`#`;}H>8Xub-d}F>mp8Z#c>uLEv?uXpZ`4Z(6u`}QEM5D45 zMf9e0)Y;I9uhWR8$X*g3vedy+%xOe2yyayH#JBBL^gS_eO^(^GL%+E=Gu!wd{%H(4 z?_7@Z68NB;be}=GMILrJrD+9^I8^J%<8u?1Hw_wzu2sKY-7-n`Bv@Ep;n+URqW23_ zle9FuJ5%R`-p>BOexK~9w~jKUr+48WRMY2>Q~UgSz@c2#a(bL#>>o?O{0-WKc`?SQ z1AWi7xKLSdd&F&Rfq(kNR-2yQjhh21LVKfgR3s$M)?-sJ=>gVyKtt1P+@31td#k{4 zT_ZUq<+7&LE4YIrllD91anlD3EV={+1{RhyIH?*Mo`I1EI1r_#r+?nxcl_+@%T9~~ zf!9D^Up+vpj4UjR?eqwHTI|cxGxp7!HNvaNncpPs+1j&@TJHK44J80O^!qJBE)H5o z?~g6rgJrmV{pR(0h4`tjYyhBSxQG1&ztMSKa|GhaJVcGP&-QWuZb`XRSNyLU8<`HpWe&54Xc6Y$#)5d8JuY%FdRh0rLz zY@3y!<#*4t+*q)pN<`8hJbp;s;G(~r5{4U}yB2Rh^WSyj*ZIbx__h0+?RgUgs|GRJG+3-Q3*xTz7x8 zy+ecM3=m}=92#-~A`>s~uVBwzYFH`6#Kd|gCVq2sZ-NuCu|IjApL_1FjeYDl*>$d! zjeK+hKl$y1fK(-!$AJ+*VQHqLZQ zqb||n-QXRU3?p&73;Amn7pb3FPMFxEv#a-P?mcI3SQ8L(eL{DeDGgiueFnXxR+ssO zdYTe*h50LCP2t?Pzx3u*B(StSFbNgpXU$h{y3FqtWH_<%q=`1{?F>|`9&4ci%M2im z#Uf>sWzzWwyiRuYT4#}+e=_<*i#V-jY4_Y5t%}gpRGN`JfM(f911*{3<>&}96cPKx zva+%}<-$%I9&M9usG8hbbTHsftMgj3)GyKKuDdv?D>5Hpg|K|C2vHBFNkX9ypehJF3s{I+ zUYBY5<(w#=>S)(vJ3J)~+?6jU2BHOUT>JqX1}uM>L)|`Yuyo(b>K>l&upV8ar zBjZ*=YLQ{pho)T<@2;ignuXVR_*#rvHTG*Z&2)M*u_x zU%LGj^9*2X5SY8=*#2I&?~3K>G+JPw5w!OZ zdS3#gBYSwBn;5Qc2@dP%+*Z?Fjh}96k9@cU#k4-`LD+mdtleqT1x|BNqyt6#Tktko z-9b63%y|&*M&rxRu643Gtf)ZP23o(D6#&W|SSG)INyCM|IyxTG)B8eH2UH@hv~K{r zp4J+99S{6;w22Y!S`O8UlHFBl-;wNqqdK!=aYA* z#iA^%N1tqXxI#TzPW2Vnfor_nb#aLJ;#3!H*1PWho);r|qIS4Aqp(@uJ>ZW$aI~&H z%gQh3tDIDCofN{V<$fj2t^QX*VLzhm=^tH_(o>hT%1x_j9;-Ncc$dKSkKscO6@Pny zEio>2?=+7rV{0?Y$hNwAy%4n&j6G2BX6&w|+BXGBecpy=On`)SGgtK}4U8+kGY9j; zu7#dg6^{@RqN@75Cki~<$F(vV^h=umL~Yk?_&|P~2`rP9w|925N7{m^4osF-Ss~u_ zI*RhzA|@MC7nz^)rP?Q%^n`kc$HvbC(BK$K@lk@HYvK`9z6OT4NC(MCW3~F^Qu@m~ zSiobZ^xeeY68*vDfecd%i)I-5uezt+vwFrDBT!m4LnH8V`Qp#VGAMwY&&4uoLFp6X;l^DvM+&RilA3$* zd8oNg9=U6hA4eBROphn~JeTDy%{7k?5qKSNbd-3S5`M+Tukod45qdygP;O+sm^heRmw*6!Q$PW$sl|P&&$2E(IKgAmRwQSif&FSVp$VZ zRg_q0u3`UYAw6J?1oR3YSOwx)LzTG@vQh-w@@@>8m1J?(iDYKh#>E|**$O5CO`(cX z;1p7mNuxO_k>e04Aup6s8v)c51&{uO32y(QhB`-BWTd2#QM%Ocx2g2?&__T)L2`7EbfmP6)C-VF)JhoCT3u`2(^tD zIyxIX6@{h)bajxYmcYjOw-*r%^{Y!no1QR|vyfxDtrF z44m?rfl!6tK7aGs@$Yfj#}WpGqf2XXlLrI83~E$@C;4}h9apeSRi?$zm6+}dT6fw* z$>I^Wz~eQB#dVBVki-O;5>F0uG#^}8zYh||F#3u-Xm}e}+$Omc4Gf~t<>zvpestW* ziuTb#Jvtb@7R*Km{;n$%n1Tv^XaGBmdL)1N(n>kp)jKQO3Hqb~Fu39O?36Pt))u5q zIWm|8GOd7}P5wV4*YYR1a^7wg0EV>E(nv^Pp%IhUe(Bo*J`wmr9qk}%d@<%%!yBCG zWTc%DY|)RvGlw4GE($W6&>V6}^a7mHg@$HQ@zEt?0mzl#RkMJTEO@p%0Jd}JJ-x3q zH9Nx@UtY(?o;TM$iOo7H>^4d%E*{)-kqoE~0`>@?)D@u^;O7P>8wXT2W@o?m7D}>} z{ux-zhaHn&K)@e(MZ3!bVZv!Pd_c)~a}h%)%s*Bi^F;wz*@dA^6`q!)4EO1|u+bJI zt|puv{ar7Lj-_nLZ~ro;-(+U@U76vRG&c2gX@7S()4FY`rtyl3^o#oU$lT%{jjEJcxJXTjyYPG7kVZk&*^}3?16&@ z3H1(cjr~5!QTY#lh%(eUL;@!VrGGCpMJJHSD%OP{guSA7a8qc<{%2$(F4v@SZ(>?z zraw@Jf`J`|iG@`YRc`O#ur+`bEw~uZ`-+@Cz{SPI!NFl;V|(i5RW~z0J`E9|n5^vA12(v=yn`3@Kye)d z+!%<1b8`jVo_Rh8L4$=Cas&w;k~n|;b-&g=)EFtuEb3>Y}w@q9vLY;4YuEB|as?x#CgCerzDtIlqZW7$t$7(&QR*!Sarjzp? zZ_dsE`9iScEFc^=)~{&}2%gq|yGRmU{*nO33+07)5wB_L+cSfM%`X*&Bn%B{QFRyR z(c@>ncvR^yPriM-{rWk6SUWhUf0go2y#wT0I1UfreP8PY=xSZ&GccSdjFaon?uu(` zCrrrc$qKJkW@piY;{9BUxU#Dfnz~n4>HB;`GL?db1*f(oxg3^4-`o zYDeE$g;T5ftV%#*xE0Dn@yDh9Zc0$F*`9PugQfIH6$?YmNTbsChgqx^zI8K!RlI1L zvTb>BM6QkFz{$WkS2JFsBi+s;9m5Z;P}PBvrOfIU&J2~(#2bDwG929PnWXX(#kThj z1D&gol3U}jNmJs~0qMej;tM%&(1`~d^Z~`NEp6~9k8s!f+r1O_!R+VItJZ&h+1T)Z z_^yz`!)YXgxYGqC4 zPKi)fIM(Hyl-Kdmey;?}+>7f_hkJgyyc}Qt_BnJ<78DeqspSkS=2+I~Fe*m zv$^4Fz0U@)UheAfuxiN7wfAdlg%LNd zAN+m};YpY)ZeIA(ZDeqSuyi1Vc2M;^c&Sf+o4R24sgt2D&b1!YoxAUw8fXP4d++9G zd{WJ7HgnL6pMC2insi?!4?Vtj#;gQ}vV1h^;UhH+24ZfF(?~VaU}g02n;zH!!mfN; zmZT-2_XDx9dIo5XzP?iq*35h{TOSi&9a`y|yLR@UWVM`AslW!#z!=XYA|wA`{L$LC zhDM=bakAR)at^{3`<0YNZC)rVlUi4-j1?iTZ2mRRv%p*C1C#G*SXL0`L+b1z5W@g)z zwQD$-A7^IW??WYp&f!V}bfA8(a+^=j_sXL|=RF~j`=hM$k-59dbhV`t-{v(|4=SW{ zr+3xZcg(EG0{79c4QpOv;zX^ykS!dXV0nA_&r>#r_*bbPsR|HgO}X*v5e@iWwwwQZ zR?MU1mxcbneP{f#pq>3cljdI+`ej9jQ{s!dGaUyidrSQDTIk}yxa@!tzK0&!d?~g1 zpBJ4bJYR;s!~dc$x96GY{QqkWbb00f-`|{zxE)YX7)FSAo(j>1={!jIhV6sTkDe-v z^-Sieje0@ncz!nJl*3t$?$pE8m7i5={X;3q(pY!C>4?(XH1{xpe^1d z-sK5_X#cexmxLyEJCsMd;Evz|AELJg0oq{yy5}4a_4(g>74=h<`yaaN*?wFn(N$%+j&#(_yDD-r}tgVt;%ton8OH1SXlVh`o&Ga0U>`P zOi;+!s5AoLVq>Z*Wn^_o`+pXKpQ`l3PdREpbv=R(kN3gBczHGZq%JNlD-Y!55(Q(F zQY3Al&*%K8*GvCN%%GU%jrH*ogXwA)phxMrEZ*zr=m@U`WQ4P^57v z_`@?0p0QE7o-xpdwZ|qQEq(oxY6Hd8waE&CqOojBTZwn$#YsQ}U-@gU3ZzXa6Ag8D z1J7CzVgWEAD{w;TT++Myyr6M{(&f(`qn`M7C_hx#FNca<3|(G$ak{hem+tc4n3$Nt z+fpP0AA->-obG+2qb5At;|}ZN5mHnh;iIE!o~K(j&CZj*F!emJ5k)8*iXdXXVWoXgj+NeN-?O>J_$&T-}N5!#QM^QRQIwh{e(N zqWj5u*~(v|KuV!lu-OKvquhQO-=HnXVTp$rM@3Z?!~%LQOP-K5iq+M0Mm;Wi(}d|z zgaKt0pd^EFpW(v)hpICH=W^ZJIL)I%+(DVijr&|HXSlnj+?8<7N`yu4oHS^}5b(Eh|YGbp4mW(vr`ljvb)vJHN2=Srh zEN}H2H*TD|b5+QoDzEr>h9OIOrrxI`o>LTa8ED+ISFbk72fE5!3l3i5@uRL2tynp^ z{YbabT#gz&dU3ZNV{5BR&LNE{#h%8Su`^Pt-l-jyH*wXyHpzbTiX+w@-tgbubi2VC zxU>L`?WekF^~#EV@{bmv={V9qJ>Tio)(6~vwKV&VU)3sy+4bOPlmNl*k%+i2$HlEE z+K~~eGTG<&@nk$y7b~@%CGFgKb?xpu2?-1aJ|d%flusNS-Deqhw5Maw5%St6sWTTZ zUmnzd=ovoHlQU{PRaI4?LJ$8jF7Zll163JkXJ;XZkl;*@`!Ba$?0sU^bOq%#54$uq zH+w%SE-q$aue@t?(&w%N)qCySxpVBw+tcvoc`ufez+cprt(03Xnc!jS`|U%fp{m(L z$`im%$-zLTAI>%+#M0D9z1w(=iAdMNq+esFk8)<7dx?_P5{2-A+q5-(teV zfWK1V{V;#oPAe|(phdKGSK(RmsXa&NZC)4Cu|o%mkm;4{v#+St-Y`vwd%(InpK)f( zHZ{-TYh5$7eob}#Sv&pG^JjEYIHfr$5+4g<#?dOfh~A^DufL4OVI!vMqXqBTv*)GA z{G|5C_MTmsDM|e|ICN{Vr>EyO{*i*+BIo+D9W4zX-o1PGx}rjtb+d=}>_$*1h=DGH zHP86@^%nvasll2dgGTsGuzopy?fVu?tbH|i+^(4t?$-RXqWJKoNxmvJ{Y_0xB@}6~ zA2`r1=igL5Y9vJ!RqSWO>9;X|MdEU z|9;m?ksI@lTAkf?pujfX13emi>X-WZ_xM}mUF5$kS$vt8GWLe4>>i)_=ikMiX+&(rTu2b#VYM@igfLf-#kXDg(pa3NQ2STK3M)kBW*+ zikh@AX5Fp`jeoY`ce~Ld_2kA^4wol&>ekKb-QyDyXEa^?$O1ug{(B6CE`*9dh0H(u z>VjbZ^?9KIC*^5SdS;&wHw`nCZmT+xXTS~ZtGuo|Dj`MV==r|SO^l6$``eV2mv=PM zZ5!Lab#BJ_umdqMsvNXWmVvT*+#=s8&SNDdB^6iRKF*w2(;Z)D587TiK`8wZ57Oa& z@aT~{1o!dIe~i6$HYkXHrv--zmI5Zoj^FWP(?buLxh5t9kr-be9#U9TB;F*aaM;kH zlDigYHGADKj)}hBza`0lKWJI~+Ly!=lK1r<_q>q_&(t0<);PNIKvgWm5dS{eUz6DU zXb?gRcYSz4;*mM7t_j(*c8g_;MP3a45yrNR3=cWoQ}WgET=r2WR5OAt=SfkPb0h@K-C zMBs0@s-W?Lc{eG4?ymn_Fwwbc8 zK2<^lMAm^kSbf(*Y0|Meeuk1yPETmP_wIS?`@xClkn4&j?7H;Fk6&ZVxE&uq z(edNLw{PEmsja;n8R^BFh+XMRFJfkrTl2xghlSXUG0?1lg&!C(apDq<0lRMBo{WuF z@@1^UNP1PZp9_5GXz@6Lf`fn52Q89fFW^2a*e)>O4C-jS1_ zx%+V0-tHn5FU_I*mZ`O1>(<-SXI9?XdUL}Ik4w;7-aQDuTV0qDyzW|1&?+#jfN!5> z4q&DG`zOAb15#GsG{0#?Uy{cQZO-`k(MTw4l!AA>PToD=S84V(YvaIHUp`(sHhO1) zar_n=&so#YX}aP?iayy3jnRv|yd|7gTidaGTf(R2Vd`5d=YdirCvW{SWaNUgOFhD? zf>;E+&ON#;-NzGi8e+J)oU|`>bqqIV>0svR32Tgih{n;@_LHyJl_ZMRCP(4zhY#-l z{xYyp0Ax;gK8KH|yWDe^^RYo1w|RsT2%JZ%srhmTd-m;n@UA&yAr>!N_JC(6*s?Qj z?HE)cf}oN`2cY!b?ChR541&Gt)VJ3w3K!er++evm9{p!?1|>>%{?b4?cfE&J$1Yvo zF~=Z~$la!G+c)Lqhlr?&DK#~lm6VizRNl&boRP8Y=&fIs1gBDT*l)@fML0K2uG-qlmp3K271h^!wk7U5Ru>Q4WoWu> z_J8&9{jgo6xSMnXuTI=hR9NVhv}Vm3JGx<2@zn;cthL-vo|L|Ns8x77!<^lU{DA?^ z#pTZ|OW(YaG*bQQG^yR|7ePzL==XYAJra4~wx+L-ko9g^7X}<5+DK{dB4aq9&z8Fu zLnkvUE6c0pR84K|JEVw~$-5+({z`J2gCdw`(?)mqG&>9McWud;EC=?nUC3)IK#tGx-t_jpG*tR5eJx5@nU8# z3g$Z$sFV<9%O@Zro$aEy-2ha#{8k@p6 zyclz4akzcPnrxmoW5&0<9cTx{;0xe;+Qw^P6$;NQ>O_UYM_PT;XoX|dziHS08~0qH zp4!);s!+{oB53u=IjzCrq4EoT9!hN7v|bc(mOeO*5xXr`ZJpaM65$lE?|4AK=Vu>2 ze-6%5_J!l zcdo6i?cttnxzZSAo+r9)r!YZVv8-F{s#+HfQ7}r6FG2u@eB}+Gknl;u^qpvRG+QD; zkAM!gQT|==?_~>ANy#}xy8;SP)DNF~^c@cB9p8(b)9jJZZ#iB53j$%Z!Uk$#wZNjY zw;XN*Hnx0zwSUefu@0)doP5xM_}-et~e0esr+jCB)7~65%{!+ScvvZ++dmdHO_oQEek&(T4L#U7!Xg0`- zn=L0dVOx!bd&woBz?B8(^dYZ#;bDnC|70`=uZoW|wf5P}NV}4=r04P5>njyP6(#$Q zH{TUu_K14Yzi9Y7)ue{56qyf-iUL5@ea5V~4<8T|7WT+|{BbX@`*>JLxk4YtVIFm; z)planNKTDiQu8UIAQcWJk;T(9YP|UId>GANO%8!gi*-XAVjVtYQ3y5q#E#}#^4*fT zB~DHaO8*jvg?<7-ueG#PzcI;9%ku}XNWXPfw7Ijc>(>W=NGbHLO!)dxhHtz{yu*W0 z@hp#1anjQh<-og=Uo9~+&uLgy-&A{Q(C=lN_U*X<$)OKl&YCrAp_y5=@?$F?z37OM zD-dfm9F8jpQn7ipsl@gBgbgp`shNcqlzj1M(DoyO36YUW|8Q<+v30m~$i$R$J8HD& z939ZnD3h&z8~J@4aP}xitb0BTBs$mBbWq#2ZS}uvg=Y*x5FtjFK+-6!zTbgKD%S>m zT8tO`*Y};j=Em3-p&7CKUd4t{)%ipLuNBn|4Gm((3~nH~279_hKoDO5Qu8V)RxA(L zQ_dkKr<~Q;F7o%z#)6VBH8sL&E_G-R)sDJsLZ#K`c%7|k#<89O0XL?i1)qL3ne=*A+bh9B(>I6Z#V9_e=`i92G`-`zub;oaPt-vss~H5}lj7rQmu zJPnxQ{$Mo~Xt=`%ePJSGJ)gb3{pG;G6U>YNZb)og?+>&Wh4o59v{Mf)l)gUFYB@oH zF0=qXhgzALnTaap=wPj?P3UyX#E=4xwJ;xMYBtUGuOb7$&(qv z1B)Vp8rpdf0}$jwx<|rYmny5LXM((18tMz|0*Z&5Cpcf#^FILlCkrw;B?raG2$O3}wLo<;BnS1&oacueg3*3c!N zg06;)+td}3WRF2`+mO77TeBkmsdt9jY8d|Uxp&g&=piwFu7}R!;Jv#0eDD~<6a4MA zi+?mWw$8o3-(~jh&rXVcbUhO*;0hjK;J9MjE@ZcM_^B=SlO7hcm)IYVtycTg(RHbY!G58V!Q5vrBW4 zJip5D*GFWZpjF;ubrLU+OSrJ(=Be- zdnDU54u|rCJxcYPw6U+2+f-gHj&_9+ouIb_95y$JjUb-o96ZOwp#rsUL_Ve;NY&Mj zVK}VRz>9#>T~1-$!=EO`+%Ofd)<0zBb&e}j3&bDH-4raByW4i^k1~pXsp=pw0)dkn zaxT~h7J0a=>^`ip*sS)p?`H6jH1y(v;vzIBNFXm?y_y}h(U5!nu`qTbUr6g4#lP?@ z-q}u~zN)A~DM&JR^NQ%rbIB=dD{^m0ZD-F$AH1~rH`lZ$>70S|!_XaAVv3y$oU-{x zB~%eV)zizXjgjG@myz%MKu*;H&Kd8>D2S&Dh~+<$6%IF+--3(%ml}w<9(=6VK{F2m zp!$ntF>nlqEpBDrhG(8S8szCF82~DD%Kva0|Mi2#O``#6O)p7hWH|n8C$)6L8?nBR zGrn@;DGt)sXlZFtw=sQS7_uu~OARAq1azdwFJYAAra^iZ6T@I_dO*hVyc=rL$I;Y3 zSF=)uv_Vl^YB}pU&xbRsy^U5dwqCo=TF%8-FY7l4Qgw2B!Di3O9jQSUFI>1QCMKrFRYh4@Ie$q1kkmaC-_Q7+tkHSvr`K!# zIZc!N<1X;zV_P?xk1?^l#mp5SnYMX(c~eZDuN{ZiYJFB}i~23IAg4>A+rnG={A_4= zQ&lD0Tdmu5F{dPK)259?ZiJDVn%dF!|1?Xxzda=f?eQ^rck7I&tzx?Ene@lAqNt63 zn0MW363oNmjm^1qGyl8eCCKYr7vO-LitnP1gH9L0x1|HT?#>oUO^?*`%Q0{y!uc91I-aH`Z zv!Z#qV)t#g!fz~hYxECN?K0s+t;S4sp-p?FVn7OvpjG@e~+{| zQO|a$jV&1M9n5mpSQyWKYMW(whYtYdu)f?OhM&D@Tvru!_m!5z`}s`cia1mswZoaa z@M#3S3ct#zRh>s{RPHY*D4(#kx`SMixyNt!Jgjc57d3lD*4=qKor`)fTmfWP* zSJwmx_7PrZms8y{ZylR_gPyyb?2c7DFVv`b;&J=E4UZ-rFLF091I*&Sef#8tJpfO4 z$p%h2awY!*d^c#u$+~$b{&?Ft5bY3khK}o3iu}xSYt!u+ZEHd=bBA|1y^jw*|58x? z276Y69S5j8b~yatZTELkU%!7JNfC1^zcR9ULN}a3NCuuYKI?Wz1{wz&*NO!t;+l*IR#4{BtN`2 z7?(d%*SaJocu1UI^X>PhYqBnD>qxj!}AT`~mlRmhFZQDL*&>)zx z1w~zqbVv8@)$5u+3qk%0PWGKeN%79wAY7x-!;mamVBNjirR!kL0lS(TzsF2YzWTnj zv@~Ll*7+Arb{&n!8^Wam=7U^JjH5R6E^%wT5f{6>&ta!bNq=NW=HvUGR$AMM#$ATL zYJ7;KCKLlG^eMSao2G+`{71!PyD+YEZLOozt&}Gpxz_F#Zw<_M>b=a2G;r|luA{Ae zfoWCiqE;B(Sn&WZ>RJfy(e_X|>En_r7jAgyjpzB!ojVd0_J*A#@ZX7M0gZ%Fii+=W ze+(hNL%S*VsW@=kB+l^-g_yzMSNq72q48DsGBUc-Dti0iaM+KZPy2d2>@(QPEO%W? zQ-k4|q`T za}HjqR8={4`0yHxLt7HG!YUHpe_m#2cnc*~Sv4gAIl5i);}gS|Gmx#f=ZJrk!EGn_ zFK-aH1fgc3>XfyEXSskqRt#Y0$h&!mTdh|C8#|U~wMFztwUSdbM#bvsfc`Qv%zcYZ zxe};CEH(^jTMY1BduuU-gN@{CUX?=&QsB&fjY=c(uE)i_TJ^A=haQl-uYE=At=PrG z&PPR>9(W>wWpgMlyj+)ewD3TJjmC~0jmzmT!ZR^5?&w7XX zAdiSEZHh|V}s83Jqn*Pi_h>vA#K_ksV*wMxyF6N ztn~c)DGO=DNNM*k_zuObOMS;IOV*FkxqCwI(97ODA!&Q<#|u+6x7UZ5R4)L@-0*5x z!BjftlU?tjmw&DVUOr%4Qd7i(ywtk5;*G_o+qS7e5%u7_^|S$7#yOVHfGVJzTqFGX zbvcHgQvQn>hfi{{PnNb7cPG|6C@XFTz+bGbFUT#ahF ztA4m)1(Af)D3T)+94L{3+?zhtRu%bA-`j4{Uv%@zv)L7E2M-to`$XNkKH_WbWo^%u zr`|+l7}!}`JNn5AumaAOvI%`@_i+l9aAM2PjX53W*5A52&h*YpS#3UiKP|UAN)Cx? zoV_KMW#Y@_l|N-{_~=5q%TpG&4*yMloYO{6hnLbCF16=rsleF2y5Rck{B&kBOD1z|N|+qiX2P1M(#}ioLVD9((_e&8-QfuQ&Uh1w(xtQLpMYPC%bz56L$`p zb=2+^Dc!!?AZz<+D&xl=cOT@^VHd5Q+Yb~vL1g9Vjmr)xKW+BC2LVhM^ibdGaJB(Oc-=5qNRMOH%P~pg_)`wuxn|15JKK|Sj3e~?X02LvA=|@*7c!5^d-v|$K#9G? z!X+jqdgkUs5?tzr!3JHLdrXO&Coy9F>1kWGsKCg>RjE(SgFyFosTNNQKzL@d{T_ye zz;#2)E~`Hy@knn|H8VVUI?xc)nJ>X-xNTo5x`KiqM_A*or&rB9ZXBI5 z>F}pDB}qGzYVL&o`0+zNSTcD<@Su?IM_eN&Oq`g#e%HW|?MI=x|Mc?e1wjM;ANesa zY%q3~UcGuDNjT{4-k!gNZ&jAr7k2I1>xK{KtiV2};|_cHwM&>mv` z6d}tU+Jo!zPW*eENQ#K(7iPAn&HpC_o8WX4vb|f0QDxvm3BmCjDxR}g!iUC=pV4!{ z)ZH8zx;-Ecfp0fMbpfQFmpjrf>e;<}G6c`$EtRK#t`F7L4Qt@d_qj1T-0G&0QG&}P zp6nH>3WlD1gE#q_rVtkS<5!RWV(&I>VlQ2wAycLp7ga8`u(*6uUI+_}@64U9tMeMz z4GQ}Kw|STjoEa$R@E)Ix48Q2M+l(V(ukbYi4}W}lq73mod-f?za4MDEJlYBO_H~34h@hOtY+QLZVH7beaHh(+{soIbi?hUR#PZBG4_ZTEkIFN+%(SKrCb+LP?{QZZG8AUy*)%{nb(;bcTDm zlF~9Vx=v1$K#$}e2&(<2Va|T?MhGUzgLk2FAT-9qa=-yqRaNP1{=j&+WzvG}rpFM@ zfJ)8g+9mEER!~9o95G)ow}2RC*xe;Q!meN^U?7>$R7khQ_AydH;V=l3hc9FX8Qlwnt2XwV5I%-1g|-9#sWxp$XkACAyJGmje}L6h6=c}P8ks9<5sZjL!0nzLcx zD<6nMrA3^!$1pDX)22!Mt%||o(XLD1^Rfqlhlv83F7ll9m z?2er}EjCz3W8nY~e#!s`2C0ZYi2x(|rP zN>p#aSvDTX4QQBSWYkx|AjJIn#n~CT)zLSU$M@~hrSJIj+BV-A*aTwMB{_IX%cw-F zmvKF=fR?Cr+?#DWDtsrtz)6>^b<{ufXbymbwR5hYGKwU2? zYg!Zf>Di7Xbpmal@X#S2OOmv}{D03qe0o+xS6jOy6H4`pchZd>m^Ll{R#=#u#>1ln zD{3ZDjCv(u!L6uKXL{ZmAmk^@tJs71m6vF(P;dHdA73bs_TzPiYRNlr*hTW9R9)3E zE)4#Ki`E9g(agtWfSxZSpb1&rUIkb9o;ROkO18XgqmCc-O;UZQPMrjICtC6XJQ0y} zBuXBxQ-1sA&2*aEe7rk#xyDn!B)1m%7Thwrbi>At`Ow4MN(Z9Xh58PvP|~-cr!NZz-uRI=YSqr@F*c$DV{sCz>=uXU0z+L;$^oqx}{ z#P!3%ypk)-_ej%-rXq#&xzzvpovf_IqORdFr^9zr-1$f3?e=SSavBc5uoK?XTgC8u zl!72B80>VU|D;Z^FoRq^4ux3Uno*YbAL4O1K5O@n{BlS2L0ex-x-T9ycxTh^c4v6_ z!bz{5bG9KKnM-jR;l&m0L&JzZWS5udow9fN=wB6rJkc5F%C&0UT5Vg6tmuxB2AF0- zH!)E2$!-Qy(yRt2o+UmDZI(E%^b{CYYyqke=~c*=T(8v>q5)v_^x?`%Yt(($u3bBS z@uCp8#48r?LH_WW^yRam=E`Ft?NfR>P5iPXxnD@>3+?Xy0FbE3ix3^(gF)B-n=M7< z1Y5ckP9L6TI4v#$E)9OP88l)yGbcH)su@KWB(<~rbSx83RZDiHv@|!aFGYrz)y(;sDKcH@(QyXn+j!6fsh zzviab5>O>@=cf6mW3FHSle&#wi?~}TYzAoVIL%Kh(|8#g3%(tFD2&H%W8} zgUUb9)^^6gGtQ#LLf1%GN5P66J9kc@07oH5Ukg@%(FH0p7ApQ3qVk8z6qLl zQ*HIKckd=AsNhgtPOcMSnA||u3F3j{pLX-<$?fJQ1L;*TOJo%pdd!M3fm^=5oefi- zPFKY%vx<_&Aou|dSwq9Q+;C5CQyTFGDu!E@{bGn-PFg3~y5g=7qBg;P^GA55RGZn@ z+^8vv*Lj_rn_EMkytN@`bn?#uc`N?Z`9*S7;xSsYC%UNJ<{Uie9%v zf`d!B$7GTTfUIckh4EZ#`lrkMUic~1CU`gPuGR#$`uy)+uw;2f-$M$z-MEe8#fCtkLeE{^dxb{};!G zv-r{~Wu5X#hRlOmz^5~UbF!Ezq^IYx`9=Wog`&wlFWN})c5Lhfq;ynby#J7uv5U7A zE6~baiz*P6sbze9)QT}QG}G!Vf5n;vO!OxYNe!5s3})Zt;K0(rMJ6V$4@wzk>fKul z9z|yl9nIYG=1$#v_YU;(RCjBdjA+EbV_od0PaBv%=)EyB`syAuE$fuCP?yPegvH+Z zK$bt_Xu51G<((On)!jwWhp~2mfnPrgW!LZEUOnjn{~@U;WZ=q>!%yj|w>8?kEiZlb zP0@wMjjo1y8WK?7>Q}sIH|U?!^l*2d>#3w>d23R~HybW3qOv7Ed+oA=$GLU4oUrgM z*Vrz$%dl1m7wBLxMNO)_yc`bhc9&Q515BKnzoKDTNEtb2&ViZhWwtZ+NQg7^EPI-z zBIG*g@9)3(eOc14W;;&@mngp}=bpmk!dSh?(3)ac78B|?W`$xOD4qd2oAbX18OE+W zG$#M`hKJF9j1uvEvADgj4e1AUDC3@whze*-*f-sY{uyIl4Zon4=dy!d|KYG$C_XwF zQbtx)F}2$_=sV;+%hYzwi09=|pv$dd!s2erofZFv>N0S z^wwp-L2a$ErS_j zQfoJ?NXvQR__cy5rh4=@gG!_o4H zzHcW)Y&`}KMlLm()TFo~a$Y%C5Cw&gw&w_YkZpu(;})*T=cDaFE@JkgppwW6#sk9Z z>+3DKexKe~Y{6)N`1rhS;s(+?f2F|S6m_CHq&4zsRZ@q&cc;yt--S>sAzaA@1`jE5 z%3t0bPD#OUJxKi+bo7oU4WD5&mjD{=qy{`jjPYXTeLc&M&o0dOSLwP7iPsm{hU;@8 zZPz?JayLC)wc|h&S{R($%1{QOyoiX_S_K?)EyszM&V`DMxVIlO|3{%Vqgyv zFI2z`kaev)ZZJ+!vCH7WgZZ1mnnkjqGbuLw$LM}{@LBMm)gnr0#%XZzgZ=;>uI0BM z={ND=&_xST*I<_XSQM`cL$Y~ZuP%e8o<_#G=r5!ly5XU#h`@VZjhTeKlmgB_V2m}T zS=Pn4#{M32I$9JF`>2topB`eZedCXzRi7XWnZ4?2r(Jy>_6{Wxw zkL$w&DqaM6DpfS;(6N*hUxg$(8lVq1?60}#HI)V099Vw=2Fdf#kD@H0UZRey8>&ac zqI=Jtdnphl$WmxjNTk(D%lmZiJ`FJ(C=UG_ai5*5S+Cmrf1{&g||Bpk4AIG zj8?Ej;x0iK@Op5?7B zy@6d$bDGC3|0E9&2bwIiC&{K)^bS#YXkFr+YVj7r91T(A$3c>ldHkLg3oktv#sqhj z|8yHGg>FNf7SS`bcXU)n{tBl11_ATZqYY7;^Mqk#3&^ zE<)O5D++}la0WRUd5rszgpRxF^e6{KmFRa7i!O(R%rE*pL_@=*p}?TA$QPc2YIysD zoGvQB&G773MNjGVOXlXCLpqUS6`6Axc^!h7{Tx#YtizUjLtzjA6~_T&6fQ4{h+N5j zvo=4-ISoB9Won`?uK*=a3i06Y3gEZ)_d;UgS%ik*m<+^vv0J}h{JBX&l&cfgv_qN3 zFQs=VWz^G*0QNWkK)Km3=R~fz;)1DP+o%Vio6E8eucQ4J`)Ss69i2`*bO1^s(S5}9 zoeLH$fE-KPCE0qwo+5%4nk*t%GEH@$qSIul5XqLSXI*rb=UjBN-HzwMBYW0#NCNav z5^y_1hYXS6W2RbMjEnQbwh_T}4#7ESR$8r6@_k9;H!i>2`7PZ|vcpHhTw-FP5T9n3 zdpQ`QUn8AEXZvS2nq7L1_h&l#J}v=|NxtJ_SiGjnL#^=JP=y@y@Q_nfd@|J6&)2uS zcH&+qEq4lJ)NK2}7?7lZOI#bGOK@0vIPgu+O*Lx8jsHxC2mQ}LeVl+Ob*cLlI5l@e z6wja6J5ajAmnGxXDP?Ga1{U>^#iMS4C{`yv)go^7#q&3Bo?uvxy9x?KYl#T8==0ve z=Y1wJ6IY-H@G&IRy?3deIT>U1&P-n9>)|F>zdM>Ho^r>hd+Q4MT8~})jVk`~;Q|Lx zLOZNG{O6x<*|1Q`$-aZ2NXk`3h(IyJ)7<~YhMUQ?QI5+}#$`a8JsQ083~V@18W-*Z zu=a`-e?o{NPZSmg3Vdqi20Z+;K=mmO;%j1z89~#h#Dr!7T#b-QmU5+~Tp{r8KYBDJ zGBztq_M{%S1YW7#YlIEdjxR5iK;#KagzzxYXqR=VbgC-!7I@Pc650`|qFmCQD zhU^o6p@%W0rm^JLS;^MzUYC{ar}#o|$UWm&3dN(M;t?9bW)`!dvewr$tCv<(q{9^p zAvuHVh=?4QD_7bD=(~r7g(>NlAVm=xFWS9QGnwKQ^3 zx|CK|hc#IiOpcdIc1aS1608)MEHy3d9zTV|#{Z za2T#FtY4ZxUbhx(e^H(+?F2EE+OT&>jJWS)nAI76li*g2i(F?%_lq<1Tz8vD*VSKA z3xkT&l3Sv?{r$TY8W4S}p}|FPagc+^8a6$Uo#wE1RplfVmBot|y?NHBUq5XTjlX_f zpJjz0cRK$C*|ojedrMDjSu|hxF<0rs3N)O0*>{`ntMn z_*b_i9EFU#iq4$_>+L;KG=LW8u0zSigB0Q#ez~A*@fawps0cG1wXgR4`9f?b)UZIY zXK&)8x{ddNBrrBjPjvLnARG0Yx^;ZJy}Oa_vYtdJDG4uR)&oK@#GoJBx*txMlc!F-|1yABZ6K`+@?A;iQCq40 zgHXt-JAQ=FlDT#37DCsA)rVA!?_om<7pmp#Y}}V?cnEZtPMkSYc=3O%!?t?(4)@bv zNy7p{gufiCrx0dAr4FCj$!InG(cCNUtLZ#9$Zdn+BsuOLqnIM9Bw?C#2*!d}rt5=&b%si0l%nCEzo=<-My_3ZLV zFQ%xdNHnAP79o`by+tq>jI0N@NOxsZ?Z-u?4DLo;bLiMHA)$xATeMB8@jLpXSC!ih zM^*^K21$p@bLshGnhhzG(P+6aI8pxu%U;6{(oe}^-mT1Ey4OQOEYMLgtHmAVCwy$| zj)sVuDJZAh|01;K@ZNj$crGi@7fylDh%kWT$8o3RLFi|uI3I<%gBb%=SRp$yoZm~Z zvJ-!GL(JH8g(9^_@7}^4s~+%l=qNO8XF|99XM4Lb7f=an)?BoOm^=IAFc@XGfWW`CE<0ZxKs$Mve@g6ZHgTr7-tE*IYvW zGrMelrO+(S-dzVs=WgOISf`W-uP=rb`S>{J1gi<_fY47o;vt2f^7KOuoMoHY$KuGr zgX@&uL;LF$n>h$ChfPe;Z##%#SmJewh8#-CGHAio7%#!#lYH&X(6ymK-bOo2g1G7M zu{tm8T*S?9G$|hgZ3aGdf)t0<9x`c?H&tpW>S|cZfzoZG9XjW3e71b~sf`nmKfqE- zPg+>($7>5;RY&k}#~ z2siHdNm+>syE%XPIfUVtPzO+P$d>JdY?E$SU$m!m>y%@YsEUb8i_$dJ8oRDcaEVH> zJ8Cn$)NBT8qxg5Y$-W#og({C#Ys^kQ)@;}?#lS>Uo`J@~)&tTt%V{3>4})>gpHb*5 zxXA-x$GmsF0pEqG86{F#GG1*yY$Z+->qSF!#=!H=KHTR7l-$g28utZy>fE`M$uz5I zPwThdR3Cb!_8D!Rr*uob`qzx`EcY`Qmb_qkB*85x~U=?gmgduWOK<&FgH2ch#$2kUJ!x7dmK*374yn0Ffx+4|jurfQRlgU>A8(=|& zMkivJT5UmQTGFEJzlF@i99nP$!w{2r1C4zgOoiP=wA9s1g3!yM%ROK7@|02d&7IYT z{!hwtf_r&F&&?dR z3oj(*xSOwYprpYy)8;&|kdP;t>zir^*y+9ZXXwf}$3wp|ivu3bH7Pp$YiEX^Ye~-` z7JC(C_l;TAJO9M&UOkrDnk>3mcReAh*f=RcSJf^dFFLnVLR6H~1^I<-X4R+l@6&V0 zs*Y`DFoUArHNf{tP2(E3Z}#se>Pk;j*nIYwd$&}z51#Wizxgh(EUtDawxVrBr6LSV zN_6YF6Cz!r+ZfyWh)Q(twxO+VZ-!iuGTVvqN*Km2*qpa+Y>T>7DlT+tGQ01#eZ1iQ zE<<9+&+@BTS0bW)%j^BM_d2b419kh?k_@Mh6~`W|zHt70^3X*f=rsDs(+v&(;DUzB zG|R#HCwwo~U9!Y8yYGU`6D!$xM~-EeB_9RlYLlU#yhLVTP-Xf8r!8Av)fu&}QK>9*K}F{f?N}I$9?UrAm7>q3OF$i3p|r>%Y4@$*=FZ7K)#Kcn)e!;;cgUbY zRW;5HS48H)E8kk^&hRhgA1v_v>;}9UPdZ5sUzGyS%n?P4B5psxvd}5dgyynNrcYDx z=ni{^{Qdv;K5NT%su~iVU#mh%KAZ`P7xeUR7))f)A;SJPM(Hbrc_wSVg|Y8Ze_#yG z-SbgV-T*~;2RRj)e+K}%UQM|ug2 z=6jO2o%)#-sLKjVkjkdyiSD1jI~>oHifQ{Z!}8XWZG&VACY*iPW#8vJ-TEoD;hm&< zjx3v*Xb_$7M{@t#D64Y=gsrc@RSuo~sAgl+vk%;6zNQHvocW}_%PXo)OiZ#yd!R0f zA8xWFXsM!E;s9?QTHU`1L{G>1?FNs-25+xFW|ElpAhC8KHS)N`AH%44NZKf=8F2=# zieN+oe9rq#dIe#7Zpz)kKY*8|3$yiwU=Wujq7PmMrvnXZ(#=DyqE-m7K77uRA&5(8 ziwoBu@l5k$)|!%~2?+_ipZu8nj}`#0lP4b;c47vNF>{j(Us%z5KD*o~&T$k8Kv-Vs zOw-J~-01bsOX6+CsGg9&z1JkcCC4ToN+SjBJ8nJ|T*AAYX5T~2aeM36x92TSbc3pW zPu{qL@R)Imw{V;AY2*jLPww-$a@->N-~(Glo3#zl&#NvC_g*dLaZFpkK4@kM;|FFy z@TYta_a1lCtZo9v1W2Z1&(~Q1Y!`3eX|3IRL8dWMgkNl%8fw>WYJ30omttdm&De4! zFd75$F^DS;u8E4U>Ch!tTCF~GW$du#Mof8SM0|aP$&52St-StZZPX5@!_9y05zXp? zg7T^=fQF8OBUReLLxwx_e>;EZ27=MiEDPH#;hc^`dbijc%M1*}vCuy|^$_rgBD}cR z^gy@4PsL6b-aW`oyjcE-={_bs+f48N_y51~*Ol$mW+eCT&d*Q5m?y;Y4>vbWIuX^e zlq-gsr7_4IVLXKTi!RWBpCDJ1o>^T?jlU!%Ni-u)<7fokX*h*v5j1ESIb~}Whrde!{V4N9Z3}Dj(F{;*~>4&|a zpC4xY5dct7F#-Y|R2{D;dkz+X0jga%=Giqe9RT3!>dM7BAT=Ibf$Z$bwMCaYbnEs3KI9E&hcM5mLs4VVMI%kjd-Qm4 zyv?r@yl`rfIar}w5=_}Uiboai>wXT$7g_?s1E8zh`Sodwj};ZeQD@NM)JcsX8mrq_ z*zA0wx}VVwM9>ttS(i$xXZn$=mHWfKSAB1Bm;(DR+zn=C$JklRU~&k9<7dvy=cvKX z3KK7`u(&%u|3%V0n;NALwYqzVxhnAIb8Z-XLs!4Vz+jG(Q&hHfd6>?|jS3(vXdMX3 zei|;ybj*a>$F@jawD)^;+OKSEY^pPNtgP&;SI4uxX|prXlz^r`Jqh#V($U`On%krE z-<*B9r!I6)Y3NUi>h(4@a&XXeZipbaDIGXDP3!`x`?2+%b=?P(oL6B%L2sSG-x=y??TzrRO6E*3q#1R8)<4Ij@4RUw?~v zfmKOMmMkefJ`a23%Gk~Oc`&fi0wAE5;%B$tv~u}{rK8tx*f1k3Pj~ysmuWrneKwr* zDg8Nu+UEn40v4|iCn|F}1wNvc0SQT$SnXQg+t1T3EEK9IlI9Sb%>h0>kJ!fgd_$Co zXjN6BKXFES{=dm`&yd2ivo5}t5~5LlaaqRLwr$$XyPHV?6=dMFlPpJz@T6)tKh6Mk z-VvtY(8482AalQuzYq){nVbJ8x?f^*hP4K5S7abHmZ@QGbqav7(8kLX>n|W6kDZM ztnjnGpDa{A0|)AH{0btLl{ktR#KaQB8m+^LWaV)YRx1AJKNYy77^=>p?nCg%u}3_1 zlX6{1QWos|xum>rYe^DVnQbma6fI>FK{h@5O?b#NZLa>bCq2}e)ahYIi z-kPuz({F&I(5GQT8&l{Ng=HAs%d-CCc2;t-ZNnOvddC2lC*0%989@{-W8^wjR@65( zHliqbz|2x%6Xi;tO0%S6tX-OTD5_<&swBo z4imG4g%@WIRRBqSGlT|R5MSl>(u8<031j8Nz7`BH`i&+3?;7_wv}ekFBzXvRV(;Y3 zH7-xwJ1RdrKVR*mM6`ftBwew#k=?sD=5h_)Jc=gS^mEQ193-^HqLyZHS3Bs?)OibfIVBn8AI`n-jqUhCGc zUq$K`gfl;oKOKc6=fmOiE1{F^J7IMjbG=T4*0jXER)9{JVVzq)hYugVc6bPz+XHKs zA{n9jT&i-<*EH+{o)%`RL?)v2U z-ber#(5Ga;?=JnTmu}wdv8l<`#->CThsvsNRiU9{Ng)8osbBB+1n>ag_SxxO96~}N z%FdJNbB<^+Iu*d`EF`uI7Ib3^0bmwNVLvyEQAQV1+Y`oFq;4v5cu4LgdwAYcJPcs@6FHUJPQbW&^X8(_>mgZ& zyPj*2ZYxBy7Z(RXPynaW3{Yn?voP68^)OLTUQ)qUN&XOB^YMaR+Je^OL;`}o1l6IOx8u|POt zd0A>i2YO(iohQv>uM-T$Y?jO{4uT0HfdF%~7~B;on+eLS+N2M&Mn9r`NZ_88atD+9 zABnyx=lPCDG17Hh!-(XwbS<#8iF$Tna1P>=^13^8^u%Zony*`o^m?*&h(4Bi(Ng2Y ztcMSa65haT(9w}#75ofH4A22FL3<6y=CWQyol8Q2_a7z7F#6OT%sB1PrHib(djG)1 z<@GBI^#RL)H7gLKi7_bxOyhIn|9F04=PfB4wVW6O0cA3L%$SVz$GZIsmZo>N9XD*z zCU@aTg_^3d^nv{koOPFbTxffGw3XJk+yK0zg26E`=p$ku3Sa^|SK~JI5z#}$0`fAd zl_54QqyJ#imyz!I+n)x@8#nM_{|r<9V$=B`QYH1zb+12v9wR4h?SJ8#6c)_Hp-@~}j-7(AQR5xctG4sOOdh3Yc0jE{% z2ALNb&OCe2U(I0z)JW^sjEdbH-zm9INc+57pNP}26QlT`U~Php++d|4^~M3(WCDnO5n|Ozl&v75}{^EPx(3r5Jc=Cu4bP;52-U}U7Yq0 z*ya5>i1)|M)}Ox4*;?l4o=KZDp3R!RlQ;N~zYt6}5-3FihvB%K&=o5s^P0|6ewCb0 zu=)0ypmOZiYmG&$q)Qd^avr<19|83QqBzNpV~X=T#tbCrG>txMr~NZV8#62rSf8Ak zd5n<|;;ME<~2%o@&p_N5Q)X#rrR)q^hJ zi$ah`N9=Y{=j5J&i?vBTC~(Z-;r=QpelTRL(ovrg$}|NfU$aJ9Y^50$dlJt)T?UDb zSruZ|N3*$WQ5PANF1y6QKMu0YgiSPwL{|X?h8Wu+0d`3R%no=M6&X42m`QLBTXp(e zl|4XVLMA?u7@gDt6e<7o=^mH^c8-%;w(!d1f&zbrx#=j#!)k9z2`dfrpK(D*&a+%2 zVq+T=O!Uq#lz;r>iC29)dnb>=(J&ZUlPu4TkCdCqAl4VQoIcS z=s#N<<>T`QNKf!GJ$ufiaZ3qLYv?tjW$v24ZvI|kMUz1PLp?)OrndYjrDt}6VLA$7 zckWSbpq8H*xEQm%u$%>+oPh{$i%u(`$*FN>M|A=(vOkB=(q;7dv+N3_q05J)U47#C z@o6(=?5UkdcuJ42POON`n}q_AF*tau1qyPjy)^iyU5O^#{{e&zjE-d6FAY1%X=~R8 z&J1uXNOPy|I?gTpee}`faSvevEg%)=pB^u{i+(uvXN7@{dg0IqfmW_6~)&-D6g+OXvt6HKdBQrqWRWbv@Y;1dmv0LEdvOY3h2 zEK+xdT=!;ZDgBe^5!LO?jKUGeQ8opAzL1_f5u%{Y%xX>khe0)EkLz+>t2eYb0EwwFP1Do z|2r(_T8y_cgj`(hw|CZ2Z##GHyjH`2CJ;Ti=dWI+-OAKdu(5oVpRc`R$5fC~OtH&h zGN+7sNj>;F_3>j$4*a9{=-ee`&6>V>bA*?y#KxdNeoKk%zDo?tm?GPW^ENJ_RvNJ; zN2W*r{-eFmh`*W{6CLSsZI1nwOr5d~&C}NRzE<=nfgn{wq1mZfC>p8O7**PfwOFVC z#WbBI`B%}8F@{h|sBX^~jH$IMOY??~5S|Pia>UDBPNik&Z*Kxmd}PLdudV$e+Q(QG z9`VkUpaWq$^ykiP&-DaIQPTg((PtBYn7hLck7eq`)+*ofl3Ki}cqq^MQs6RvCNe6D zwuRs-Q47`bLzyyvckQO1gJ+`=p~*%tEdTsDFf0uD%#p=G_c6F|E_qxM6_!s!rQ0%G z)n}%E^Cb2hEW~?sIV?UdZt93m2fFkdCO4uGr*tWtRyeRDxCii@0~`7a6z zDk4|Rs-pEt(xu2v7UV8CiqM00iDgFv3=aP<CJ>ru_IYurrzc4 z@8&r+0-a;5bzC|+PwBLTx6PIxg7=}_0-ID>l5~z*Ep|+pMd!kYj~?mX3jdsMc_qG6 z^eZu^0x24C>+-%?j20v3&$+NrOz!I2MOcuEs@;4zSjTBIlUj}9w~T=xh>VU_qAx_Q z5z~l-W1oFRXxG`8^*TBP5Z(*x%RQvgFflp&-lYq#gLJT&m#`mSG z4cj$geU>bw!>DoNu0}*G9=%4{2x0S5Lqjnp3K{p3<8{G(q@{;>-`G66W$LHj9;eG5 zyBL8*Pf!V+8}rakBUF#sJ`?p2b>R%o0iZ?}sf|wGd{IN-~8GcG)yMJG?Vx)a1!cI z`;V=e!1UHI>1S`=$eN$EQGwuX{13&XiK}FBu)w%ltyK(x? zNL{M7CMMdba$YY61+AZ!S(5Q1^H|R_ROl=0K%4$f~X)J=|!m!U(aDKI2G9+~uL#Cb)wPDc3z&WS^7#3K+ z1+a>w)V-tCwoGI@PWJqr;h~{WrO?-u0H|BXHNvu++S}d zy2{AN_)fMTh7B!nF-8xZprYnS^!HA=b)h#%na0j6TJ!vQV#*fH5=M{x4Cok7)0DK? zPu=m_(h(0$d7<&n)$b99NPVuS%ws73Y9#eFW3}z<#=-ZIpua)xiy>DajS&Gm>DO?i zc+3KHagZ)89j(U9KKy>iU1P=}*?peFo>t_;6&1XqWv`NB0|WQt)`v?J78?9A@84TO z41hM!MGBK6C`330Q7n_Hgd-N6F17VVC~1tGX>QlIQ-t!=`26fzZq`v%YPT`=tpD06 z&d3f%o!06OUnR~f@(k2K(1%<_NA-Y5LmE(%c3{A+IaQXbV<^_lJ?v14iE(}w+#|XF z{jv1=F|?z(5Zb937m$2B%g)ZOZb14VZb@32j`(>vIp&WbnXDY~N1_guJmke=e>EDn zwCJ(W7#JLwaben}=jWO9>`lv{$KJcIza}!D!%jY^^eFIkM7XD`^l|CaHX$9|kpVGJR|kMfY0CSg zx$thL9B1ds#fvjWf2C?pp&E7=^{k+%NYBvFCsJpcn?5px%NfoK0@Q^_gj*-#3`#+& zWt5zbldouj3fJoWvb)YF-Im>z=0$7MMGVK}t-S_0anA$`*>GIaeo|@k9R5t+L*c3A zpXl-0H}-G1&Td62;tf%+*7^=~R?t`Mvr&6|LA%ml^H3L@((qADIrX|mtiYO@8J#dF zvEzp&{}r)qtcEQbvI#{z6=9#lvpd}{d0bf1kJ zK2^E&a}IWKoGl>S^6&NqDqHK7L*wHS6kn7)cbIfTBnaI1C%y;B=)IcVDAZ4#>f?TL z(uOE{d8PIScQ&m7gNo4wo%Xj%Fx7h9X76ij`mwAAU%zZu;SHTO9SwwSlPMv^isj>; z|IdNAr*(iLtmO3aTg~>p-^pCtX)(S)MP~buc0Z>`IS!bdH*K)>$>f2To`0-O*l$cA zRr5;eVOy9X`*Yu2nR#lH{{z?E6SsNQwELg`{#Tt>HGrq_KUnGaKRb^W;`NGje_QJCm_E-I`KD)mWg&u|3UD^E(v> z7_O@X{0C*1ndn3H#bO18A2{ypItK3lG%*p7R1<2~wxC*-M!9=EWRkGC;#-;7=&?9B zr)I>eUA%OJ$jC6$1aUWobq@EZgmr;p#h zeUn)@KBG51Vg`xcX*fWS_^ivPQLu?LIxU&7S~FDD8U>uN)6*rY5go}I+xA!lR#B}2 z?!M5FU0AFk53t-(y}d*zPz4xit!XGm9m8%jv^q?nI??61N5*t%`oo6ny;2ntjWgv!znAJC(Y6D`^{Z3OPc$v~}x z)|FPk54K0RrR2RKk}Zc>WuoZ^P`{^h$!6!8?f$%K_};P%Dbg@pq(tjDDPsy-It!|u z|30%{#*8GZcBcfS7k-a2kPh-1~A-ZHN(&WI6XYXm~fsM zQtEdp?J^!cn%k+3fq{Y2+O%E`-6e>zqZAZ8A4W$;3QCE&)H|mC@m200ExH9^o!q`58zF)XY-3EGR zqHdsktrHR9eCaAr<8Slmv3K3>`h+`kUqThPk z^)t%v-#TW5<;<2WRZ-(}JP;0^MT<^&$qUW}#vJKn{>Qui>@irhXi?33ncV#RZA(&n z{;2sr#jWY~%y{r3qHb01(-DXM{Bw0xVJzkRH?3daw9u6G+r^+MnU=r`o=adv z(q76}FFN@P$u5x7|A{=9Y^MFQvT`GzAt*?N%}Zx~ zfSZ>82;>UpuP~Jm>I+4rfDJ`O0fB*&>U-44daje<$sMio$Q zreas)=mWbzr<25-@d(?JlLmRPk>p6&O#Oj+ei%=dTF1A|1P*J7eWj9ixBd45Emf^^ zz1TWtzRd3x9#dw|N_aQ(EM3X@Ec)=_@B=Z*>(>>{w4Jgj>9fp+0eo?9d8xnW##w8X zWPOmZ7M-!rVx|JC979`uqvS|O-gl16@hAA6nd1O3ah-G_s?l?CZ?GZ^9F(ZC>2y9L zwJC1O2?9=|=3)~ehn;j`o+OI|z1|Vjv(ds`8gv+z6u4JZHhm~e73xCaI5vzIR)$U_?Yp8iFqCGgtQ*t}fd?C@;osvKE(vuEF- zkI{&Ujhf$B{QN&YE{K)8Y!!Yq?(^lYb=xq71`ef6NcESfb_vWSTTXl7f-dQq#Z0V~ zel*c%*&qA&_k@x_tQvmEjsp?&7{zqKcP86hs#ZO%~`rM+vz3DoZ9hbPcxb|X+plTEb^eZV|DNDmNpLee-P1Zjf@x)UV!Glo`XaJ ze<}DuH`WnmE6O*RJO$22NkU*j3D%DbtQAfuj&FiUL0i1x#pS+hwGb`KvHFsOz$K(m z5L{0~JDITt3ob8hbZOh0WfrG54$v5e!q5`An51P2cFz_w02O>x{~NAgP#z!QbN%Q-vt<1JeF|4{p(B*u~`cL3!r7$Osq4gl}+t~Ea9ByBpKrF~+$@91rYkqO4=w&ZQ{CuWQ$ zoVS$R)?eJvYKa^;?&NTVPtJH&6Kk56aE=F!U+D_PGZO+Py35670ZmYlqi6RH!r=-TotGMu`8_Be65B-y1tw^>~$?U3_eB`PM5N z*RQwktp9Y_=6{9u(Z>;`-ew4 ziId^{`8G(vCZBC|DXaZ8O}`#g8`>E6FQl(}=AG@2 zS05TX8RS#}bY`oa9bPs=s$2zn8$J#qvLE*~wT8oU@@X}lOa35u=J{WJ!dz+dJGuBMSt!g~;i=`Pz^tOzK*s0yF)Z(rtSGQb_cA@G1{%Uqq+?6nd!=92 zCfdqprncdH&!nW_yhX`6H07*-3Tm!{IIBIOwkn9w0<12uJ-UcrNkxZ^uJU-_!z!u8 zOi(x|&z!cxr8XcXVF2*+qdWx{JR@=1-~DF^Xp;xc^}2a-WZDSk}Xacj`+@c&ZA5idlj zvvzprQCmN>A}iT=?N)QCb1sBgBZgLxEXS__-&g{HX)14beEjgiy6H$L6>XOv_S{Y% zp0AU@G`LiX6U&5$gj814e7Yh}j_d6^y2s`V70-a{Qym*LHQRJ^v7C~GO5@tP+MvVT z4GfG5wIHv)Bu}i$vD(37ugx5WSoW6hvnVt%w1}g&eLR+Q+TF>vKsN`tn^;nf&-pEw z`M_d8me&H56L0WHhw^hb9`!)6B-|=88AHQA5;Bf*bA@d!xj3&s3aZ4%kJqqpWs9Nt z1x{v~%&p>wUBcHSwvqU8C_X55(P__VF5x!XR=HzjgHn_x$sRVlk$Z{%-160H zj3itT#qT;&n4EAy{J=fvrJ=;((lDKhiY0YSCqwB|)s_Xr9s>7>1&KaPMpwYTQu#8! z!+O-}+z!#9FI4Pg&@?A~q7RMT2uV7XTR2qN)Oo&Di>S;VlzWvFy1$kOXk>JjqkrbO>U*V8 zi*nXKt@#8p`alpthtPs+30;qx%#29Q%`N?6UwiJ40bCuDy;nOZrH|JI;0-ZSTsrZ|+5c6;+=4*=HkPuU7DOJ%vqP z#si!fv8e;ev*CFzU4V^Rx_&pPema5noY1h`!@5VaD=%0tBkgF55u1S90~g;?yl~$lrpD!@ey1~(BnHoF?84cHVAvqSw3z^HJKo`}=!f;E!B!$-q2McC+(1&V4wW5?? zs$9D4+KWJayHek*jE~5vwslfHN$(AhPbd1gaPk@d#`$>@WwC?5#_ih)?OK#MVBo+t zFb=Tdjb6GfK}rjGCqWKezUdeC@4PJmOA}WA{+}Jl==e!8vqwlKN|UQLg@!+MA)(Vs zP+DH&erJISeVymxLsdm88jqfap)EOrW@f!{#|YPYVfohsrHTp(3Lau6R zwoCX1gu^}7k48AtOxhlT z%09#D%xm&9=x;{%%Qp4N!F^ zDtWtOrUH>Tb24aweTadYp0%cVx8yvqt)7!Q4V z2@s$=ite)Op|Y8%JGl|;B8Tj8cPDkI(;h6R!n*Qi~bb z_IbA@)ASUed&5(DEo^u)j$;v8hzz#AWwt9DI@>H5{1^!tx)Jsfb(1MUcv2*h>}f-G zDra+{yZtd=-^bXn$JDo|yEQjA>mk>Saes|DBXMsKq7)1Ozsh8f@>wNy!6XQ2~BRe3uve7n*QpYfP%j@!S+{OoQ2dCrXU`;9m9HX_SSox3j{6QCEVYY&zC#pBJ7-ae z&GAsUbm%tqI`OGTPn_6i7$~4q_`unW<@j^**?{ZUQv+^?gd6~z`x2+vk`Xt~b0=in zIsEE&i{{NaQ+`KaHfz?b?l&DB9KJl(PT`34)oEqSy~_=zxZRRO3WBHJ*L?egv!m_R z7)ww&e(r<|^M-L!XUsMMyuY~^sA21p^0SvNnU80>Q}1Txv{(X@U}!V0-QYA|a`?O* zXSjV^uJHMGnRAN8s=LcpR@kCNLz(w^Yk57(BDye9`;&LYC?vK|h`iH-bj)b0PDIL+(qkW|WJ^)G2-YK$f8N(S) zkjsvo5A}nw+rlDEd>0pM$q|16u_JVN%+|4NAWU zHTkc^*2z(hK6$)@cV)ptSl60n*2iBjQG`&v89y-Rj^+1tY4AimD~(Li&7u5Mj= zkD0hl$i(Z$*A8EkmRJuVf0$LV;pLU!_HAq`wQGsSE7`7|^Z3>!h(vB1{!30Trm`zG zom{n!p+R#z#M-v@djBCqTG9fV1T%7PNz++*1G6^e%)fP*ITy@qD5xA2KGw`(*rwBz zl}OP}M$@7{#5ro`9!6>Je*0HM6b^i!rKPhaj1xAZ?CCpWHW_)GuhG8EITPm(^wcr- z`|r`6+#D+24Q2kIk1$&z@%qUT3LTYeR*#)iLFI zNC&mC+izsOkBW6}WT^uGj^GQ;(c8)xZO2M;z}?Rk6-VuwpQKX-^oRaq59e!b$urjh zW7)en#I}F!Z$Xeo=H}|pmyZNF7KoYyGIHs)l}10H$-)C2P(v}^<*wVhZ@ME!9AVnx zjWz?=4oEWeZhT94v3#um-YT7!6L*YxYGuVpUl}|@qx_R&C$$8&_5=~`T+qGAfTeR6 zC2HNEZ^yQF{D&NQllAGrxF$`){YbAEZQi|xp>8x8-92j#|A|fd*GCzTY@FWf zMUK^kS0BQaVx@dzQE1eVb7IKiK?Y-K^qVBzoor&YBId#T4es?~r?eQQG*c2R{`iAZ z^xUgYpqSbm1ZugsLN{@)UE!eqxk|a5b`J{kB zx0LX(lWe z0wl|I@jl!O>La^bDaWY3^!D_;rIDXV`Xl)v+tzb~7ZCV?f&TA=F2}I)9!Sv!8);^+ zjN^-bL{xz4VNdR9rTn^&esvSp2(-=1fP*o&0q*LnPcBHcz zQ8#;-d`f@C;*XZA^^cAuVkTht6kG^^D4ai-vym#Y9R3D^`PPM(~ZQiRH z!9#DumTx1oCF}LB0SLN#>*{tyPY0_v*YE2U2>?b5AuCBTG}^Y!x1AiEjN(TkL^-Jl zszHC9Oo1#dCl_4go0Va{&MUWQh1!k1cBQ$6kLF2apW2Fghbr#wjqGYxi zOqk$^r4hmbq@9A%+OQqKNBF*G--pe9yHV-hcpjuoTy`cg?YO>cOwyWpKydNzPK1rW z^`8Li%y|_iub!9$zZkquZ=IQ0W0~(})9rVzLI>a5j);~=B^#1V3$Aqc!tiEsuz5l| z$))<+TEZ0&9qpsd_YUr?Y;z#fyEv0@@Jp{Ag`LT|F zuD2aBmbH>^|gEW!@!DT_BA zXsm|8;?mm4m=fv^UxU~|Lob;GcOp5Tc)H{9wP)yYINKU_nF!*TNB@@MvUzU zqhuY$l%I23?-K?vsLPx6SG&|-nAg83{zlM=AI$%Z&C1xn%g^FNBAO^WgB@lwwV4|f z5)w!V0H*?3EX>q}R)S4c#YnpweAofJLMgfcbTE(-kjGg@O@uO(6s25f3&B{YC zH%dwvgn^*VPQXOvnk|qnNNJm!o6ELG4m=ScgFR2ss}1p|zzCy1YYJkMwr*`jAPi$Lrc)FH+dY zT+W+sYnpw>dL;7VX(d{p4=htLJo_xdsU*XrJyyoSMwKW~?yo+xk{d1ckDcJvv@zV= z%9m=l@>MchdOz6&_JOKF@lxz3%6US64`&wN@)>KMVyo|swBaT+i{blOmf#*;6@5^I z$=K6!vwbBo4rh-U24;B-tLrsXImui{W@t!LAyvb;AD<0SJol8v|GF56*am0RV;^ zk5Zv+r8Ocpj;HW7mG5cnEI-sjAV)O6UYS5U^ZY>NyvBtnrwG=e6UGf36TRf^<=y-B zpgbkN0P2nfn)9-ELw~gB*HLo&GeDK(o`+y@%am=4{lI`^c)7UtXh=le3|)^(3Mrm| zVgi-4bJN&M6(oPNpOy*Ng{S7pan6zP7u|N?6hCvU@6{pttF_c5>R#xB=29oHbw@7U zRqioD_b#*&62e0}QaB$Y{AQRNncy$WdUGwKF$MB8F6K5@y>1>+Ia6CxBgEL(o567_ zm>n#A>iP<1>2O+JRkomFmR#X;aZ4N>_2}Fz*TqyNba)uL%nE#(;swd31FcJ-0LIb> zm1d8keC>CW@d(Gsvg-Gt?4WZ-Yp^#~(zz=ZYxT_$Ck=P3fo4pdzB~&;!QLR)|8>%d zyStii&mB0k*L~z1Wh5SEWhJ4c4OI>G-MIf`jBvSS zT%`A&sGfIMvU!`=bRC^uP(0pgNnVy5u7yocX#QzN<9!Hv9iBVIu7#M5vagTrwr5$w7YkWHB2zti!Wi5Q3Yb=pa>8KA{O z)AF-u0HiN)H=M+)ug=}O;vSP`mEY@ZJ&mDpD&g+(YZ&zjjD~gvL!diE@gXgs89Olx8`m3c1+u8 zv9rtZ-rK!rHR8)Qc|NObZDy^zZP%1B+C2{Jj#DdruioPEZM!}FQnU-JqN?n4Eixy< zd{dc}f3MK6j%xj7;h4YjED%zv>r64}+Ya~NRdNDRR#1vd-AIo%($A4leKgZo0rz6lKzMbLvoKP1b^SZ5 z`pKEY=atH9+1U%N9s7Jkr4y&M%(0$29E;)$i_gzBYP%nC9-l>A9e`&!wk=V}O0tUKH#jtHnR zzH)QIF8FK|CTjueWHbOg(rBfq$?=toliD_iW(#;1TT-`X<;u7K=V(PU4ob`gIM)Q1 zp6m9+lluf&dB4GfyKWA28ds91bLnNLQ0I5s;R@l>jI;FyCqKDFFYu1*Lo+k zM)zcB3x}~-O{>S{pmWE1NPoHp>8)^Zz`7zQB{+NVZTtOXFx_L96fk4<0n5fB@2qx~%~N z@?uyXl=O`gW@yFhv<~rD1ng;rdC|(Xc8P;7w3CcP;;}%{^zYRK1@t1OymEGQdzIl; zbrPH#M6nO?uoUCDWWrUq3cq9`>97bJm?U5fr7f8T5CtS!?_#KyQ6u|XGywgcnqONe z2OtJxi&b22VlzOP=hrrwC{-Ubk zsC8_rJz2oQ(!jgsE^F4A94v15hnz1)XtX7+H}?DeAsnASYF@>@qehUq9MG(satx|W z*n3CY&O9ZwPorwbH%F#)mE3<+6m;!{v)eE~@lOgh=#cv4fZZp2>46??NNn4~E)D&J z`;5zpx_^146>XJ9Jh%8YTErffJ4=nXYzZ|O)z2}k{nC7bBqi4ugD->?ac)Qx3fg^@ zW08|VC|5xbI6Om1YoSj0p4U+8ng-av)$fRe3^JI3f<5WBvU#GWb!^88K%-clQEkl2 zEo_a7LxP={EX#tEO2{&2w0EOT3n-4n`4r(?8y3B3de?$79V8o~d=$Wi@`nbKw}%{} zRfx%el6_1&>fg(d+x*-b%pPs=l$dfVq{a*v=LV;nM4n+-^bYR%uej4*Yv05j-LJi9 z6V~!BkcsqJ%k~5;+Oqn@+Rp9UD>-ec6=B8Ao9&_35p0WzoKY0#QBv1$G)Bra1q8#- z&+qKu=BtNyu0|JdE{VKXq4SU}kGzppQC{xRMhS!PsleLzmdd45rAou;Kq{HtcGN$A zke-5AJdUj)yZ*U1!D&R#J)-0Kj-R4x^QkvZL;OZ>`vb^Sh^8k`yzCrNuE@Y_dQk&H z%sDo2Er##g36XEK{Rs<}lr#Ed!!FYuJKrmx2X5Dnfq;gRXDeGPZR^a8?^t53DKQwF9$mpy^08L)W6 zprZt8Zm7A^(0OQj9=aRX9|^8g%Vho#LP9#8(#5IqbNQ|erx#Hr)qo&CJOb~QTS(FP zgL|fR)pf>s$xsB42+|CDlzB+hHnWt1-M!iPeYAZ8K}RTB{HAGWQXs56Y&_ zuU>!M^*!f7C5VSih7Q5-xqg`-!po_izJm_bX1rjZyQ^Wv?6}^|P zt~ZJ@#EUs)U#pt`t1BCWNVPF=JY9k)ImvVSqVjQJ#zup@Xot3HCvUQ!uwYcbi`-^Ru$D z#-40G4#BEFGp%t-O5(!Y?q)ELk9~9xLEN|?@YDOcz{F(L&BYRcC=V(A{Dr&`FyQL? zF1|shTuyR2x72IqFcK8PG(Y>z$Nk-i{F>KgQtkzWB^$hK2%DN`l}&Wz$$4#pqNAN2 zCkE*S&gv^NVcrvXsC8YZH%!~5CWwc0!G>AFPvfpe8OdWcSZOdmYi^W2{Y4|?e&*d|miTA%gUv8O2Phntl5|d=om92q6jH=yhi0`aD&&?V^_d@Zm!oA|^r;X5Uu%SJnSH z2OU?-TbxUw$gNP@O7!flTN$SB&Mppl7o=ZzA!o#%kKZ5d>grEAjq;wxxu0irQgCCl z{z?-kZ;g?A&b-sXo-^G7GQ3ernIT*f2`Qn3Q8d%lLst)TixaD`51$<kyWDJsV;3TSRq-HMh zc>ux{%p?^l$Gp`UZ8?IF!6F!m1FRW)xy#sGi5L}`KF5T{N4qQ|W8?D|E+oELcq9q3 zslMd$xhLTwE9XcO-yBWRar8b0trBq5!_c8US1658Zty#fL__8xaFIjCG!M;qOm8$2 zfRSpi5SwGZ1TiHwKRo3V5bk@9(C(-$F~18+17egD6T~g&L2MPdgpy@R0ee{I&9;P9 z*GB$w%wj~%*b^B};nm2}@+2NvTVH_(oNm2WAz5q7Cv z`+7X&Wz3JU1(sP1a*D4F%%15|-gZOf%>mf;q+;;W)r&a#;un_uj}KGyJ#-cA+YPUp zM>CIccrZ#d)}(irov&WL6!mCPIa3X%(m9CI;n-94Qs)#;YGWDV?hvZDWR3}lkn`YT z($cmc>x*i5l&H5^Xuji|PXaHTp4Z=jcLZWNj-#LGy`5-TikykO+6^n|3x@B(iB9jB z5#y|f5hyyp>aI#%)PWZp*W#VXj&?W-&CRhVV-)AE+VJ+?K1-wN0*A1%(*sJl1N!vq zCs8)#BoL8I*1wI?KWOsjR-MLW{x;^SdFVKcMp2~93jZ!L3!U%t`?do(G4eKDuk(HC zj{b7M6eZjUJ`v33lJG+g_b+%&DPQh_fzv-B!JYEIJndBd*Mnw72VVd<1EQ(fZu!88AxTTT zHBx(Mfu>fySg9pgx97sEi$hujo{X`;Dk}yQsku>_ii#DrRx;}swp%J-3=b-5hSs1E z<87N&JpiDyFS+@O3s_u#sncJ|v0oLHhuGyVJK(2+6KdVaJ0Vt&OYhRcYmL>KPUmj* z;Va;Ks791Ak`Nm{PY-3K8NJ(5lL3FV>C~xc-h;IxWriRZ+?_iUBsH+Cs~4(Fq_ln8 z8ThP-f4ccyli&ZN8PY-GJ1CumdjRa9i+CW$VddLI0{)z(h^aq*qYqmM7vdY!6bAy3 z*r$!ybNeqn zPf87G7t`#Q42ysP=7)^>`mf*f^Xsd8?)DuFH7_orOwUCmJdZ7xY+K!PGjmwv2oU+X1z<2-@bgEHfI z^uj4C>@l-Nd>Liw>dO@GuFhX)D{xwu+U&Z2)LR2-%c^Yv-v4Srv{3Jg^ZlZf8>(YrK~&E@hVzng@aqP1`qCs4q*P#|%m)iRecBB$!v04+juZ#v zMZhj^kfxn&(RhHTp-WBLskbCP(+N=j6c$_GLMbRzhEg#T!(?Mg$H&IXXT2Kl8}G=k zM2FQ8-s)^7gLFEa=alhCT?U{LOSmq z0o}(#M3LAgL6B%=wrr`m8oJ4J{T|;z-8T$StRNsuQWzm}<#r-Z!M2m{?tt3$%+D>k z{@}AU;TI|T4P&@*h7&ynP2hgLF?xyu4pTG;YJe~NcvN&KX{XejopXT%I6Q8CG%pCT z7e?C;h3&6m41{mma+P?R5sJ=H#EDWcm5v;_rB4hqiI^bU zcs5!x4P4!vH*;sto050dUJ8cZAV?Lc~;AQ`lk?(h_xAKopDe+%@oH?^Dgb? zUzj(B(ZVA77x_GqLhiMjK$->((y092Ow3ghafy_ol z$F-XvY4kc%*`X2_0Mdg(glvO8Il73>=3JPFRDReA(eUBy%g+~57&Byc#OC1;^QN){s%~><{iPeU{%ydzI{h~L^WiVdLI9ma)F*r^yNB(MH7h%&An;QMDfny0Bm}_$u_9QFtvYs0 zpicNs(ZZa<8(BT?*#8PfLD5NQVmUh2QOTo=KYSpp+IPo}MwWRoGw_Y!y_$3STu8`_ z{tnOc@`flGg8?vJW-Vi8e`djkkMd0!SGyk>u_TG~?Hdt%=Nm24h3G$mw-=GuBg0ka zIJB=ee}w!~=84JZO1v9aUghJV=e!IGa))xKGGLsVO{ZUf+#lki>FN4qt68!A^~E7F zc!5{YLSytqWOuNRD4*q%F|wEy9q+H7KZt9U#%JiJmjeNxB_GfAdwe%vlUwOveZmOJ zRl-Za6eLqBh_bEE*RPM?plpdiM=%Kv1*w%qC&e+xNrCnioLfT2uQT7cU#pQLNA7*L zo*|GcZ!V^X9z((idmmXm?j+3(L;)1uNN^tu+$A^xhq*gV&rhwg*<(r!*V=H`Ek4C= z0c-A-xi&a*1EMIW<7>IZ>@kHKFsO`J7VnM(eNgH`4NI^Ju%f^H+a~DhWF=x*G*`l zW2366s{_!uvpghYrj?eR?w=`KBmfMQReS}yrt(7X6_4Df5yAm&ESR02p8Ne(nyhf? zEBFL7tCDuWr44h>A`DcphLdES3B`rWk5oc2h$9&j$sy<|_z)v*&&`cX_2=vJ(8mYA z5TPbTvt-m#*2XKZd|-evQO~Y)4bNI^+QuoH;1a}IO>>2}!DvF8tW(tc?lxLF6iq|* zYn~lCH>a6D&X1MYFKB#!f}ySt<`T_yWRuoHiUW#q>9 zawv5l+su3dBcb~Paf$tBRi{jIyNK@Ja#Hj1QYey#s;NrKqKxW670}#KomSu~Z5vWp z@j-zq6%siz_~?+jx;hvgNouBuJ$ItaB-oQTDu%qieY@jXLrTOY{iUjEO7M#_?la#b?I`4D(5zlk=Hb zYwv-CmX5YFGBhOGqo=<9DY!Bq26P|YnFZ)){Qfg*JcDh=_)44MfR5Z*qe6aM#kI-) zt4HW=0~F*?wU-0>I3jND#W{BgQkundQI5agP%h2s?}-YkgIY~-#I{dfbBj)X!GzuW zcBR&hGiHbh0n31~!2Yjqa-s}+w$|CnE?eo5d%mUq0opdCKNYD}kIY)@pf|EIF(I*b>9Vlc8G)B( zXl@E^IJ@=Px+wF8a3|lA>yJvW*Tq_Rmt5JDS9*D7lfPb$tIfXBsAevMZQNN%fYyTItN+j+7cJFrZ=b$nC-?`V#PflYaZOc zKW)MnJOUE&Vr6C5sa-hF9d(IOqhGLha&~g=Ese0AFm7p^cJ1y_uH162)#1RWLK~U9 z+-^$XoG%DlTe_j4JaoZ7mO}%%9q7}HTqV`pz5R2$`B3puVL||P4ePo4vo&*jB$^L2 zS`dW|DF7wYU0mw-jwmas{{Hrv=fI^;Q> zhA-K99!Vg$)xnGRP7DBOkmC|GQ18;O`?jAa@RN7u2j|UQQWc#g&(!4E79T-1`gpcHBkb0dAmS* zYLyP5FwUtLWfU0oHc8jwrXVJ`wXXXf_ll_I{I+1x%84HXC z_tk3E%*4=;R!L7wdyBGyqpgK&ldC^cx`h^7RmT>(K6d-&T7SG`@RH*Cu!ivH8M&65 zj#k~OS-o2S!Q^pI>a7-7*j%nzdh?d{^3{{i9oF5yv(Kw6n~Cs}Zwb|6v$d{=t2?+kXPET}<0??v2Zj%+MFv zdjhho+kfahC~NwbtV>yM*5AxDP1+Lyat|I7_q6xfO6|6>GoXk)4M)7q@6go}xi=4u zQm);Hipokavyel-8wYjSyr-;=jGu_+FQfAFwQmgB8&aIOFg^BF&ZgDVMrY0qegR(R zK3^k$5{{3;!bz^KvGLAmjaY&Fq$#~jvH=}PXyaW@@l^K+b-v7g-9P#4lv4-zeIQZ% zb5_d4to-6npSpYrof={y7c|Z4>g{hpXm1ncAphmzfEPi$YAiwfn_dgst4uT{VFe8Ko5oofX25sGKcb zu)4|RN4wHjf3fiQ&flC@_OdSAbM8^?&Ih`NxTz)DN84&ernK)e(?9-JaPFX>iU z3r#X|2DFT~^Lca7aX~_Xb^fHC|AxqRwKR12zmwMfhVNRo{Qu<5xc~q1W(>%i`IpE0 zN0RW%8%=?&`ytjR3nRJ{(X8|*f4g*zatBdB0HHthiJc2@ngFeEkdb%MNs@C-J0tHL;;aV)KzjC5TCM8H`Tea=JtPMQ)pwhd5 zdb!5HorEhVTTcOF#Tp1j(Tfq%{k+s<$`INSx@d=rzbL>Dpi6cL?Y>`+sh(K%A(6Lk zyBr=ChSznFl`X)aa3>h>5Gnm9w{CosX3e(v?7jK#z~jQ4yUwe|9CTp4Qz{yRst5y= z_P*E}!UQj^+0tcQ$Wly$h}0>iE`QM1EL{kq{Wf<1EAEr61R+vUZLB?2kCEg_jd@gh1& z@Ar;~IDp(eb&dG)B8R3)l`<#Sd4W6~^zK$MJ!k*~cnm#C;g90}7l+Vu+#bB1M4#Vl z@7b$YP$g2~Ai$gk<$xz<+(hJrIO$~CA&-ML_SvUzG>9;DgnUZ&M!a$)t)m3)b8}Fp z3Yz!&^=T(H)(VG;L&a6loq`#I5lo)~n1=uqh>~)zMcvWfGwu@3A7Igw+k5zk5s5w; z;Bbaly!EhjoF*7Dci_K7Pxo}R*Y2}K7ZYw-h)CqEV_t1nG+c78f7ItE&K&!#9U3a4 z-k$e6{S5_!M1(?Oh?rri^6aHlqS2L^o66tmRR*u9+j#G^BR>qXPO{;6#K(ZnMt%iG zTkiB_5>^dKdOUt$l;E0&8t?AG-@bS6o;8CG#?^hDOXY`|Y@(Ujy9kx>N_R9^)1;9R z;bMJ9AGhY;I$he^Y;U7>&(0{N##T`jj zZI35U!x@#ZU;(7yV{%ToNd@%kx9}9<7{C$+SyRW%X!rc(OOF#L5?P>}GEQ~hUbRR( z056Xiq4@I9>u3TIEm6?)h*@6#YVvYj-%dd3mP2cc3=QI4EMk;sl_2XNB3$< zFaojxGa`h=f4}in(N;Pv!L$)-7hm4I4s`Zma}foXHTEDGrFgOKDgQ zP@7$xVYdc(auy5<`2o9Vsc1$cLBaCKr`xZ1i6Ltw!12qM0HTcPyI?k!J?R{?gl24+ za`T+qEje8g+fs8xKKD9u#8h|HSIeBp!r5m|M@40A81Z}|>aNzz5@}bw?VrxgT?bVN zIuwn}u4`I8sxB=WdWy&-d;16jpFx`K(BTjNGnN{iRg329cQTY|u)$~mi6sLM2m%&^ zQpk5_om{j`p4gwbW))TPW1bZl+73k(^~+XTYBGF=+aTV*8;W2!(}zCpP+EJinDJ+E zn`rPUI5KE(75Bs}u|L@pqLi@hZU|1wY*L>+yTh9+NTyCZc>LdsjY}y;(9-3 z?Xe6O8Xzu7pe0}P$7*S{A{heWU*cc_D`}8uzeFX)89(PWDe<45=#@>)UrHVSo~VWc zF!A6soC$VatR-)W1fRY1nT!P_u z^<0Lks_H`@m|T$+a7NMqRx>nb%C>_MV97nKY%cKnz-C#@f5Te3ZygVy(%hH!?mb0a zz|?kQ*1wMmN^k=B<4i-RLSN(es0}$-xcx;10H8l7HQRPvmRUnpWo6`ygZtN5TOX#_ z2gwlS9`-4;SuYCvALqiv+EkeA;pXNxyH8UPm}9$FpzZ*e<*eMy{B;F{KxJRd-U-D^ zxy^V2l7*JVAT?b6e?{bJH3c4QB@#01l-`2}v}+2|^fyYJen1_+J;=B1@%xs|E~_Xh z39o2aVixLfZ=#&ybK}SoG4fG9aFG=W*>xs8lWpmT>-+JWkuJP0(ze$UEbFt(c&!6uZ?KmA) zOC}>8->D2t z_~2C(LtOACmlg_p=W7_2o-)1;j@8%fW9CD}gL&Jyp~MNxu}7dE3rB4I+!vH5Vp$X@ z7yqU?T5;F<_pV-f_rm`J7)%?Z?%AfVGukNiP%4u;2x=lQ3GVBtiCQ{_3u|&A`kAsW5Ui~R zQ&0f6ObeJU(uupAagZtPM1yzBq2l~=U0+zDr_Y}8TaFJ}Z`NR6x(?Wxl2RtnN~{HA zy$!c)(KZQg5ADEA6uMic8=ZOeiCky9rs@}8GH)d4eQ6emGu0FV%B!voF61gLys^HukXXZq?;mYV z@V~^b&ULu)Oqgi)EETR)c7Xc{?*}@yeX3D(`<+WWNFwc&F^UrLUb^wjc;7OEZ8hFZ zX=FG9skCFXzAhR;k=D=6b%<(<76&&fH`sT9*7<)6zw88g^lNS|2BrXK2^yX0&-pyZ z@3Y>C7Y<0=K=lPlq!19z9H_fxc7$fPj~+n-nldQhTzNAzh>~r>?MgJEd|Zei@yWpq zkw-2XKgKzcPcr#CtsLbO8#P8wo@rDUZF9=o{tw`IodB);{V zhjGx+ZwIfGl~=p;k?4U%*T7RlL))U2_Po>-D>}3*9*f6jq0e(OGMcD{Ec|lLHa2mM zje{zt=eC_X^|LyE>C$7<`SCf7l^Ejr;b@diVN=u`|4Xjy{%cjgBYo}nO4}%k_Lubt zXLIV~x+S7*cmkOV62t?#rMi570m5EFx*3fUPZhb43y%FS>l_i)q2s%+CXdnRH(SBr zP7s?(!kfUw1>2Qb3OsjG1Q3jfHHdW}bEecQS3)hUrjAT41YT=w5IANJi#(mt9nlWi z&Q!cz`}|BmeR*ZYA=o~N{zKH&)vA?V2Lg;*Y`a*3rHt#N(TB1!yK1LQm8S(=_U6uz z;RmFomA^AZg!9F=r+&fLXLR!BbGMNCRg7*)n12&!*1+sLQvSU zM|2ep3h(~UI`+$(C}?F3e@L^kCy>$$2N`jYq9H&f~v(Z`+|q9SFWF2fW|ey zU8}G2ptm8>0jiHkf{|Ff)YYeB3PkAMRp-0KlG$2wJ`YBJB-{r7Ei(%4BLYd1CN^$5 z@nYQlP`DMeV#G2|BJ7oWOUOiwVnlcROc~qBB#(amngGZQd%BhgxN-z|4}B7r0Ut#t zhM;06=cCzpOwV8-c7SLH$t{FA^fc>O#vH)HcP9xhuCW7Jz`8{kD<~}+EC6X_YHDih zL%W_CPMfxQl#$)Y%C&P#cawrNbZBeqZnKo=>W|d>9Xqz>RYl2`Z~lxU4IF(ac)ZOzmcPa|rAy!b!2 zwust(2=>d^=eeV!BM=^??y-Y>s_Z{juKXpz4(QPDMcl8ip;K} zX+sKywFr(vD0AqXytN@9Q=HiYyV%T8+$mH!upoq)f0nWu=c8 z(a7Nap#gG2JG#mwo(>(%bnl)p3D(e2D=Ttb0bS0V3A^>8r|sP#U0Y2x)o$Mr%HAZO z|00FEqreTjt`gA#EmFDJ%D!4USYrvEnGPThvw*T{xU5{~s{0!BBy zzEp-Zvrbcd1{`{@Q>oc;+#(eFyWQQnKW7r9B0~H}Kx;WMxs{S`ti%IJL5rf8othKm`HPh z$mAb6NqBgb^Rl#MXP@nlG>&mHDYwV|!o+Pi=wPpbi++1?%6bMrzo;47JY1n@SE#@v0g*%y8|7U0U-i;%EAgfo z)8;sk`83tgQ1TR!*o$ug>+rIM%`3PT5v?%xdS9_ihR-aUZHt2A@!8 z!-NYCNj(x<^Wq9?A=LugxP(}sH#XqUP}m4)DV#s_K8L{lpRz>cJ9VzwzfnOF$x7eN z*=CU2JdTSPL2-Wu`@F?t;c2J%Ikx^)!*80JrjHv*Y!o-wE(UO*tsiW3FT1%Ia7ld7 zoRtkd&WIb~wHd@(=q&$$pF=uXs8%bh1alqPjDXz&YI1!`9fsgGJf&p4bC<&7=EW

l{dm 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 literal 0 HcmV?d00001 diff --git a/screenshots/setting_1.png b/screenshots/setting_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d37c658d03d20e85d14d0ff175204efb3cc62f1b GIT binary patch literal 183353 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ξ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 H^XvZuvE&S+ literal 0 HcmV?d00001 diff --git a/screenshots/setting_2.png b/screenshots/setting_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f10beee4287129b9310998d2ea4d2cc36ac28b6a GIT binary patch literal 181271 zcmce-cU;qF^frvOYTa!`uprP@WQc%PNCX5dR52h!KxQBc3WOkkKVOue_ibLVRF0U~uVS#j{ zT|fPJ`oYf^_ddVZ-~X#m<%oA9S>LUPG3VYxLM_g9&UG@l;TKxNdYBw7X7_^gosEpl zU-p9e{a^nXe2{Ta?C2ZPp6!vZ#2*w(zFa9`_&5L1c8lHpuI~;gOVwO?6t-)-rO?;= z{BtFZi1^)W-==IKJ$(A2o5nq=o}hEb_LtU&;dUK;8f88L!FGe#fuoRPQG2DjsvqHH zwwvx{x4OMPbFs2MbgA;&V;1b;D}_5Wa!QWqOMZLq?XL7)*JGnrdOz~J*S@tq@pxep zemLrQ*J%56*#ESC=~H5coyqkWPNCi5%O0*Jep}SBLs5=7m^zH^bzHt5a%gI;QUZVO z+Z3jTJdZTn;Dd)sDtCzEqIAABJ6M#EIvp^R*W>)W{XOY?8uEs#A(uP)g|+qwPZ;EQUKz3w1FXn`Q-_dYl%-M-ji;oN8)^_FT; zTD{@5y*Q=R>iSuoM{CVU%K5nLUt2md!(p>?5+JP0dVqhuM~s4EZe*?t0NSKt$446TF=_^<6hrw zf6WkC80Ji`!)j4ZM;hxAK~D;$KD5WiSWk}_)iigPJ z>U56UkVBq>`#Z@&L7ge}u8B8aeB*kFZ>u&np7>X`Gqj~! zHORThn#D_QFdMRyo(wIt>|%l;(@JrOZ^v)(*proaln;-|wDqE-5G#A`2>C{Y1h zVMUO;g^b9*c9RXb{K4uw#d33+-Zgd`I7WqSxI zpv>uL)U?Vz3PT}al&I_T-#xiCH0agAgI5f?7bRCv58G%FZM&;W-rV7T*RjD(Lir#@ z*|~(oeri5J<+3tWjqb2Lkykg8c*HIfQdZ*aiK=QOJJ-AV{a>f&B zH9uYJ*nEF2%F1nfeIK8+1`SPQasc6U6suu-@O#%|oUbcWlnPGw{O?a5LRf1xM+KBB z-*$wW`edgWY*h7^Cg!)MR!>5o)^9(2vFIR!*jd?aYK70wf1=@)RD9VOVf#3s)G1ao z`YHhm?^qIal;!E&r>iM97~g` zSKBAM&Igog$$Qo>Im9xZV>R;v*$PAQ^b8G6SOP;)^l8a!FfRO`LuxO{zw9^4OvqO& zQczC4oV@|t$jwO1&$px7H6Hh}ffFFc9ZOAMCRQHvx#5=GFsnp)Bv$l!B9Ew&Y>YU( zy`HxwdFii^#MJ*oKh~-c%Z{atXwRyp@Ts*2@+5`kzOO^Zh933W_6) z(-FTPR;&*CuC8#qG-!FG`gl)uzgNl$$pmXeEL#*0d*<&F!lRaY@>II*hjuszo$;dq( z^-GwQO}eEX*|Ll-Pk5#&8FTVs$>ElP)+za+loPh40j0Cxs%%dv$xJJKjBclc>kIaAl~a}1n(7)XE{N}cSh61soA7R^ttD>?)uKcX&4ZVe7L&^D+nKg8 z)%~SE74L1yU9US@yuT&)&i_2n|Nakk69REK#Qr)BgE)k4R=IA@-h_?2!8p zTlNm+<6ukvD%O%Q;G@7okFaerD~c)kZbezPMU?mi>OQ)`Sw&^{jcR|6!IDMizM%sO zZh1xi{giw{WlZL_-M?3DQrSXWn`kZB9_eCcS#~VXjwtSx zjE{{sAvH_>2c9I!h(;b_)a#qFK)ivmJr0Z|l4HlioR@1kNzPUAHRg)v< zO??U##P{zV8hI*X^69C%nq17-Q<*kc@&2z?jrXKnTPDB1 zb>41Yn?XM?e&9@vN7&n*&Z02}IqLQ-F&|=z6ECYgtFt-+&n{1ji=0X!l)Dy1oKA{6 zQfw-XN(it|a>=wTy=F5s`m4+wM`|uyIRs~+CZ0Go9osclu5re#Ev1V;4Zi`uQrOx$ z_y0TASOvs)fKpIoVm1B1b3lVOJp~@soUePL!9{w8XQx$xgG_C?LH%V;P*Kvld-eu? z;0Dv=gV#H{=wz3@47d=tw%_U}qxIDSeIokX21ARv_WK4Ft26?y84Z--Z_JcNB)NNyNk*n-J4MEOZsQGkOXa=3m^XnXg z_g{e4_#@IbngK){toF5KVKaysv+dt?C8wb@{!)R^S#V2F0wUX7=wb=QC;0*WNn!IflVw6fu80AsT*qS>)C zEiP#2`yNlwKx~h7-^u+Yr{jf#RLXsf?EOsjlf<7=O$MyjP7aNgi^pndE#9oRQ)1>~ z)FAF7O(LX<%he{Z5&~c`nNYj`H6+yf;Gj#HqlZ~`(-G07ePbGc?^4A1bTb38rP57` zmrgp3#j2*)x+)(R!Q$&ys-}A)9S*IAB%zwSM!;b9SRBE;eZxCbdQ2;5ZuqW8GhwM^ zD3bBO#RgmzfEmkxGV4?R2e(0fz$`EAC5-y8BXTPH>Cxiy@?1uv#u-Mdzkf%oA!pii zu3kowKJ~yefwFRv-Y?ZDb^nNTQ5u^+A*4xrBT+&qKI`y#Noy06XfY#T%1Z`qy7#;m*I zyL2Ea8i(ix<#pv<8=^}FO9(O>)kd5}Z7S1(icWe$U@*3u?YFNLqqj#p16KFM)Im|1SqUu6ZLhSk^64oEKFCLhMls&$nmt;V zmW$G<(LyMtLKIrs299;YkzY6_#Zqb6_d^cdf2I=2jCQg7lwa$Lf^iI{HMo$4O0V^^ z(y7KMQg6MCyHm&4Ym|Iukh*PPkCjDLl&1yGe?_VNwZ*rY{0c~KB5U4G>b&}F{knl> zjb4(8)e-3G$*#mVXO;D`TEV*R;}Moay@RJ$wUS)3zT!qJyY;SzH_B3vF$Jpz`&6o4 z73*|D&DJAR!&R{=B@x0fX;-B8pK6ivZ?E5`;}=y=xeru{dnpp)fg99Pll+RGyGoKV zk*(RBx}2WY1j@rlBjBX=(Gw`kCq?$vTxxtgp(HBm_Sv57r&?y?aOtmT_U@Kbq>m4` zRCFftdeGAr;}1)?Cx;#c_`51tbThQ<6*k9XcD3jNGF5 zH)y1b=x`&YK4qs_bn1_y6s@U8{?&p=IFKzmW2d_bb>lafl9sa}x33*E?I`W}&5Lw2 z&F`yciN#lEvKa`Io^|}l2Q}A5(1FPF1Yjm z`vi*7i4<77R;1^Y)aU}R3Z_ot|H5{%=lk4I{zi!M9#v~;+ao`>pCr)VwG1e^`JP3! z=S!uf*y9Z;p$LyMoaoMKK_oq6#-xxp)R>t%L8n`&W95%FnEoM-lG?2;;gO!x4A>{Q z($@osxyIsdBh5lK&-;}EAvpqe>5noDk*-AfjLQyW7%|3U(i6owZP^ZC z+ZNmMe99%thCRCjfDQk3d_@g))6Q57%=8X0pI~&!e>c24huXUKwoJ43cX63oA_Jaj z(YY6RQnnIN_)jcS;E#^u?wGwVXK?`FFJuxE$VTyAgk_Q~ee zffYTQO!E~ zRz1153%G8PM=4U4O>=jRm#oxM&Oo8ONd$i*M`@_KHT%I-P*zXRh~4Kclo{m*99%1Fkv$;{VFH%3eIweSRVxl3%``L#AR3GHC8@;6>bEsM0a zhb_z~?V^-&`(FX;{$MK71+v)c5A4ywFfh88AV+6y8sgq#SRGl$cG)^BzMnqT+MF9= zc^=rBMDcS*r?Ad2jp0{kEWNFuNar*-9OsiES)5Ag+&dK2?L+E1DdW=_*J#%tQmE(S zlu~{~a;;_PUCZ<>!nUz_)!RNAhy!%jhp1$I;^1Q=hjY}PjdJ*}sp94x=xO$zgt~g{1?wX*un(N^;nuwHPTle0 zo)MHZhspB~uHqONHM-5rfb)aaRB!bGEM`4Q1Pl4bWD{-?)N=>Faj3xxOQ^>qd$5lp zI*eMf&{MXVnHj!oIZ0Ws&gSISXW#9wo;X|7tskc&5z~Up3lyDI`RR(z9!tl7w;M-y z{YLlbRnV+*as?BzU5tgHyq(gd+87h{xUnXk(K`L0iqcOmHXdc_B90;7vHuDa(afMJq?%(cJ8fP^-cpl^{B=y zLT$N58=yhboVKkr?6|FxM7yKErvK7;`)~Vjrm6xGJk6S((j&K0zIq(Fkn%dTVMxRr z<%c1_I}-Q^qYcE>^Y7$aoQMHI8+O=o(v#ec#K@9eth8dATycHLV8{@)7^C-0-sr&q| zXOaJhF6of(+qH?@Zlb zSAAcimuq&DEA@w#DN03%zOU=n*@bag3?#*x{f_QEE}D*tP5n1FU3e+kBO#v@MF5+A zoYSIN0%8IvVLBG+vhb-bF(8sLnxj+8#g6OOZdh~^m)dG3F|v7*4>Al;^7(tP(WzveAwK~^a1 zI(N}XJAT=ZC`>r)u3jjb zq;Hnr=G0ISCz2AEg)cX});jzuJ}9t#v|S$=rWwVaFKlkco+Ew>@5N#$0~4F@Fg|O{ zd25YBeg^fM{GFc8DD(I2*~|$;|3kY~3w(Y#dUd>sEuBZQ1_qN%3!gdp zBFmnMBAVKA3zY6V2t$S(ve+g-ky{yaePzrx11)5i!k@UmawBE>QylSx|+Q zjM{95U1G;9mDp6rIg&!r7+c#^{cqZhn2V-{#$R1sT@yK%W9=ZJolk3xVvm(S45)|O z+ENW4NvhWg;-h8La@Kcal^EpA_^x`?*qK^@ySA;fYHlNNkLIJ2af$hQrluoFupE;TK=;Y2IR_TiMps#3m0G3U>d88}Sk| zOIJQ?=!8v8wdP|F-z@6jc+=+lpSsvo>TKVoM-l{U;bh)zex}~oV%1zmowjn5jgs5Z zbZJO&(Zf0HM|<)TlC^*6ofA|XC6GS7GVaq^b{hq#6MH?b!PMOwd&SUjTFuGHiP*fv z5a7matK*hg-^A(X;sK(w3q`$tW7^Q5Ega|_t{bbGO%H!V`Ce8{wjKCx+(>9+)KQ=U z*c5q&M`p2~l%&{-KX5@lV2nJ~uhCKjSQ;r8?mRR!Ty4Nbx@?VNOMTOQYM$x&_kT`A z6-)D51se|a0rX?UZ#uJ>adAmWNqJ=nkRKkGmH2tsMf}xKNbZc7#?_L3CgW#0e7p_C zP6_yx%1%eGB>vG|SgSGJ_77!^5G2vc&V4+KY}e6yT2g|iP$;W! zmTz~oaw*@$%!?zZ5jEcMvEmv@6dIj=HS2r`lq-CEotrfl{YVEpE+<*MhRW6q&qf<~ z>j6pY3pvFYPQ(ZJiCZUZGDiH5JEjKiyhSQ9Fp}nMK>s0hA-nXwF>!r4ZO2c-R2))? z(?j3R@S+yorqr%HOCBdR6!0K{p9b@X22HUDy~iWqk8?v{^#O%5Tq*D8myhyIP14*^ ztNB$>e6qEiWM$l&CAhB)%o9M+*YEf@V77O2<-v@PBnwY4v$l@LRORDmQU1c2N|g7c zq^-0A71n+d=#4|tW<;ecE`BLLk`>DI#A`X@Z+lu=jz?q>Otlvsb4VC;j?TAa#l3+2 zEAo8q>4Rg3(QP|O-50x;nTqA;Z03{e9)vX84$u$({uL{x@Xi2b%pvUl14=o^fEhH` zEkiC-m%VgtCUhsb^2KG?ANhtDK8Owpm01f{oSZTt+xZ5u=dI7OZown^n?ql(wz&!{T3fbZtssiWk4s9{oZ0*h@;)3jFX3RziXu@<@| zzn#Fb*o4sJ_%|E5bx9eC%OMfRB_CN8)>t$jquZf+!N|{#WlO&UVT~x53edz7a3kmd z=T7}7S*%)7cQ@>0J6$89&w#tKvI1EPlji#-J`X9o+6(>4TVhrG$VD z_BU)DqwLe%ae})TcDX$w|8KdqOC+OI4jXRf-06?TcHKw{P%Sv_b;wxNSA1Bm2_!J> zSaKY{&MJXcP_vUxnZn8!ls_8nJgIMfGA49zWMqUKPa7Lv96Ru&3!oF8MAP`e@8^~7 z4oMYOIsWFiF>gHGi+NgpRGBvLIJB*dJR9ePlQU0Od51W$pmn~cm64eX?<#D;{ZsXa zW}j=FW&&m35Dh{+PTiD-X$T2{}5?F}=nm2#MdpaJC@k~+tLJeR7hTu>` z$>gI9nAw_!=+&W}{;2)ziDP#T3bE2VFlU3C6`1`8xdnBhjx6)UTp z?#+c~qc@}Hy+wI#@N*G4f^{3!%b$-PWb_tYTo^55!Rhuertep13? zF(cJL2srkr@$5uB$+`b6u~PWtc0Y9virWm&(Z>f%@7RRw31u?a)Y1Vz)QyW~?ZTek z_kKTTrA^XOlTgg9VLyrrW8CM>a0Zz}52$G+a^%z~wXG71 zBg^cBDvv&wqn5U|1xrUL9LRUKoOir*130?$2l1GNAI7gNnA8lXoyU9md9gFCw0sk9 ztd>6W^z`h1AAf@Tw^MMRKC^3pO(fs!*dcZ?(x>kA?$OY6LQ)64Dsc9X^aU%>F=4Vc zFaPSZ(hrG>$WL!B)yR813I_c)b7a!~xLuK=iYO~9Q*(U5V7U3zPVlSWt}ap~(*4RF z9#JeVFS=%ua=JQCsXss6`^7=%-BjRsigI$^=AVQ~`)FL3Hq9(fNxAlRHB7kCgSAo2 zx>G7~+U|LTU>XkrDw{=Be*We8)xQtV;Gi^%;Na}IJ$5<6A-^3_G)t1#U5j%kF1;zE z+E?zH7XPmn;0oNyti4u=R8C*B+RT{_Ew+J^#A7$6D5W9QtH10*M*ILn!|H!@^z+N@ z?YikT9^x_AHlOByn5>Z4>_(=(?}2XaVdzz{%R)E1pxig)t)t`eU!XtDDf~$b!5UoJ zNdF#(!zJXx)e6v5CtJy^h_YsX7Lv!OF`wE4T_wTn{MNDgmz%3;{LXVc-cLqjf%w+e z-A)+#ZOrtEI6Y_cu1xmz0~)v6Z*6`_E4gl)D!e|6LI`5ExWtIH60OhEas!fj!e4N| z=-6=48|1~A*@u8S5TH!;-j-B&8F_2oZ_v{8xIqKK3)XIL?^$A|O5$2D z^6&1g_ll0);w-nVZnO@KR!^}KoLin`jmUqI!{9cRgw(LG&a|Q!yVVMbZv_r+Tt&I4eXq2?3t9($HHkDJl>Z2i_P^mz2fOO9R~o7!JUUM z6qb}V+oZyS>aj~52zI2TFb`K?KJenwtaJUnTdJz6QaVAUQc}COF#RjYfxxX0riWmC zso~2D6Ru#t`smMMV)u%{8HqaueYgZb9%FiaeA@g%Hj~jcP-=e;-5uOxX=NqEKBcd9 zXQe~UGbu%tJBTDOR<(1Vuyp({h`5|`o|8X5xWnpDpauM)HKEG1LCp6NCDOHy?|J;5g; zbe18%@hDa1FRqT0XWV+yiWDkgA3q0Z5o#A2c#Dt@3ABD(XXfg2%4gB0^@L_(@dNlnp8uWaSrRrIn0SCP4QKCP%Ey zyM{z<6iRZ9_e*%sAIP`A4h~dlIm)$5x=>G52M~1RJwtMSHJgb}4BQD)PyS1F(iB<4 zvpV`+CpbOow3#)j4Ga!TT}LFQlW$}$<#j8GZy`T2ZYR|s6vIq>1ZonrU)6_%6?7#$i#WM*bIu=eO%hlMpB(!N9fh{$kU zn-Jb>#YvY;=&$^i&Z^{69FaLiR$RXRIBhM(pm}M!&8z+M2iC%D-^ALMGeO1Hlgk=% zAca=j5FGO89jRFO-B6){E3XPU>fM?TF2ilB>&TUvzJ{59I8{q4vkkm7 zITmGX!NT2r{p2z*NuzFTLRHUXnAd9QMD+&+>9GX89HTgjXqcyGUFGTe_g&g#YN$K- z^CkA@^sT?#e?TkW;*H);&8(s|hp~4yF1(l>C^)#DIRJI*JT_m!F&m8_V^&^I=$$E4 z_){%)AgtzY?JDn!Y?`iDuuoN=wc~eU7rUgvbjwIQW0|1gY)JBlg2VhI(SLEr&c4ZS z_iay7ZkXzSRQ;hH;bRCzq&KyyzBgya_Q(~M z*YcX?3g6}0RkIu{>_)xF#%gMOe^zidoeSxlvrej@$zN`DQNSJO6U zuf0{5gJz5{S>)TppXq&W;wA z>bmvxck9d-MhgZ1sxA%;j*D)Glbr7QuQGujw;K3aVcrkrXP@s}wZ&jazV&n)4FBsLIyQP(V>tAqH&WRI}tw_UWdnYUrxls+Tb?DUA> zM`|R2aXRGzmogAXY_uVgx1#hyhTY|1sff^rAZ%nMMq|FVKKsq|>C3FGMMZt<;NaRr zTf>Sz4J^Q)Sxu;J3LkiGUtS9_aFYuafwSgnLe<)2*z6Y~*8T{^(VWXg$Go^QF)lekopCTYIJVZ3N{K@NVGJtPM$4jJTZ(WGT~n6$T25%9@>Hen+E& z*^3boSD9H6*(s;(T?)VvB?60;Z#H2u=3SXA#bR?S@w6Kz`*`E-`h*jQgvFECFxXTS zR;$kRpDxIlwLbaN<;^*F=nM+auhQesz71^2lVm@gHXjshaOSIGzCiak2XEB_aOca< zu1xlvF6>qKTjM3-7b!)jLGFdk9<4k6D*b77I_3_JEW~v8{+8oHhqwK&^eg|VV(jtr zGYGD1h<>yIQd0^CAJeVZ>F2RH{cd^M+u-!?;|IeQr1)Ntz4FSI=H_t>b$H<;b+V<( zn9c0)iMYYb(mtPui1tL91Ia7t6XLu>Ltv4Dd0OuN9(|+6xr)SYE&kQ6topFmrvJ1t zI{TDq+9bH}_wU8Tl*2#2+6m62U~I9@N>^96VY<693~~F;J=OUFaNW%HIi=1a^rJrH ziJH(h9((NP>Z-^6vSFS5`_;Ehgc(rv^;40+^rk@oaPW?3@Xmnhe z;B-^h)SIuyZPEQk-O>r%w{q~J*#QU(Dq09ImjiA3tJgAvSkRTh0Tg;EFO}WIQST+x zPGtAx7_oZ|^~&O8!!5`m?pS`{{MoRStj#w4z)zP_XC5zR5K1EM5M;x@+@!NuD^VlQ zwdM!?W**^%rP|sy?1%{7xlBxVNW(JAi%SzW7h~2&jBK6!ku36^3_YI{PUx1r(Ph$N zpWFgJr(0+7JEwq=qoGSJ5lF^DBfI~Rx`pdUz1?EZC8}#{+3ym~`1nVV8pziPzWI0!|y zJ~jnIN+R1of3`i7VnuU%U28@iuSaQyF&4C$bLTWe15FT%-V5XP^ab3Avm3=oDmxS? z!_5}s_*8L6m0P|Vhj$_)-h)!IE$B^9e<3}hXRy?(@MnMZKRoCP$#f@mP_B0_PMrH! zntnvH8fj`@b#?XZQ*gsCOPkIk{2&K;Ok=Nwfu5Pi=Xxl^<*w-0A;1G!pP3x-jHDh};ZoUcKRJ;rB z=g`nlp3Y)}BOs%r?s$^VLqK5i%3WJ$Vs#b)v}#$bJzK>f6j!Sk>;rr0MZ>I8xcdBu zdaL?-yaG)gsjALU$r}+3OOoWldM2W9*M5oNmFJhP<%&#jLX{Bv>9GH#9}Oc9tDVFe z4GCjW0{=D-8fmTnh`C-Kr<;6H#r9CRX0$v`8fw!f7hH8Y&bJRnyKtTAyyiL)OxxMO zE^9=0*E2}c*-x?kT~b3}P_=z2Ws%cKOdKqk0% z2Y<1ELb1Wj|LYn!4f@`U2)_swE=b6r1hCMl4~pDoRa%L9xSBBLiGi8+(p}Rm4VbMH z8mHF$`H#)5W;KotEKqSXxBA)4(p#Q*9LPo zI83&Y{ssak2Q@?R-Y~DHc91(q5d)bfUXX*vgvv^*HJb3AnXud56N$X$8e{vj^+&`5 zfWLd9So<ZQhmyF{uiX z_cu1UgTPvF=GZ{;R@RT0ξ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 z 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 aZRzgIsO9AHdVjmQ@Arr8V}1Mcng0WVK2hWV literal 0 HcmV?d00001 diff --git a/src/heurams/interface/css/main.tcss b/src/heurams/interface/css/main.tcss index 10bc1b8..13449cd 100644 --- a/src/heurams/interface/css/main.tcss +++ b/src/heurams/interface/css/main.tcss @@ -22,4 +22,15 @@ NavigatorScreen { dock: right; width: 8; padding: 0; -} \ No newline at end of file +} + +.memoqueue-container { + padding: 1 2; + width: auto; +} + +.memoqueue-container > * { + border: heavy $secondary; + width: 1fr; + padding: 0 1 0 1; +} diff --git a/src/heurams/interface/screens/about.py b/src/heurams/interface/screens/about.py index e201189..67064eb 100644 --- a/src/heurams/interface/screens/about.py +++ b/src/heurams/interface/screens/about.py @@ -50,36 +50,32 @@ class AboutScreen(Screen): memory_info = self._get_memory_info() about_text = f""" -# 关于 "潜进" +# 关于 HeurAMS "潜进" 主程序库版本: `{version.ver}-python` 用户界面分支: `Textual TUI (基本用户界面)` 用户界面版本: `{version.ver}` API 版本代号: `{version.codename.capitalize()}` -一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. -一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. +> 一个基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划. +> 一个开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. -您正使用的 TUI 用户界面是 python 版本程序库自带的基本用户界面, 以作为第一个全功能前端实现与程序库测试套件, 位于程序库下 interface 目录. +您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新, 并参与到软件的开发与改进工作. -您可在项目主页 https://ams.pluv27.top 获取用户指南, 开发文档与软件更新. +以 GNU Affero 通用公共许可证 (第3版) 开放源代码, 并有一条豁免本机 API 调用的附加条款, 用于其他前端到程序库的接口调用. -以 GNU Affero 通用公共许可证 (第3版) 开放源代码. +您正使用程序库内置的终端用户界面, 它是第一个全功能前端实现与程序库测试套件, 位于程序库的 interface 子目录. -如果您觉得这个软件有用, 可以考虑参与贡献, 或在它的源代码仓库给它添加一个星标 :) +开发人员列表: -您的慷慨支持, 我们必当涌泉相报. +- Wang Zhiyu ([@pluvium27](https://github.com/pluvium27)): 项目发起与主要开发者 -开发人员列表: - -- Wang Zhiyu([@pluvium27](https://github.com/pluvium27)): 发起项目与主要维护者 - -特别感谢以下人士, 他们的算法与理论构成了此软件现有算法的基石: +感谢以下人士与团体, 他们的算法与理论构成了此软件现有算法的基石: - [Piotr A. Woźniak](https://supermemo.guru/wiki/Piotr_Wozniak): SM-2 算法与 SM-15 算法理论 -- [Kazuaki Tanida](https://github.com/slaypni): SM-15 算法的 CoffeeScript 实现 -- [Thoughts Memo](https://www.zhihu.com/people/L.M.Sherlock): 中文文献参考 - +- [Kazuaki Tanida](https://github.com/slaypni): SM-15 算法的 CoffeeScript 逆向实现 +- [Thoughts Memo](https://www.zhihu.com/people/L.M.Sherlock): 间隔重复文献参考 +- [Open Spaced Repetition](https://github.com/open-spaced-repetition): FSRS 算法底层实现 # 运行环境信息 @@ -89,7 +85,7 @@ Textual 框架版本: {textual_version} 终端模拟器: {terminal_info} 操作系统版本: {os_version} 存储余量: {disk_usage} -内存大小: {memory_info} +内存总量: {memory_info} 报告问题时, 请复制这些信息到问题描述, 并上传软件日志 `heurams.log` 作为附件, 以协助开发者定位错误 """ diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 9ad35ea..fbc8596 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -74,7 +74,7 @@ class MemScreen(Screen): yield Header( show_clock=config_var.get()["interface"]["global"]["clock_on_header"] ) - with ScrollableContainer(): + with ScrollableContainer(classes="memoqueue-container"): yield Label(self._get_progress_text(), id="head_stat") yield ScrollableContainer(id="puzzle_container") yield Footer() @@ -105,12 +105,13 @@ class MemScreen(Screen): return Static(f"无法生成谜题 {e}") def _get_progress_text(self): - s = f"阶段: {self.procession.route.name}\n" - # 收藏状态 + s = "" if self.repo is not None: fav_status = "已收藏" if self._is_current_atom_favorited() else "未收藏" - s += f"收藏: {fav_status}\n" - s += f"进度: {self.procession.process() + 1}/{self.procession.total_length()}" + s += f"[{fav_status}] " + s += f"[{self.procession.process() + 1}/{self.procession.total_length()}] \[{self.procession.route.name}]\n" + if self.procession.cursor - 1 >= 0: + s += f"上一个: [d]{self.procession.atoms[self.procession.cursor - 1]['ident']}[/d]" return s def update_display(self): diff --git a/src/heurams/kernel/README.md b/src/heurams/kernel/README.md index bd0d3ca..37db4ec 100644 --- a/src/heurams/kernel/README.md +++ b/src/heurams/kernel/README.md @@ -1,3 +1,3 @@ # Kernel - HeurAMS 核心 -记忆规划相关算法与数据结构, 可脱离业务层 +包括记忆规划相关状态机, 算法, 仓库系统, 辅助库与数据结构, 可脱离业务层 diff --git a/src/heurams/services/README.md b/src/heurams/services/README.md index 7274000..9da5510 100644 --- a/src/heurams/services/README.md +++ b/src/heurams/services/README.md @@ -1,3 +1,3 @@ # Services - 服务 -基础服务相关代码 +基础服务相关代码定义 diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..9124250 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,150 @@ +# HeurAMS 测试指南 + +## 概览 + +HeurAMS 使用 [pytest](https://docs.pytest.org/) 作为测试框架, 测试文件统一存放在项目根目录的 `tests/` 目录下。 + +- **测试框架**: pytest >= 8.0.0 +- **覆盖率**: pytest-cov >= 6.0.0 +- **配置**: `pyproject.toml` 中的 `[tool.pytest.ini_options]` +- **所有测试纯单元测试** — 不涉及 I/O、网络或真实文件系统依赖 + +## 运行测试 + +```bash +# 从项目根目录运行全部测试 +uv run pytest + +# 显示详细测试名 +uv run pytest -v + +# 运行单个测试文件 +uv run pytest tests/test_sm2.py + +# 按关键词筛选 +uv run pytest -k "revisor" + +# 带覆盖率报告 +uv run pytest --cov=heurams + +# 生成 HTML 覆盖率报告 +uv run pytest --cov=heurams --cov-report=html +``` + +当前全部 **128 个测试** 通过 (0.2s)。 + +## 测试套件结构 + +所有 9 个测试文件平铺在 `tests/` 目录下: + +| 文件 | 用例数 | 测试对象 | +|---|---|---| +| `test_base_algorithm.py` | 7 | `kernel.algorithms.base.BaseAlgorithm` | +| `test_sm2.py` | 16 | `kernel.algorithms.sm2.SM2Algorithm` | +| `test_nsp0.py` | 9 | `kernel.algorithms.nsp0.NSP0Algorithm` | +| `test_electron.py` | 18 | `kernel.particles.electron.Electron` | +| `test_lict.py` | 29 | `kernel.auxiliary.lict.Lict` | +| `test_evalizor.py` | 8 | `kernel.auxiliary.evalizor.Evalizer` | +| `test_epath.py` | 11 | `services.epath` | +| `test_hasher.py` | 5 | `services.hasher` | +| `test_textproc.py` | 7 | `services.textproc` | + +## 共享 Fixtures (`conftest.py`) + +`tests/conftest.py` 提供了四个全局 fixture: + +- **`timer_config`** — 返回一个 `ConfigDict`, 其中计时器被覆写为确定值 (`daystamp=20000`, `timestamp=1e9`), 使算法测试不依赖系统时钟 +- **`timer_context`** — 通过 `ConfigContext` 上下文管理器在测试期间应用计时器覆写 +- **`sample_algodata_sm2`** — 一份预激活状态的 SM-2 `algodata` 字典 (deepcopy, 防止 fixture 污染) +- **`sample_algodata_nsp0`** — 同上, 针对 NSP-0 + +## 测试模式与约定 + +### 组织方式 + +- 测试全部使用 **class-based 组织** (例如 `TestSM2Revisor`, `TestElectronInit`) +- 每个测试类聚焦一个模块的一个方面 (默认值、方法、边界情况、属性等) +- 类名以 `Test` 开头, 方法名以 `test_` 开头 + +### 数据隔离 + +- 使用 `deepcopy(algodata)` 防止 fixture 突变在测试间泄漏 +- 算法测试依赖 `timer_context` fixture 以获得确定性日期/时间 + +### 断言风格 + +- 仅使用标准 `assert` 语句, 无第三方断言库 +- 异常测试使用 `pytest.raises()` + +### 自定义标记 + +`pyproject.toml` 中定义了以下 pytest 标记 (当前尚未使用): + +- `slow` — 慢速测试, 可用 `-m "not slow"` 跳过 +- `integration` — 集成测试 + +## 覆盖率现状 + +**已有测试覆盖的模块:** + +- `kernel.algorithms.base` — 完整 +- `kernel.algorithms.sm2` — 完整 +- `kernel.algorithms.nsp0` — 完整 +- `kernel.particles.electron` — 完整 +- `kernel.auxiliary.lict` — 完整 +- `kernel.auxiliary.evalizor` — 完整 +- `services.epath` — 完整 +- `services.hasher` — 完整 +- `services.textproc` — 完整 + +**尚无测试覆盖的模块 (欢迎贡献):** + +- `kernel.particles.atom`, `nucleon`, `orbital` +- `kernel.reactor` (router, procession, expander) +- `kernel.puzzles` (所有题型) +- `kernel.algorithms.sm15m`, `kernel.algorithms.fsrs` +- `services.config`, `services.timer`, `services.logger`, `services.audio_service`, `services.tts_service`, + `services.favorite_service`, `services.attic` +- `interface/` (完整 TUI) +- `providers/` (所有提供者后端) +- `repolib.repo` + +## 编写新测试 + +1. 在 `tests/` 下创建 `test_<模块名>.py` 文件 +2. 文件头部加模块文档字符串 +3. 按功能划分测试类 (每个类一个测试主题) +4. 算法相关测试使用 `timer_context` fixture 保证确定性 +5. 使用 `deepcopy` 保护共享 fixture +6. 运行 `uv run pytest tests/test_<模块名>.py -v` 验证 + +示例结构: + +```python +"""Tests for heurams.module.submodule.SomeClass""" + +import pytest +from heurams.module.submodule import SomeClass + + +class TestSomeClassInit: + def test_defaults(self): + ... + + +class TestSomeClassMethod: + def test_normal_case(self): + ... + + def test_edge_case(self): + ... +``` + +## 开发环境设置 + +参考 [CONTRIBUTING.md](../CONTRIBUTING.md): + +```bash +uv sync --all-extras # 安装开发依赖 +uv run pytest # 运行测试 +``` diff --git a/uv.lock b/uv.lock index 54da3d7..66abfac 100644 --- a/uv.lock +++ b/uv.lock @@ -439,6 +439,7 @@ version = "0.5.0" source = { editable = "." } dependencies = [ { name = "tabulate" }, + { name = "textual" }, { name = "toml" }, { name = "transitions" }, ] @@ -498,6 +499,7 @@ requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "tabulate", specifier = ">=0.10.0" }, + { name = "textual", specifier = ">=8.2.5" }, { name = "textual", marker = "extra == 'interface'", specifier = ">=8.2.3" }, { name = "toml", specifier = ">=0.10.2" }, { name = "transitions", specifier = ">=0.9.3" }, @@ -774,7 +776,7 @@ wheels = [ [[package]] name = "openai" -version = "2.32.0" +version = "2.34.0" source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "anyio" }, @@ -786,18 +788,18 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/7b/89/f1e78f5f828f4e97a6ebca8f45c6b35667da12b074ac490dc8362b882279/openai-2.34.0.tar.gz", hash = "sha256:828b4efcbb126352c2b5eb97d33ae890c92a71ab72511aefc1b7fe64aeccb07b", size = 759556, upload-time = "2026-05-04T17:34:08.721Z" } wheels = [ - { url = "https://mirrors.ustc.edu.cn/pypi/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f2/40/f090499f10514515081d09cb9da09f25b821eb20497e9423afe4f07b4ecf/openai-2.34.0-py3-none-any.whl", hash = "sha256:c996a71b1a210f3569844572ad4c609307e978515fb76877cf449b72596e549e", size = 1316535, upload-time = "2026-05-04T17:34:06.773Z" }, ] [[package]] name = "packaging" -version = "26.1" +version = "26.2" source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ - { url = "https://mirrors.ustc.edu.cn/pypi/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] [[package]] @@ -1181,7 +1183,7 @@ wheels = [ [[package]] name = "textual" -version = "8.2.4" +version = "8.2.5" source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } dependencies = [ { name = "markdown-it-py", extra = ["linkify"] }, @@ -1191,9 +1193,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/19/89/bec5709fb759f9c784bbcb30b2e3497df3f901691d13c2b864dbf6694a17/textual-8.2.4.tar.gz", hash = "sha256:d4e2b2ddd7157191d00b228592b7c739ea080b7d792fd410f23ca75f05ea76c4", size = 1848933, upload-time = "2026-04-19T04:20:45.845Z" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/62/1e/1eedc5bac184d00aaa5f9a99095f7e266af3ec46fa926c1051be5d358da1/textual-8.2.5.tar.gz", hash = "sha256:6c894e65a879dadb4f6cf46ddcfedb0173ff7e0cb1fe605ff7b357a597bdbc90", size = 1851596, upload-time = "2026-04-30T08:02:58.956Z" } wheels = [ - { url = "https://mirrors.ustc.edu.cn/pypi/packages/5c/32/02932f0d597cdbb34e34bf24266ff0f2cf292ccb3aafc37dd9efcb0cc416/textual-8.2.4-py3-none-any.whl", hash = "sha256:a83bd3f0cc7125ca203845af753f9d6b6be030025ecd1b05cc75ebe645b9c4ba", size = 724390, upload-time = "2026-04-19T04:20:49.968Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/cd/01/c4555f9c8a692ff83d84930150540f743ce94c89234f9e9a15ff4baba3a8/textual-8.2.5-py3-none-any.whl", hash = "sha256:247d2aa2faf222749c321f88a736247f37ee2c023604079c7490bfacddfcd4b2", size = 727050, upload-time = "2026-04-30T08:03:01.421Z" }, ] [[package]] From 1caccc9114df32f7cddce07761fd3148138d78b1 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 6 May 2026 09:46:50 +0800 Subject: [PATCH 70/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++++- SCREENSHOTS.md | 16 ++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9bfd752..da9da14 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,17 @@ - 性能提升: 得益于现代且支持分块的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 - AI 友好: 想象您有一些 .apkg 牌组或一大段教材内容, 您可以方便且高效率地使用 AI 工具生成可在 HeurAMS 使用的单元集 -### 实用用户界面 +### 内置实用用户界面 + +尽管内置界面不是唯一前端, 但它在多种场景下仍具有独特优势 - 响应式 Textual 框架构建的跨平台 TUI 界面 - 支持触屏/鼠标/键盘多操作模式 - 简洁直观的复习流程设计 +- 与几乎所有现代终端模拟器相容 +- 对于支持 sixel 的终端模拟器, 可支持显示图像内容 + +[查看屏幕截图](SCREENSHOTS.md) ## 快速开始 diff --git a/SCREENSHOTS.md b/SCREENSHOTS.md index ed252c8..bb18ef3 100644 --- a/SCREENSHOTS.md +++ b/SCREENSHOTS.md @@ -2,8 +2,8 @@ 潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图: -- Textual (基本用户界面): 基于 Python Textual 框架构建的程序库内置跨平台 TUI 界面, 支持触屏、鼠标、键盘多操作模式, 是当前开箱即用的默认前端. -- KiriMemo: 基于 KDE `Kirigami` 框架的现代跨平台前端, 使用 C++ 和 QML 构建, 通过 `PyOtherSide` 直接复用 Python 内核,为 Windows、Linux、macOS、Android、iOS 和 Plasma Mobile 提供原生体验(尚未稳定). +- Textual 基本用户界面 (heurams.interface): 基于 Python Textual 框架构建的程序库内置跨平台 TUI 界面, 支持触屏、鼠标、键盘多操作模式, 是当前开箱即用的默认前端. +- KiriMemo (org.kde.kirimemo): 基于 KDE Kirigami 框架的现代跨平台前端, 使用 C++ 和 QML 构建, 通过 `PyOtherSide` 直接复用 Python 内核, 为多种平台提供原生体验 (尚未稳定). 欢迎为现有前端贡献代码, 或开发您自己的前端. 详见[贡献指南](CONTRIBUTING.md#新的用户界面前端). @@ -23,8 +23,8 @@ ### 准备界面与预缓存工具 -学习准备界面展示了单元集基本信息和每个单元的学习状态, 并提供了学习和预缓存的入口. -预缓存工具使您能提前预缓存文本转语音资源以确保复习流程的顺畅体验和离线复习能力, 但即使您不预先缓存, 资源也会在复习播放时被自动加载. +学习准备界面展示了单元集基本信息和每个单元的学习状态, 并提供了学习和预缓存的入口. +预缓存工具使您能提前预缓存文本转语音资源以确保复习流程的顺畅体验和离线复习能力, 但即使您不预先缓存, 资源也会在复习播放时被自动加载.

@@ -34,7 +34,7 @@ ### 记忆队列界面 队列式学习记忆的主要界面. -同一知识点可产生多种谜题类型的评估方式, 软件内置完形填空与识别题等多种测试类型, 您可在复习流程中按顺序完成不同测试. +同一知识点可产生多种谜题类型的评估方式, 软件内置完形填空与识别题等多种测试类型, 您可在复习流程中按顺序完成不同测试.
@@ -43,9 +43,9 @@
-### 设置 +### 设置界面 -配置界面包含算法选择、音频与多种服务的提供者切换、以及界面与算法设置等选项. +配置界面包含算法选择、音频与多种服务的提供者切换、以及界面与算法设置等选项.
@@ -64,5 +64,5 @@ ## KiriMemo 前端的截图 -截图将在 KiriMemo 前端开发趋于稳定后补充. +截图将在 KiriMemo 前端开发趋于稳定后补充. From c2496c1bb5e8dfb00a1289c9aefc170c2bc37c45 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Wed, 6 May 2026 21:01:51 +0800 Subject: [PATCH 71/79] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 ++++++++++++++++++++++++++++--------------------- SCREENSHOTS.md | 8 ++++++-- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index da9da14..668e616 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ "潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一种基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划, 也是一种开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. -## 项目结构 +## 关于此仓库 此仓库为 "潜进" 的核心程序库在 python 语言下的实现 包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) @@ -36,25 +36,28 @@ - 人类可读: 您可以用任意工具, 乃至一个记事本自由修改记忆载荷数据而无需打开软件 - 元数据配置: 配置自由度极高, 可以任意组合, 重造, 乃至创造新内容 -- 测验, 算法与知识互相隔离: 一条知识不再是单一的闪卡, 不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升您的学习效果和丰富度. 作为学习者, 您无需担忧概念复杂--仅需从云端下载单元集即可开箱即用上述特性! +- 测验, 算法与知识互相隔离: 一条知识不再是单一的闪卡, 不仅可以用若干不同的算法规划, 还可以用多种并行的谜题类型测验, 极大地提升学习效果和丰富度. 作为学习者, 您无需担忧概念复杂--仅需从云端下载单元集即可开箱即用上述特性! - 多模态学习 - 软件自身集成了文本转语音 (TTS) , 音频与语言模型 (LLM) 模块, 这些功能乃至功能本身都是可插拔, 可扩展, 可切换驱动的, 这为内容创建了极大的丰富度 - - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择启用 + - 软件内置多种谜题类型, 包括选择题 (MCQ), 填空题 (Cloze) 与识别题 (Recognition), 您可在同一单元应用多种, 或是选择性启用 - 软件天然支持动态内容生成, 支持宏驱动的模板系统, 根据上下文乃至语言模型动态生成知识点的解析 - 在间隔重复研究尚被 SuperMemo 系列独占的时代, Wozniak 就早已表示 "如果不能理解知识, 就无需记忆它". 今天, 我们依然相信理解是记忆的基石 -- 云同步与分享优化: 由于我们的记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持分享内容的版本控制, 如果您想分享单文件, 我们也支持导出为压缩包或合并单文本文件以通过纯文本文件形式在 pastebin 等平台分享 +- 云同步与分享优化: + - 由于记忆数据和单元集文件都是文本文件, 故可进行快速的增量同步而无需完整地上传所有文件, 并且设计天然支持版本控制 + - 如果您想分享单文件, 软件也支持导出为压缩包或合并成单文本文件以通过纯文本文件形式在 pastebin 等平台分享 - 性能提升: 得益于现代且支持分块的文件组织结构, 潜进能在保持高自由度的同时仅使用 python 就能达到敏捷且低占用的用户体验 -- AI 友好: 想象您有一些 .apkg 牌组或一大段教材内容, 您可以方便且高效率地使用 AI 工具生成可在 HeurAMS 使用的单元集 +- AI 辅助友好: 想象您有一些 .apkg 牌组或一大段教材内容, 您可以方便且高效率地使用 AI 工具创建可在 HeurAMS 使用的单元集 ### 内置实用用户界面 -尽管内置界面不是唯一前端, 但它在多种场景下仍具有独特优势 +尽管不是唯一前端, 但响应式 Textual 框架构建的内置终端用户界面在多种场景下仍具有独特优势: -- 响应式 Textual 框架构建的跨平台 TUI 界面 -- 支持触屏/鼠标/键盘多操作模式 -- 简洁直观的复习流程设计 +- 跨平台, 并支持触屏/鼠标/键盘多操作模式 - 与几乎所有现代终端模拟器相容 -- 对于支持 sixel 的终端模拟器, 可支持显示图像内容 +- 对于[支持 sixel 协议的终端模拟器](https://www.arewesixelyet.com/), 可显示图像内容 +- 可通过 textual-web 作为服务部署, 并在任意浏览器使用 +- 简洁直观, 键盘友好, 且高效率的用户界面设计 +- 便于测试与调试程序库 [查看屏幕截图](SCREENSHOTS.md) @@ -62,32 +65,36 @@ ### 从包管理器安装 -潜进(heurams) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本. +潜进 (包名是 `heurams`) 处于早期开发考虑, 尚未上架 PyPI, 但您可以用我们的基础设施安装稳定版和开发版本. #### 稳定版本 +安装适用于用户体验的可选依赖(推荐): ``` -python -m pip install heurams[basic] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装适用于用户体验的可选依赖(推荐) +python -m pip install heurams[basic] -i https://pypi.pluv27.top/root/stable/+simple/ ``` +安装适用于一般计算机的通用音频模块(基于 playsound3): +(此项不适用于 termux 环境, termux 的音频支持是内建的) ``` -python -m pip install heurams[audio-playsound] -i https://pypi.pluv27.top/root/stable/+simple/ # 安装适用于一般计算机的通用音频模块(不适用于 termux, termux 的音频支持是内建的) +python -m pip install heurams[audio-playsound] -i https://pypi.pluv27.top/root/stable/+simple/ ``` #### 开发版本 > [!CAUTION] > 对于部分 Linux 发行版和 Android Termux 用户: -> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖 -> 例如在 termux 上先运行 `pkg install cmake clang libzmq` -> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器 +> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖. +> 例如在 termux 上先运行 `pkg install cmake clang libzmq`. +> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器. +安装全部可选依赖(推荐): ``` -python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ # 安装全部可选依赖(推荐) +python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ``` #### 依赖组说明 -由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面提供的命令会安装所有可选依赖, 以下是依赖组列表 +由于部分依赖只被少数功能需要, 所以我们把可选依赖分得比较细, 前面提供的命令会安装部分可选依赖, 以下是依赖组列表: | 依赖组 | 包含模块 | 说明 | |--------|----------|------| @@ -95,8 +102,8 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ | interface | textual, psutil | 基本用户界面依赖 | | algo-fsrs | py-fsrs | FSRS 算法模块 | | tts-edgetts | edge-tts | 微软文本转语音 | -| llm | openai | OpenAI API 调用 | -| audio-playsound | playsound, pygobject | 通用音频播放及依赖 | +| llm | openai | OpenAI 式 API 调用 | +| audio-playsound | playsound3 | 通用音频模块 | | dev | zmq, pytest, pytest-cov | 开发调试与测试工具 | | basic | [tts-edgetts], [llm-openai], [algo-fsrs] | 适用于用户体验的较轻依赖组(推荐) | | all | 以上所有依赖 | 完整安装组 | @@ -106,7 +113,7 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ 我们提供原生 python 和 uv 两种安装方式. 详见[贡献指南](CONTRIBUTING.md). -## 项目结构 +## 项目架构 详见[架构说明](ARCHITECTURE.md). diff --git a/SCREENSHOTS.md b/SCREENSHOTS.md index bb18ef3..2f1b1be 100644 --- a/SCREENSHOTS.md +++ b/SCREENSHOTS.md @@ -1,6 +1,6 @@ -# 截图展示 +# 用户界面屏幕截图 -潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图: +潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图 (尽量与最新版本同步): - Textual 基本用户界面 (heurams.interface): 基于 Python Textual 框架构建的程序库内置跨平台 TUI 界面, 支持触屏、鼠标、键盘多操作模式, 是当前开箱即用的默认前端. - KiriMemo (org.kde.kirimemo): 基于 KDE Kirigami 框架的现代跨平台前端, 使用 C++ 和 QML 构建, 通过 `PyOtherSide` 直接复用 Python 内核, 为多种平台提供原生体验 (尚未稳定). @@ -10,6 +10,10 @@ ## 基本用户界面前端的截图 +> 截图所使用的终端模拟器为 KDE Konsole +> 字体为 Cascadia Code 和 Noto Sans SC +> 终端尺寸设置为 80x25 (软件也支持更大的终端尺寸) + ### 仪表盘与导航器 仪表盘包含学习面板的总体视图, 包括不同功能区域的操作入口, 统计信息, 以及单元集概览. From 1975474c940615b9f634218a48819a0829ee07ad Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 13:26:22 +0800 Subject: [PATCH 72/79] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 17 +- FAQ.md | 407 +++++++++++++++++++++ README.md | 19 +- data/repo/stub/draft.txt | 2 +- src/heurams/context.py | 2 +- src/heurams/interface/screens/favmgr.py | 4 +- src/heurams/interface/screens/memoqueue.py | 4 +- src/heurams/interface/screens/precache.py | 4 +- src/heurams/interface/screens/synctool.py | 6 +- src/heurams/kernel/algorithms/fsrs.py | 8 +- src/heurams/kernel/algorithms/sm15m.py | 6 +- src/heurams/providers/llm/base.py | 8 +- src/heurams/providers/llm/openai.py | 6 +- src/heurams/services/config.py | 2 +- src/heurams/services/favorite_service.py | 4 +- src/heurams/tools/csv2payload.py | 22 +- 16 files changed, 464 insertions(+), 57 deletions(-) create mode 100644 FAQ.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5d70548..84b87f5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,17 +53,12 @@ ## 设置开发环境 ```bash -# 克隆仓库 git clone https://git.pluv27.top/pluv/HeurAMS - cd HeurAMS - -# 可能需要切换到 dev 分支 git checkout dev # 如果决定使用 uv (推荐) -## 首先要安装uv, 例如通过 pip 或者其他包管理器 python3 -m pip install uv uv sync --all-extras # 同步开发运行环境 @@ -72,13 +67,12 @@ uv run heurams # 验证包安装 uv run heurams-tui # 启动 TUI -# 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不便支持 uv 与硬链接的环境和文件系统(例如 termux)运行 HeurAMS) +# 如果决定使用原生 python 环境 (不推荐, 但我们保留了这种方式以便在不便支持 uv 与硬链接的环境和文件系统(例如 termux)上运行) -## 安装依赖并将 HeurAMS 安装为本地包 -python3 -m pip install -r requirements.txt -python3 -m pip install -e . +python3 -m pip install -e .[all] # 安装依赖并将 HeurAMS 安装为本地包 python3 -m heurams # 验证安装 + python3 -m heurams.interface # 启动 TUI ``` @@ -109,10 +103,9 @@ HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: 您可以: -- 协助创建各种语言的翻译来翻译软件的界面 (但我们目前还没有 i18n 平台, 所以如果您想贡献翻译, 可能需要手动联系我们) -- 制作图像、主题、音效乃至制作开放的记忆单元集给其他用户使用 +- 协助创建或核对各种语言的翻译来翻译软件的界面和文档 +- 制作开放的记忆单元集(包括但不限于文字、图像、音效)给其他用户使用 - 改进软件配套的文档 -- 维护软件的开发/交流群组 - 给其他用户答疑解惑或分享自己的经验 - 在讨论区提出新想法或反馈问题 diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000..83ef045 --- /dev/null +++ b/FAQ.md @@ -0,0 +1,407 @@ +# 常见问题 + +## 什么是终端模拟器? + +终端模拟器是在图形桌面环境中模拟并使用终端的应用程序, 例如 KDE Konsole, GNOME Terminal, Windows Terminal, iTerm2 等. + +较旧 Windows 的那个很寒酸的小黑窗口也是终端模拟器(conhost.exe), 但它对此软件基本用户界面(以及一切现代终端应用)支持不佳, 建议在 Windows 平台使用 WezTerm (支持 sixel) 或 Windows Terminal (不支持 sixel). + +## 软件支持移动设备吗? + +基本用户界面 (Textual TUI) 可在 Android Termux 中良好运行. + +此外, 正在开发的 KiriMemo 前端基于 KDE Kirigami 框架, 将原生支持 Android 和 iOS. + +## HeurAMS 和 Anki 有什么区别? + +大体地说: + +| 方面 | HeurAMS | Anki | +|------|---------|------| +| 数据格式 | 文本文件 (TOML/JSON), 人类可读 | SQLite 和资源文件组成的专有压缩格式 (.apkg) | +| 复习模式 | 多阶段流程 + 多种谜题类型 | 单面/双面闪卡 | +| 算法系统 | 模块化, 可插拔, 多种算法可选 | 内置 SM-2 / FSRS | +| 插件生态 | 较少, 体现于类似微内核架构的"能力扩展", 例如新算法或新服务 | 多, 但为不受限的"猴子补丁" | +| 用户基数 | 少 | 多 | +| 现有资源丰富度 | 少 | 多 | +| AI 辅助产生单元集/牌组 | 原生支持 | 困难 | +| 协议 | AGPL-3.0, 有一个附加豁免条款 | AGPL-3.0 | + +## 软件是免费的吗? + +是的, 完全免费, 且开源. 您无需支付任何费用即可使用全部功能. + +## 黑乎乎的这个界面我怎么用? + +得益于微软几十年对用户进行的"命令行即落后"教育, 以及 `conhost.exe` 和 `cmd.exe` 的糟糕体验, 您对终端用户界面感到不适应是完全正常的. + +但实际上, 虽然看起来像老式电脑屏幕, Textual 和终端标准其实比您想象得要现代一些. + +### 可以用鼠标 + +现代终端模拟器 (如 Windows Terminal、Konsole、iTerm2、WezTerm 等) 支持一个叫做 "鼠标跟踪" (Mouse Tracking) 的功能, 而 Textual 启动时会发送特殊指令给终端让它报告鼠标事件. + +所以可能和您的想象不同, 您事实上可以直接用鼠标点击按钮, 就像使用普通软件一样. + +### 也可以用键盘 +- `Tab` 键在不同区域之间切换焦点 +- `方向键` 在列表中上下移动 +- `Enter` 确认选择 +- `q` 返回 +- 屏幕上会有按键提示, 例如 `[n] 导航器` 表示按 `n` 键打开导航器 + +### 触屏也可以 +在平板或手机 Termux 中, 您可以触摸或者滑动屏幕操作. + +## 我怎么启动这个软件? + +首先需要确保系统中安装了 Python (推荐 3.12.13 版本) 并安装了 HeurAMS 的所需组件. + +### Windows +打开"命令提示符"或"PowerShell", 输入以下命令后按回车, 或者把这玩意另存为快捷方式: + +``` +python -m heurams.interface +``` + +### macOS +打开"终端"应用程序, 输入以上命令. + +### Linux +打开您的终端模拟器 (一般是按 Ctrl + Alt + T), 输入以上命令. + +如果您觉得每次输入命令太麻烦, 可以创建一个桌面快捷方式或脚本文件, 详见网上的相关教程. + +## 我怎么退出软件? + +按键盘上的 `q` 键返回主界面后退出. + +您的学习进度会自动保存, 不会丢失. + +## 我看不到图片怎么办? + +终端模拟器需要支持 sixel 图像协议才能显示图片. + +- WezTerm (适用于几乎所有操作系统): 支持 +- KDE Konsole: 支持 +- GNOME Terminal: 不支持 +- iTerm2 (macOS): 支持 +- Windows Terminal: 不支持 +- mintty (Windows): 支持 + +如果您的终端不支持图片, 软件的其他功能不受影响, 只是记忆内容中的图片无法显示. + +## 中文显示成乱码或方框怎么办? + +这说明您没有正确设置终端中文字体. 请检查: + +1. 您没有使用 getty 和 xterm 这种明确不支持非 ASCII 字体的终端 +2. 终端设置中的字体选项, 选择一款支持中文的字体, 例如 "Noto Sans SC", "微软雅黑", "Source Han Sans" +3. 确保终端的字符编码设置为 UTF-8 (通常是默认值) + +## 我的数据存哪里了? 会不会丢? + +数据存储在软件安装目录下的 `data/` 文件夹中: + +- 您可以用记事本直接打开查看和修改 +- 复制粘贴 `data/` 文件夹到 U 盘或网盘即可完成备份 (推荐定期备份) +- 即使软件卸载了, 只要保留 `data/` 文件夹, 重新安装后复制回去, 所有学习记录都在 + +## 怎么跟朋友分享我的单元集? + +找到 `data/repo/` 下的对应文件夹, 复制整个文件夹发给朋友即可. 对方把它放到自己的 `data/repo/` 目录下就能用. + +您也可以导出为单一文本文件或压缩包, 通过微信、QQ、邮件等方式分享. + +## 我复制粘贴不了内容? + +一般来说, 在终端中: + +- 复制: Ctrl+Shift+C +- 粘贴: Ctrl+Shift+V + +这和普通软件的操作习惯不太一样(因为 Ctrl + C 在终端中的语义是 "中断进程"), 但稍加适应即可. + +## 字体太小/太大怎么办? + +在您的终端模拟器设置中找到"字体大小"选项进行调整. + +软件会跟随终端的字体设置. + +## 为什么我的界面和截图不一样? + +截图使用的是 KDE Plasma 桌面上的 Konsole, 80x25 字符尺寸, Cascadia Code 和 Noto Sans SC 字体. + +如果您的终端尺寸更大, 界面会更宽裕; 如果使用不同字体或者不同操作系统, 视觉效果会略有差异. + +功能上完全一致. + +## 评分 (1-5) 是什么意思? 我该怎么打分? + +需要说明的是, 我们非常不鼓励这种类似 Anki, 让用户自己直接给自己评分的单元集设计(在我们的程序中, 这种方式的实现被称为 `basic_puzzle`, 基本只用于算法测试). + +因为我们认为这种方式非常主观, 而且还需要您思考"我是多少分""我是不是乐观了""我是不是分低了""我要是把分评错了怎么办"这一系列打断记忆进程且令人焦虑的问题, 这本质上是把责任推给用户, 并且违背了认知科学原理. + +并且这种方式于学术研究与实验不利, 用户自评分产生的数据是不可靠的. + +因此 HeurAMS 的前端内建了基于用户行为分析的自动评分系统, 也就是"谜题". + +它会根据题目本身难度和您的答题行为(包括但不限于正确性, 操作回退次数, 有效答题时间)并自动为您评分. + +但如果您或者某个单元集选择使用 `basic_puzzle`, 或者打算自己实现自动评分系统, 分数含义如下: + +| 分数 | 含义 | 说明 | +|------|------|------| +| 1 | 完全忘了 | 一点都没想起来, 跟没学过一样 | +| 2 | 模糊 | 好像见过, 但答不上来 | +| 3 | 有点印象 | 想了一会儿才答对, 不太确定 | +| 4 | 比较顺利 | 能答对, 但稍微犹豫了一下 | +| 5 | 非常轻松 | 立刻反应过来, 毫不费力 | + +- 打 **1-2 分**: 软件会认为您还没掌握, 短期内会再次安排复习 +- 打 **3 分**: 正常掌握, 按计划间隔复习 +- 打 **4-5 分**: 掌握得很好, 下次复习间隔会拉长 + +我们建议您不要纠结, 凭第一感觉打分就好, 软件会根据您的评分自动调整复习节奏. + +当然我们还是建议尽量避免这种方式并尽量使用其他谜题评测. + +您可能认为那种方式可以让用户直接"干预"算法, 类似百词斩的"斩"功能用于跳过已经熟悉的内容, 实际上您并不需要那样做: 我们内建了"快速通过/正确应答"功能, 等同于直接选择"5". + +## 我每天都要打开软件吗? 不学会怎样? + +理论上不需要每天打开. 软件会自动记录每个知识点下次该复习的时间. + +但建议您每天打开软件看下状态. + +即使隔了几天甚至几周没学: + +- 已经记住的知识点不会消失, 只是下次复习时会多复习几次 +- 学习记录完好保存在 `data/` 文件夹里, 不会丢失 + +建议尽量按软件的提醒复习, 效果最好; 但忙的时候跳过几天也没关系. + +## 能同时学多个科目吗? + +可以. + +每个科目或课程可以做成独立的"单元集". + +## 我换电脑了, 怎么迁移数据? + +1. 在旧电脑上复制整个 `data/` 文件夹到 U 盘或网盘 +2. 在新电脑上安装好 HeurAMS +3. 用 U 盘里的 `data/` 文件夹覆盖新电脑上的 `data/` 文件夹 + +所有学习记录、配置、单元集全部迁移完毕. + +## 一些术语听不懂 + +| 术语 | 意思 | +|------|--------| +| **单元集** | 相当于"一本书"或"一门课", 包含一系列知识点 | +| **谜题** | 测试您的题目类型 (选择题、填空题等) | +| **算法** | 决定什么时候该复习哪个知识点的"智能排课表" | +| **复习队列** | 今天需要复习的知识点列表 | +| **激活** | 第一次开始学习某个知识点 | +| **到期** | 到了该复习这个知识点的时间了 | + +## 软件卡住了/没反应怎么办? + +1. 建议先等片刻 +2. 如果不行, 直接关闭终端窗口 +3. 重新打开软件 +4. 如果您有时间的话, 欢迎报告问题, 我们为此深表歉意 + +## 同时用 Anki 和 HeurAMS 会冲突吗? + +不会. + +两者是独立的软件, 数据互不影响. 您可以逐步将内容迁移到 HeurAMS, 也可以两个一起用. + +## 我需要安装 Python 吗? + +需要的, HeurAMS 是基于 Python 的软件. + +- Windows/macOS: 从 python.org 下载安装即可 +- Linux: 系统通常已自带 Python +- Android: 安装 Termux 应用, 然后在 Termux 中安装 Python (运行 `pkg in python`) + +如果看到"python 不是内部或外部命令"的提示, 说明 Python 没有正确安装或添加到系统路径, 搜索"Python 安装教程"按步骤操作即可. + +HeurAMS 建议的 Python 版本是 3.12.13. + +## 软件安全吗? 会不会有病毒? + +HeurAMS 是开源软件, 所有代码公开可查阅, 不会有病毒或后门. + +它只读写自己的 `data/` 文件夹, 不会动您电脑上的其他文件. + +## 软件报错, 出现一堆我看不懂的英文怎么办? + +1. 把错误信息复制下来 +2. 先找一下这个页面有没有收录您遇到的问题 +3. 如果没有, 可以和软件日志一起上传到 issues, 我们会尽快处理 + +## 复习到一半可以暂停吗? 下次会从头开始吗? + +暂时没有保存中间状态的功能, 但我们很快会添加. + +## 怎么看我学了多少? 有统计吗? + +仪表盘界面会显示统计信息. + +您可以通过导航器随时回到仪表盘查看. + +## 我觉得复习太快/太慢了, 能调吗? + +可以. 您可以通过切换算法或调整算法参数或改变记忆单元数来改变复习节奏. + +在设置界面可以找到相关设置. + +## 能换界面颜色/主题吗? + +能的, Textual 框架提供了多种主题. + +## 我不小心删了东西, 能恢复吗? + +这取决于您系统是否启用回收站, 软件本身没有自动备份功能. + +## 能把软件放 U 盘随身带吗? + +可以. 将整个 HeurAMS 文件夹复制到 U 盘, 在任意电脑上安装 Python 后运行即可. `data/` 目录下的学习数据也会一同携带. + +## 怎么关掉语音朗读? + +在设置界面中找到 TTS 相关选项, 将其关闭即可. + +## 哪里可以下载别人做好的单元集? + +目前项目还没有官方的单元集市场. + +但随着社区发展, 未来可能会有用户分享的单元集, 您也可以和朋友互相分享. + +## 我能把学习内容导出打印吗? + +可以. + +软件本身支持将单元集导出为单一文本文件, 您可以用任何文本编辑器打开并打印. 也可以直接复制内容到 Word 等软件. + +## 我想从头重新学, 怎么重置? + +删除 `data/repo/` 下对应单元集文件夹中的 `algodata.json` 文件即可重置所有学习进度. + +## 如何创建自己的单元集? + +在 `data/repo/` 目录下创建一个新文件夹, 包含以下文件即可: + +``` +data/repo/my_pack/ +├── manifest.toml # 元信息: title, author 等 +├── typedef.toml # 通用字段定义和谜题配置 +├── payload.toml # 记忆条目内容 +├── algodata.json # 算法状态数据 (可留空) +└── schedule.toml # 复习策略配置 +``` + +您也可以使用我们提供的工具从 CSV 等格式转换, 或利用 AI 工具生成. + +## 如何切换算法? + +设置界面中有详细的说明. + +## 如何从 Anki 导入? + +暂时没有迁移工具, 因为两个软件的设计思路不同. + +但欢迎关注 HeurStudio 项目, 它能从根本上解决内容创建与迁移问题 :) + +## 为什么不用 Flutter? + +Flutter 是构建跨平台图形界面的优秀框架, HeurAMS 的设计目标之一是保持核心程序库独立于特定前端. + +但 Flutter 在 "集成 python" 方面不如 PyOtherSide, 只能通过 RPC 标准件和程序库通讯, 并且 Flutter 的桌面多窗口一直以来没有被官方稳定支持, 所以我们暂时放弃了 Flutter 而选择了 Kirigami. + +当前我们优先开发了基于 Textual 的 TUI 前端和基于 Kirigami 的原生前端, 但这不排除未来出现 Flutter 或其他框架前端的可能性. + +如果您有兴趣开发 Flutter 前端, 欢迎参考[贡献指南](CONTRIBUTING.md#新的用户界面前端). + +## 软件需要联网吗? + +核心复习功能完全离线可用. 以下功能需要联网: + +- 文本转语音 (TTS) 的 Edge TTS 提供者 +- LLM 提供者 (如 OpenAI 兼容 API) +- 从远程仓库下载单元集 + +## 许可证中的"本机 API 调用豁免"是什么? + +简言之, 如果您在自己的程序中通过本地进程间 API 方式的通信 (如同一主机上的 RPC 调用) 使用 HeurAMS, 而无需通过网络转发, 则您的程序不受 AGPL-3.0 许可证的约束. + +这项附加条款旨在鼓励第三方前端和工具的开发. + +所以 HeurAMS 的许可证实质上是比原始的 AGPL-3.0 松一点的. + +## HeurAMS 和百词斩有什么区别? + +大体地说: + +| 方面 | HeurAMS | 百词斩 | +|------|---------|--------| +| 使用场景 | 电脑/终端 | 手机 App | +| 学习内容 | 任何知识, 不限语言和科目 | 英语单词 | +| 记忆策略 | 多算法可选, 可自定义复习流程 | 固定算法, 不可调 | +| 测验方式 | 选择题/填空题/识别题等多种谜题 | 看图选词/听音选义等多种谜题 | +| 内容创建 | 自己创建或导入, 完全自由 | 仅官方提供词书 | +| 费用 | 完全免费, 无内购 | 免费记忆功能 + 付费课程 | +| 数据所有权 | 数据在您自己手上, 文本文件 | 数据不可被提取 | +| 离线使用 | 核心功能完全离线 | 部分功能需联网 | +| 学习统计 | 基础统计 | 打卡/排行榜/社交 | + +## 百词斩有图片联想记忆, HeurAMS 也有吗? + +支持. + +如果您的终端支持图片显示 (如 Konsole 或者 WezTerm), 单元集中可以包含图片, 复习时会直接展示. + +但图片需要您自己放入单元集. + +## 百词斩有打卡和排行榜, HeurAMS 有吗? + +目前没有. + +HeurAMS 不设打卡、排行榜或社交功能, 也不向任何人收集您的学习数据. + +## 百词斩有现成的词书, HeurAMS 去哪找内容? + +百词斩的课程是官方制作好的, HeurAMS 的内容需要您自己创建或从社区获取. + +详见"如何创建自己的单元集?". + +## 百词斩在手机上用很方便, HeurAMS 能在手机用吗? + +可以, 但现阶段需要您"折腾"一下. + +Android 手机安装 Termux 后可运行 HeurAMS 的基本用户界面. + +此外, 正在开发的 KiriMemo 前端将原生支持 Android 和 iOS, 这就不需要用户去折腾了. + +## 百词斩能背单词, HeurAMS 还能学什么? + +任何需要记忆的知识都可以: 外语单词、医学名词、法律条文、历史年代、化学方程式、编程语法、乐谱符号... + +单元集的内容完全由您自己定义. + +## 百词斩学英语效果很好, 换成 HeurAMS 会不会效果差? + +考虑到百词斩的算法和词库是事实上闭源的, 我们无从得知算法来源. + +但 HeurAMS 的架构设计可保证单元集制成后效果不比百词斩差, 甚至优于百词斩. + +HeurAMS 的间隔重复算法基于相同的认知科学原理, 且算法透明可调, 您可以自由选择最适合自己的调度策略. + +## 如何参与项目? + +详见[贡献指南](CONTRIBUTING.md). + +即使不是开发者, 您也可以通过编写文档、制作记忆单元集、翻译界面、答疑等方式参与. diff --git a/README.md b/README.md index 668e616..d610f6a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - 此外, 算法模块是 "潜进" 内核 (heurams.kernel) 中的一等公民, 内核天然支持插拔各型算法 - 无需安装繁杂的插件即可分单元集完成算法快速切换与调优, 研究者可以方便地修改算法模块以便捷地进行研究与测试 - 默认使用 `SM-2` 简单间隔重复算法, 此算法亦用作 `Anki` 闪卡记忆软件的默认闪卡调度器 -- 还内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M (移植自 sm.js 项目)` 复杂间隔重复算法(逆向工程) +- 内置 `NSP-0` 筛选用非间隔重复算法以便快速筛选记忆内容, `FSRS` 先进间隔重复算法作为效率更高的调度器, 与 `SM-15M (移植自 sm.js 项目)` 复杂间隔重复算法(逆向工程) - 算法模块可以标记记忆项目, 也可以动态规划每个记忆单元的记忆间隔时间表, 动态跟踪记忆反馈数据, 以优化长期记忆保留率与稳定性 - 得益于项目的模块化架构与单元集结构设计, 一个项目甚至可以与任意种算法共存并互通, 这对研究者及想探索/实验高效率方法的用户极其友好 @@ -54,9 +54,11 @@ - 跨平台, 并支持触屏/鼠标/键盘多操作模式 - 与几乎所有现代终端模拟器相容 -- 对于[支持 sixel 协议的终端模拟器](https://www.arewesixelyet.com/), 可显示图像内容 +- 对于支持 sixel 协议的终端模拟器, 可显示图像内容 - 可通过 textual-web 作为服务部署, 并在任意浏览器使用 -- 简洁直观, 键盘友好, 且高效率的用户界面设计 +- 简洁直观, 键盘友好, 全功能且高效率的用户界面设计 +- 易于嵌入: 可在 getty/kmscon 中运行而无需任何桌面图形服务 +- 资源占用小, 运行流畅, 不拖泥带水 - 便于测试与调试程序库 [查看屏幕截图](SCREENSHOTS.md) @@ -98,7 +100,7 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ | 依赖组 | 包含模块 | 说明 | |--------|----------|------| -| 最小化安装 | tabulate, toml, transitions | 核心驱动程序库,始终必需 | +| 最小化安装 | tabulate, toml, transitions | 核心驱动程序库, 始终必需 | | interface | textual, psutil | 基本用户界面依赖 | | algo-fsrs | py-fsrs | FSRS 算法模块 | | tts-edgetts | edge-tts | 微软文本转语音 | @@ -113,6 +115,10 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ 我们提供原生 python 和 uv 两种安装方式. 详见[贡献指南](CONTRIBUTING.md). +## 常见问题 (FAQ) + +详见[常见问题](FAQ.md). + ## 项目架构 详见[架构说明](ARCHITECTURE.md). @@ -120,13 +126,14 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ## 参与项目 欢迎参与到项目协作中! -请参阅[贡献指南](CONTRIBUTING.md). +详见[贡献指南](CONTRIBUTING.md). ## 许可证 ### 项目本身 -本项目基于 AGPL-3.0 许可证开放源代码, 并有一个豁免本机 API 调用的附加条款. +本项目基于 AGPL-3.0 许可证开放源代码, 并有一个豁免本机 API 调用的附加条款, 较标准 AGPL-3.0 更松. + 详见根目录下 [LICENSE](LICENSE) 文件. ### 第三方代码 diff --git a/data/repo/stub/draft.txt b/data/repo/stub/draft.txt index 2f25553..7485637 100644 --- a/data/repo/stub/draft.txt +++ b/data/repo/stub/draft.txt @@ -16,7 +16,7 @@ X射线衍射 -> 复杂分子, 分析键长键角 可以在光照下和卤素单质发生取代(卤素单质光照下生成自由基 发生自由基取代反应) 可以高温分解为小的烷烃和烯烃 不和酸性高锰酸钾, 酸碱反应, 不和Br2(CCl4)反应 -除 CH3Br 为气体外,多溴代物为液体("油状液滴"), CBr4是固体 +除 CH3Br 为气体外, 多溴代物为液体("油状液滴"), CBr4是固体 光照用紫外灯或强日光(太阳光直射),不能用普通白炽灯 uv含量低 diff --git a/src/heurams/context.py b/src/heurams/context.py index b0e008d..74b2b0e 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -24,7 +24,7 @@ logger.debug(f"工作目录: {workdir}") (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) -config_var: ContextVar[ConfigDict].get = ContextVar( +config_var: ContextVar[ConfigDict] = ContextVar( "config_var", default=ConfigDict(workdir / "data" / "config"), ) diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index 86e3733..166fa77 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -85,7 +85,7 @@ class FavoriteManagerScreen(Screen): def _encode_favorite_key(self, repo_path: str, ident: str) -> str: """编码仓库路径和标识符为安全的按钮 ID 部分""" - # 使用 \x00 分隔两部分,然后进行 base64 编码 + # 使用 \x00 分隔两部分, 然后进行 base64 编码 combined = f"{repo_path}\x00{ident}" encoded = base64.urlsafe_b64encode(combined.encode()).decode() # 去掉填充的等号 @@ -114,7 +114,7 @@ class FavoriteManagerScreen(Screen): # 创建安全的按钮 ID button_key = self._encode_favorite_key(fav.repo_path, fav.ident) - # 创建列表项,包含移除按钮 + # 创建列表项, 包含移除按钮 container = Horizontal( Label(display_text, classes="favorite-content"), Button("移除", id=f"remove-{button_key}", variant="error", flat=True, classes="favorite-item-btn"), diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index fbc8596..630bd7f 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -237,14 +237,14 @@ class MemScreen(Screen): """获取仓库相对路径(相对于 data/repo)""" if self.repo is None: return "" - # self.repo.source 是 Path 对象,指向仓库目录 + # self.repo.source 是 Path 对象, 指向仓库目录 repo_full_path = self.repo.source data_repo_path = Path(config_var.get()["global"]["paths"]["data"]) / "repo" try: rel_path = repo_full_path.relative_to(data_repo_path) return str(rel_path) except ValueError: - # 如果不在 data/repo 下,则返回完整路径(字符串形式) + # 如果不在 data/repo 下, 则返回完整路径(字符串形式) return str(repo_full_path) def _is_current_atom_favorited(self) -> bool: diff --git a/src/heurams/interface/screens/precache.py b/src/heurams/interface/screens/precache.py index cb7ffae..a337273 100644 --- a/src/heurams/interface/screens/precache.py +++ b/src/heurams/interface/screens/precache.py @@ -14,7 +14,7 @@ import heurams.kernel.particles as pt import heurams.services.hasher as hasher from heurams.context import * -# 兼容性缓存路径:优先使用 paths.cache,否则使用 data/cache +# 兼容性缓存路径:优先使用 paths.cache, 否则使用 data/cache paths = config_var.get()["global"]["paths"] cache_dir = pathlib.Path(paths.get("cache", paths["data"] + "/cache")) / "voice" @@ -55,7 +55,7 @@ class PrecachingScreen(Screen): self.precache_worker = None self.cancel_flag = 0 self.desc = desc - # 不再需要缓存配置,保留配置读取以兼容 + # 不再需要缓存配置, 保留配置读取以兼容 self.cache_stats = { "total_size": 0, "file_count": 0, diff --git a/src/heurams/interface/screens/synctool.py b/src/heurams/interface/screens/synctool.py index 19dc485..25149f9 100644 --- a/src/heurams/interface/screens/synctool.py +++ b/src/heurams/interface/screens/synctool.py @@ -130,7 +130,7 @@ class SyncScreen(Screen): log_widget = self.query_one("#log_output") log_widget.update("\n".join(self.log_messages)) # type: ignore except Exception: - pass # 如果组件未就绪,忽略错误 + pass # 如果组件未就绪, 忽略错误 def on_button_pressed(self, event: Button.Pressed) -> None: """处理按钮点击事件""" @@ -150,7 +150,7 @@ class SyncScreen(Screen): def test_connection(self): """测试 WebDAV 服务器连接""" if not self.sync_service: - self.log_message("同步服务未初始化,请检查配置", is_error=True) + self.log_message("同步服务未初始化, 请检查配置", is_error=True) self.update_status("❌ 同步服务未初始化") return @@ -172,7 +172,7 @@ class SyncScreen(Screen): def start_sync(self): """开始同步""" if not self.sync_service: - self.log_message("同步服务未初始化,无法开始同步", is_error=True) + self.log_message("同步服务未初始化, 无法开始同步", is_error=True) return if self.is_syncing: diff --git a/src/heurams/kernel/algorithms/fsrs.py b/src/heurams/kernel/algorithms/fsrs.py index 20128b7..070d319 100644 --- a/src/heurams/kernel/algorithms/fsrs.py +++ b/src/heurams/kernel/algorithms/fsrs.py @@ -26,13 +26,13 @@ _SCHEDULER_STATE_FILE = pathlib.Path( def _get_global_scheduler(): - """获取全局 FSRS Scheduler 实例,从文件加载或创建新的""" + """获取全局 FSRS Scheduler 实例, 从文件加载或创建新的""" if os.path.exists(_SCHEDULER_STATE_FILE): try: with open(_SCHEDULER_STATE_FILE, "r", encoding="utf-8") as f: return Scheduler.from_json(f.read()) except Exception: - logger.warning("FSRS Scheduler 状态文件加载失败,创建新实例") + logger.warning("FSRS Scheduler 状态文件加载失败, 创建新实例") return Scheduler() @@ -80,7 +80,7 @@ class FSRSAlgorithm(BaseAlgorithm): # FSRS 特有字段 fsrs_state: int # State 枚举值: 1=Learning, 2=Review, 3=Relearning fsrs_step: int # 当前学习步进索引, -1 表示 None (Review 状态) - fsrs_stability: float # 稳定性(秒),0.0 表示尚未计算 + fsrs_stability: float # 稳定性(秒), 0.0 表示尚未计算 fsrs_difficulty: float # 难度 [1.0, 10.0], 0.0 表示尚未计算 # 标准 BaseAlgorithm 兼容字段 real_rept: int @@ -194,7 +194,7 @@ class FSRSAlgorithm(BaseAlgorithm): if is_new_activation: card = Card() - logger.debug("新激活,创建新 Card") + logger.debug("新激活, 创建新 Card") else: card = cls._algodata_to_card(algodata) diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 0e0a5dc..9ed86a0 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -611,7 +611,7 @@ def _get_global_sm(): with open(_GLOBAL_STATE_FILE, "r", encoding="utf-8") as f: return SM.load(json.load(f)) except Exception: - logger.warning("SM-15M 全局状态文件加载失败,创建新实例") + logger.warning("SM-15M 全局状态文件加载失败, 创建新实例") sm = SM() _save_global_sm(sm) return sm @@ -646,7 +646,7 @@ class SM15MAlgorithm(BaseAlgorithm): # 毫秒精度(子日排程) last_date_ms: int next_date_ms: int - # BaseAlgorithm 兼容(天精度,向后兼容) + # BaseAlgorithm 兼容(天精度, 向后兼容) real_rept: int rept: int interval: int @@ -694,7 +694,7 @@ class SM15MAlgorithm(BaseAlgorithm): opt_days * 24 * 60 * 60 * 1000 if opt_days > 0 else sm.interval_base ) - # 毫秒精度优先,退化至天精度 + # 毫秒精度优先, 退化至天精度 last_date_ms = data.get("last_date_ms", 0) if last_date_ms: item.previous_date = datetime.datetime(1970, 1, 1) + datetime.timedelta( diff --git a/src/heurams/providers/llm/base.py b/src/heurams/providers/llm/base.py index af39413..d5c8a6a 100644 --- a/src/heurams/providers/llm/base.py +++ b/src/heurams/providers/llm/base.py @@ -26,14 +26,14 @@ class BaseLLM: """发送聊天消息并获取响应 Args: - messages: 消息列表,每个消息为 {"role": "user"|"assistant"|"system", "content": "消息内容"} - **kwargs: 其他参数,如 temperature, max_tokens 等 + messages: 消息列表, 每个消息为 {"role": "user"|"assistant"|"system", "content": "消息内容"} + **kwargs: 其他参数, 如 temperature, max_tokens 等 Returns: 模型返回的文本响应 """ logger.debug("BaseLLM.chat: messages=%d, kwargs=%s", len(messages), kwargs) - logger.warning("BaseLLM.chat 是基类方法,未实现具体功能") + logger.warning("BaseLLM.chat 是基类方法, 未实现具体功能") await asyncio.sleep(0) # 避免未使用异步的警告 return "BaseLLM 未实现具体功能" @@ -50,6 +50,6 @@ class BaseLLM: logger.debug( "BaseLLM.chat_stream: messages=%d, kwargs=%s", len(messages), kwargs ) - logger.warning("BaseLLM.chat_stream 是基类方法,未实现具体功能") + logger.warning("BaseLLM.chat_stream 是基类方法, 未实现具体功能") await asyncio.sleep(0) yield "BaseLLM 未实现流式功能" diff --git a/src/heurams/providers/llm/openai.py b/src/heurams/providers/llm/openai.py index 12609af..712cef1 100644 --- a/src/heurams/providers/llm/openai.py +++ b/src/heurams/providers/llm/openai.py @@ -27,8 +27,8 @@ class OpenAILLM(BaseLLM): try: from openai import AsyncOpenAI except ImportError: - logger.error("未安装 openai 库,请运行: pip install openai") - raise ImportError("未安装 openai 库,请运行: pip install openai") + logger.error("未安装 openai 库, 请运行: pip install openai") + raise ImportError("未安装 openai 库, 请运行: pip install openai") self._client = AsyncOpenAI( api_key=self.api_key if self.api_key else None, @@ -49,7 +49,7 @@ class OpenAILLM(BaseLLM): "max_tokens": kwargs.get("max_tokens", 1000), } - # 合并参数,优先使用传入的 kwargs + # 合并参数, 优先使用传入的 kwargs request_kwargs = {**default_kwargs, **kwargs} request_kwargs["messages"] = messages diff --git a/src/heurams/services/config.py b/src/heurams/services/config.py index b3718b5..d5e23f0 100644 --- a/src/heurams/services/config.py +++ b/src/heurams/services/config.py @@ -10,7 +10,7 @@ from heurams.services.exceptions import WTFException logger = get_logger(__name__) -class ConfigDict(UserDict): # 舒服了 +class ConfigDict(UserDict): _instances = {} # 必须使用单例模式, 不然有严重的多实例导致的配置无法持久化问题 def __new__(cls, config_path: pathlib.Path, dict=None): diff --git a/src/heurams/services/favorite_service.py b/src/heurams/services/favorite_service.py index 8c4ddb4..a2bcc4f 100644 --- a/src/heurams/services/favorite_service.py +++ b/src/heurams/services/favorite_service.py @@ -73,7 +73,7 @@ class FavoriteManager: with open(self._file_path, "r", encoding="utf-8") as f: data = json.load(f) self._favorites = [FavoriteItem.from_dict(item) for item in data] - logger.debug("收藏列表加载成功,共 %d 项", len(self._favorites)) + logger.debug("收藏列表加载成功, 共 %d 项", len(self._favorites)) except Exception as e: logger.error("加载收藏列表失败: %s", e) self._favorites = [] @@ -86,7 +86,7 @@ class FavoriteManager: data = [item.to_dict() for item in self._favorites] with open(self._file_path, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) - logger.debug("收藏列表保存成功,共 %d 项", len(self._favorites)) + logger.debug("收藏列表保存成功, 共 %d 项", len(self._favorites)) except Exception as e: logger.error("保存收藏列表失败: %s", e) diff --git a/src/heurams/tools/csv2payload.py b/src/heurams/tools/csv2payload.py index 359d60a..3b04a04 100755 --- a/src/heurams/tools/csv2payload.py +++ b/src/heurams/tools/csv2payload.py @@ -6,9 +6,9 @@ 转换规则: 1. `ident` 列用作 TOML 的 section 标题(`[ident]`) -2. 若某行的 `ident` 为空,则自动按顺序生成标识符,例如 `idx_1`、`idx_2` 等 +2. 若某行的 `ident` 为空, 则自动按顺序生成标识符, 例如 `idx_1`、`idx_2` 等 3. 所有其他列(除 `ident` 外)都作为该 section 下的键值对 -4. 所有列都是可选的,但 `ident` 为空时会自动生成 +4. 所有列都是可选的, 但 `ident` 为空时会自动生成 示例 CSV: ```csv @@ -61,8 +61,8 @@ meaning = "狗发出的声音" 补充说明: - 自动生成的标识符使用 `idx_` 前缀加数字序列 - 生成序列基于原始 CSV 中 `ident` 为空的行出现的顺序 -- 所有值都保留为字符串类型,符合 TOML 字符串格式要求 -- 如果 CSV 包含更多列,它们也会以相同方式转换为键值对 +- 所有值都保留为字符串类型, 符合 TOML 字符串格式要求 +- 如果 CSV 包含更多列, 它们也会以相同方式转换为键值对 - 支持 `-r` 参数指定随机种子来打乱 section 顺序 """ @@ -79,8 +79,8 @@ def csv_to_toml(csv_path, toml_path=None, random_seed=None): Args: csv_path (str): 输入CSV文件路径 - toml_path (str): 输出TOML文件路径,默认为相同目录下同名文件 - random_seed (int): 随机种子,用于打乱section顺序,None表示不打乱 + toml_path (str): 输出TOML文件路径, 默认为相同目录下同名文件 + random_seed (int): 随机种子, 用于打乱section顺序, None表示不打乱 """ # 检查CSV文件是否存在 csv_file = Path(csv_path) @@ -108,7 +108,7 @@ def csv_to_toml(csv_path, toml_path=None, random_seed=None): print("错误: CSV文件为空或格式不正确") sys.exit(1) - # 如果指定了随机种子,设置随机种子并打乱行顺序 + # 如果指定了随机种子, 设置随机种子并打乱行顺序 if random_seed is not None: random.seed(random_seed) random.shuffle(rows) @@ -119,7 +119,7 @@ def csv_to_toml(csv_path, toml_path=None, random_seed=None): idx_counter = 1 for row in rows: - # 处理ident列,为空时生成自动标识符 + # 处理ident列, 为空时生成自动标识符 ident = row.get("ident", "").strip() if not ident: ident = f"idx_{idx_counter}" @@ -155,7 +155,7 @@ def csv_to_toml(csv_path, toml_path=None, random_seed=None): def main(): """主函数""" parser = argparse.ArgumentParser( - description="将CSV文件转换为TOML格式,支持随机打乱section顺序", + description="将CSV文件转换为TOML格式, 支持随机打乱section顺序", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 示例: @@ -168,10 +168,10 @@ def main(): parser.add_argument("csv_path", help="输入的CSV文件路径") parser.add_argument( - "toml_path", nargs="?", help="输出的TOML文件路径,默认为CSV同名文件" + "toml_path", nargs="?", help="输出的TOML文件路径, 默认为CSV同名文件" ) parser.add_argument( - "-r", "--random-seed", type=int, help="随机种子,用于打乱TOML section的顺序" + "-r", "--random-seed", type=int, help="随机种子, 用于打乱TOML section的顺序" ) args = parser.parse_args() From d33aa7055b5f1d27ab9255445abb8dafae704790 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 17:50:30 +0800 Subject: [PATCH 73/79] =?UTF-8?q?fix:=20=E6=80=BB=E4=BD=93=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E6=94=B9=E8=BF=9B=E4=B8=8E=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 186 ++----- AGENTS.md | 50 ++ data/misc/favorites.json5 | 482 ------------------ data/repo/stub/algodata.json | 14 - data/repo/stub/draft.txt | 22 - data/repo/stub/manifest.toml | 4 - data/repo/stub/payload.toml | 5 - data/repo/stub/schedule.toml | 11 - data/repo/stub/typedef.toml | 17 - src/heurams/assets/art/logo-mono-dark.svg | 25 + src/heurams/assets/art/logo-mono-light.svg | 25 + src/heurams/assets/art/logo.svg | 25 + src/heurams/assets/data/cache/.keep | 0 .../heurams/assets/data}/config/_.toml | 0 .../heurams/assets/data}/config/global.toml | 0 .../assets/data}/config/interface/_.toml | 0 .../assets/data}/config/interface/global.toml | 0 .../data}/config/interface/puzzles/_.toml | 0 .../data}/config/interface/puzzles/cloze.toml | 0 .../data}/config/interface/puzzles/mcq.toml | 0 .../data}/config/interface/widgets/_.toml | 0 .../config/interface/widgets/recognition.toml | 0 .../assets/data}/config/providers/_.toml | 0 .../assets/data}/config/providers/tts/_.toml | 0 .../data}/config/providers/tts/edgetts.toml | 0 .../heurams/assets/data}/config/repo/_.toml | 0 .../assets/data}/config/repo/cngk-t.toml | 0 .../assets/data}/config/repo/cngk.toml | 0 .../assets/data}/config/services/_.toml | 0 .../assets/data}/config/services/audio.toml | 0 .../assets/data}/config/services/llm.toml | 0 .../assets/data}/config/services/sync.toml | 0 .../assets/data}/config/services/timer.toml | 0 .../assets/data}/config/services/tts.toml | 0 src/heurams/assets/data/misc/.keep | 0 src/heurams/assets/data/repo/.keep | 0 src/heurams/assets/data/session/.keep | 0 src/heurams/context.py | 9 +- src/heurams/services/version.py | 2 +- 39 files changed, 163 insertions(+), 714 deletions(-) create mode 100644 AGENTS.md delete mode 100644 data/misc/favorites.json5 delete mode 100644 data/repo/stub/algodata.json delete mode 100644 data/repo/stub/draft.txt delete mode 100644 data/repo/stub/manifest.toml delete mode 100644 data/repo/stub/payload.toml delete mode 100644 data/repo/stub/schedule.toml delete mode 100644 data/repo/stub/typedef.toml create mode 100644 src/heurams/assets/art/logo-mono-dark.svg create mode 100644 src/heurams/assets/art/logo-mono-light.svg create mode 100644 src/heurams/assets/art/logo.svg create mode 100644 src/heurams/assets/data/cache/.keep rename {data => src/heurams/assets/data}/config/_.toml (100%) rename {data => src/heurams/assets/data}/config/global.toml (100%) rename {data => src/heurams/assets/data}/config/interface/_.toml (100%) rename {data => src/heurams/assets/data}/config/interface/global.toml (100%) rename {data => src/heurams/assets/data}/config/interface/puzzles/_.toml (100%) rename {data => src/heurams/assets/data}/config/interface/puzzles/cloze.toml (100%) rename {data => src/heurams/assets/data}/config/interface/puzzles/mcq.toml (100%) rename {data => src/heurams/assets/data}/config/interface/widgets/_.toml (100%) rename {data => src/heurams/assets/data}/config/interface/widgets/recognition.toml (100%) rename {data => src/heurams/assets/data}/config/providers/_.toml (100%) rename {data => src/heurams/assets/data}/config/providers/tts/_.toml (100%) rename {data => src/heurams/assets/data}/config/providers/tts/edgetts.toml (100%) rename {data => src/heurams/assets/data}/config/repo/_.toml (100%) rename {data => src/heurams/assets/data}/config/repo/cngk-t.toml (100%) rename {data => src/heurams/assets/data}/config/repo/cngk.toml (100%) rename {data => src/heurams/assets/data}/config/services/_.toml (100%) rename {data => src/heurams/assets/data}/config/services/audio.toml (100%) rename {data => src/heurams/assets/data}/config/services/llm.toml (100%) rename {data => src/heurams/assets/data}/config/services/sync.toml (100%) rename {data => src/heurams/assets/data}/config/services/timer.toml (100%) rename {data => src/heurams/assets/data}/config/services/tts.toml (100%) create mode 100644 src/heurams/assets/data/misc/.keep create mode 100644 src/heurams/assets/data/repo/.keep create mode 100644 src/heurams/assets/data/session/.keep diff --git a/.gitignore b/.gitignore index f317883..cfb89a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,19 @@ -# Project specific additions -.devflag -.vscode/ -.directory -__pycache__/ -.idea/ -cache/ -data/repo/cngk -data/repo/eotgk -data/repo/evtgk -data/misc -data/cache -data/session -*.egg-info/ -build/ -dist/ -old/ -AGENT.md -AGENTS.md +# HeurAMS specific rules *.log.* +*.log *.pkl +/data + +# Editor +.vscode/ +.idea/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class -# C extensions -*.so - # Distribution / packaging -.Python build/ develop-eggs/ dist/ @@ -47,16 +32,6 @@ share/python-wheels/ *.egg MANIFEST -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - # Unit test / coverage reports htmlcov/ .tox/ @@ -71,73 +46,10 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ -.claude/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ # Jupyter Notebook .ipynb_checkpoints -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly used for packaging. -#poetry.lock -#poetry.toml - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -#pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - # Environments .env .venv @@ -147,72 +59,32 @@ ENV/ env.bak/ venv.bak/ -# Spyder project settings -.spyderproject -.spyproject +# Linux +*~ +.fuse_hidden* +.directory +.Trash-* +.nfs* +## KDE Dolphin +.directory -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -.idea/ - -# Audio cache and temporary files -*.mp3 -*.wav -*.ogg -*.tmp - -# LLM cache files -*.cache -*.jsonl - -# Log files -*.log -logs/ - -# OS generated files +# macOS .DS_Store -.DS_Store? +.AppleDouble +.LSOverride ._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db +.AppleDB +.AppleDesktop # Windows Thumbs.db +Thumbs.db:encryptable ehthumbs.db -Desktop.ini +ehthumbs_vista.db +[Dd]esktop.ini +$RECYCLE.BIN/ +*.lnk -# Linux -*~ - -# VSCode -.vscode/ -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Temporary files -*.tmp -*.temp +# Other trash +AGENT.md +# It's not AGENTS.md \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4badd4c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,50 @@ +# AI 编程工具说明 + +本文档为 AI 工具以及在使用 AI 辅助向 HeurAMS 项目贡献代码时的开发者提供指导. + +AI 工具必须完整阅读此 `/AGENTS.md` 文件. + +## 查阅开发文档 + +在帮助进行 HeurAMS 开发时,AI 工具应遵循标准的开发规范与流程, 应当自动查看或是在用户发出"初始化"指令后查看: + +- [贡献指南](/CONTRIBUTING.md) +- [自述文件](/README.md) +- [项目架构](/ARCHITECTURE.md) + +## 明确禁止行为 + +1. 禁止 AI 自动生成 PR 或 patch 文件 +2. 禁止 AI 在未经人工确认的情况下修改现有代码 +3. 禁止 AI 不使用格式化工具而生成格式化文件的行为 +4. 禁止 AI 修复任何"bug", 而不经人工确认 +5. 绝对禁止修改此 `/AGENTS.md` 文件 +6. 禁止一切不遵循项目设计原则, 另造独立库的 "糊屎" 行为 +7. 禁止 AI 直接操作 pip, uv, apt 等工具修改外部依赖或工具, 而应让人类开发者自己操作依赖 +8. 禁止使用不同于任何现有文件的现有注释语言的其他语言写新注释 +9. 禁止不读文件就直接覆写 + +## 许可证与法律要求 + +所有贡献必须符合许可要求, 所有代码必须与 AGPL-3.0-or-later 许可以及项目附加豁免条款(位于 LICENSE 文件尾部 237 至 245 行)兼容. + +## Signed-off-by 与 DCO + +AI 代理**严禁添加** Signed-off-by 标签. + +只有人类能够合法地认证 DCO. + +人类提交者负责: + +- 审阅所有 AI 生成的代码 +- 确保符合许可要求 +- 添加自己的 Signed-off-by 标签以认证 DCO +- 对贡献负责任 + +AI 助手负责: + +- 了解运行环境, 例如操作系统或具体发行版 +- 遵循此文档所述规则 +- 主动提醒使用 AI 工具的开发者 + +本文档参考自 [AI Coding Assistants — The Linux Kernel documentation](https://docs.kernel.org/process/coding-assistants.html) diff --git a/data/misc/favorites.json5 b/data/misc/favorites.json5 deleted file mode 100644 index a8078f5..0000000 --- a/data/misc/favorites.json5 +++ /dev/null @@ -1,482 +0,0 @@ -[ - { - "repo_path": "cngk-t", - "ident": "庄宗受而藏之于庙. 其后用兵, 则遣从事以一少牢告庙, 请其矢, 盛以锦囊, 负而前驱, 及凯旋而纳之", - "added": 1777679860, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "方其系燕父子以组, 函梁君臣之首, 入于太庙, 还矢先王, 而告以成功, 其意气之盛, 可谓壮哉!", - "added": 1777684719, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "洎牧以谗诛, 邯郸为郡, 惜其用武而不终也.", - "added": 1777748505, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "苟以天下之大, 下而从六国破亡之故事, 是又在六国下矣.", - "added": 1777749120, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "故木受绳则直, 金就砺则利, 君子博学而日参省乎己, 则知明而行无过矣.", - "added": 1777749248, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "假舆马者, 非利足也, 而致千里; 假舟楫者, 非能水也, 而绝江河.", - "added": 1777749385, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "向使三国各爱其地, 齐人勿附于秦, 刺客不行, 良将犹在,", - "added": 1777749648, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "则胜负之数, 存亡之理, 当与秦相较, 或未易量.", - "added": 1777749737, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "呜呼! 以赂秦之地封天下之谋臣, 以事秦之心礼天下之奇才, 并力西向,", - "added": 1777749774, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "积土成山, 风雨兴焉; 积水成渊, 蛟龙生焉; 积善成德, 而神明自得, 圣心备焉.", - "added": 1777750294, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "锲而舍之, 朽木不折; 锲而不舍, 金石可镂.", - "added": 1777750446, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "寻寻觅觅, 冷冷清清, 凄凄惨惨戚戚. 乍暖还寒时候, 最难将息. 三杯两盏淡酒, 怎敌他、晚来风急! 雁过也, 正伤心, 却是旧时相识.", - "added": 1777750594, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "满地黄花堆积, 憔悴损, 如今有谁堪摘? 守着窗儿, 独自怎生得黑? 梧桐更兼细雨, 到黄昏、点点滴滴. 这次第, 怎一个愁字了得!", - "added": 1777750678, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "夫六国与秦皆诸侯, 其势弱于秦, 而犹有可以不赂而胜之之势.", - "added": 1777750884, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "登高而招, 臂非加长也, 而见者远; 顺风而呼, 声非加疾也, 而闻者彰.", - "added": 1777750964, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "故不积跬步, 无以至千里; 不积小流, 无以成江海.", - "added": 1777751066, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "且燕赵处秦革灭殆尽之际, 可谓智力孤危, 战败而亡, 诚不得已.", - "added": 1777751570, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "货恶其弃于地也, 不必藏于己; 力恶其不出于身也, 不必为己.", - "added": 1777846911, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "是故谋闭不兴, 盗窃乱贼而不作.", - "added": 1777846943, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "花径不曾缘客扫, 蓬门今始为君开.", - "added": 1777846974, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "盘飧市远无兼味, 樽酒家贫只旧醅.", - "added": 1777847000, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "五花马、千金裘, 呼儿将出换美酒, 与尔同销万古愁!", - "added": 1777847065, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "屈平疾王听之不聪也, 谗谄之蔽明也, 邪曲之害公也, 方正之不容也, 故忧愁幽思而作《离骚》.", - "added": 1777847121, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "夫天者, 人之始也; 父母者, 人之本也.", - "added": 1777847174, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "人穷则反本, 故劳苦倦极, 未尝不呼天也; 疾痛惨怛, 未尝不呼父母也.", - "added": 1777847195, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "信而见疑, 忠而被谤, 能无怨乎?", - "added": 1777847267, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "屈平正道直行, 竭忠尽智以事其君, 谗人间之, 可谓穷矣.", - "added": 1777847825, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "上称帝喾, 下道齐桓, 中述汤武, 以刺世事.", - "added": 1777874192, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "明道德之广崇, 治乱之条贯, 靡不毕见.", - "added": 1777876114, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "其文约, 其辞微, 其志洁, 其行廉.", - "added": 1777884008, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "其志洁, 故其称物芳; 其行廉, 故死而不容.", - "added": 1777884045, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "生乎吾前, 其闻道也固先乎吾, 吾从而师之;", - "added": 1777884247, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "吾师道也, 夫庸知其年之先后生于吾乎?", - "added": 1777884298, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "是故无贵无贱, 无长无少, 道之所存, 师之所存也.", - "added": 1777884338, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "嗟乎! 师道之不传也久矣! 欲人之无惑也难矣!", - "added": 1777884371, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "古之圣人, 其出人也远矣, 犹且从师而问焉;", - "added": 1777884425, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "今之众人, 其下圣人也亦远矣, 而耻学于师.", - "added": 1777884480, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "圣人之所以为圣, 愚人之所以为愚, 其皆出于此乎!", - "added": 1777884505, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "爱其子, 择师而教之; 于其身也, 则耻师焉, 惑矣.", - "added": 1777884537, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "彼童子之师, 授之书而习其句读者, 非吾所谓传其道解其惑者也.", - "added": 1777884705, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "问之, 则曰: “彼与彼年相若也, 道相似也.", - "added": 1777884818, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "其称文小而其指极大, 举类迩而见义远.", - "added": 1777884887, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "惑而不从师, 其为惑也, 终不解矣.", - "added": 1777884938, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "句读之不知, 惑之不解, 或师焉, 或不焉, 小学而大遗, 吾未见其明也.", - "added": 1777885310, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "士大夫之族, 曰师曰弟子云者, 则群聚而笑之.", - "added": 1777885372, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "自疏濯淖污泥之中, 蝉蜕于浊秽, 以浮游尘埃之外, 不获世之滋垢, 皭然泥而不滓者也.", - "added": 1777885657, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "巫医乐师百工之人, 君子不齿, 今其智乃反不能及, 其可怪也欤!", - "added": 1777937005, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "圣人无常师. 孔子师郯子、苌弘、师襄、老聃.", - "added": 1777937060, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "郯子之徒, 其贤不及孔子.", - "added": 1777937080, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "是故弟子不必不如师, 师不必贤于弟子, 闻道有先后, 术业有专攻, 如是而已.", - "added": 1777937115, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "实迷途其未远, 觉今是而昨非.", - "added": 1777937271, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "引壶觞以自酌, 眄庭柯以怡颜.", - "added": 1777937411, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "园日涉以成趣, 门虽设而常关.", - "added": 1777937464, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "云无心以出岫, 鸟倦飞而知还.", - "added": 1777937517, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "归去来兮, 请息交以绝游.", - "added": 1777937573, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "悦亲戚之情话, 乐琴书以消忧.", - "added": 1777937619, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "农人告余以春及, 将有事于西畴.", - "added": 1777937642, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "李氏子蟠, 年十七, 好古文, 六艺经传皆通习之, 不拘于时, 学于余.", - "added": 1777937894, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "善万物之得时, 感吾生之行休.", - "added": 1777938016, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "策扶老以流憩, 时矫首而遐观.", - "added": 1777938520, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "既窈窕以寻壑, 亦崎岖而经丘.", - "added": 1777938937, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "怀良辰以孤往, 或植杖而耘耔.", - "added": 1777968294, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "淮左名都, 竹西佳处, 解鞍少驻初程.", - "added": 1777970555, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "古者富贵而名摩灭, 不可胜记, 唯倜傥非常之人称焉.", - "added": 1778018829, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "盖文王拘而演《周易》; 仲尼厄而作《春秋》; 屈原放逐, 乃赋《离骚》; 左丘失明, 厥有《国语》;", - "added": 1778018908, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "乃如左丘无目, 孙子断足, 终不可用, 退而论书策, 以舒其愤, 思垂空文以自见.", - "added": 1778019166, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "上计轩辕, 下至于兹, 为十表, 本纪十二, 书八章, 世家三十, 列传七十, 凡百三十篇.", - "added": 1778019396, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "草创未就, 会遭此祸, 惜其不成, 是以就极刑而无愠色.", - "added": 1778019511, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "心非木石岂无感, 吞声踯躅不敢言.", - "added": 1778019707, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "仆窃不逊, 近自托于无能之辞, 网罗天下放失旧闻, 略考其行事, 综其终始, 稽其成败兴坏之纪,", - "added": 1778020343, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "仆诚以著此书, 藏之名山, 传之其人, 通邑大都, 则仆偿前辱之责, 虽万被戮, 岂有悔哉!", - "added": 1778020491, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "江畔何人初见月? 江月何年初照人?", - "added": 1778025537, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "不知江月待何人, 但见长江送流水.", - "added": 1778025571, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "斜月沉沉藏海雾, 碣石潇湘无限路.", - "added": 1778025668, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "不知乘月几人归, 落月摇情满江树.", - "added": 1778025686, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "东南形胜, 三吴都会, 钱塘自古繁华.", - "added": 1778025708, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "江娥啼竹素女愁, 李凭中国弹箜篌.", - "added": 1778025886, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "十二门前融冷光, 二十三丝动紫皇.", - "added": 1778025946, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "羌管弄晴, 菱歌泛夜, 嬉嬉钓叟莲娃.", - "added": 1778026396, - "tags": [] - }, - { - "repo_path": "cngk-t", - "ident": "千骑拥高牙, 乘醉听箫鼓, 吟赏烟霞.", - "added": 1778026427, - "tags": [] - } -] \ No newline at end of file diff --git a/data/repo/stub/algodata.json b/data/repo/stub/algodata.json deleted file mode 100644 index d0b6e19..0000000 --- a/data/repo/stub/algodata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "临安春雨初霁": { - "SM-2": { - "efactor": 2.5, - "real_rept": 4, - "rept": 2, - "interval": 15, - "last_date": 20578, - "next_date": 20593, - "is_activated": 1, - "last_modify": 1777940498.2121851 - } - } -} \ No newline at end of file diff --git a/data/repo/stub/draft.txt b/data/repo/stub/draft.txt deleted file mode 100644 index 7485637..0000000 --- a/data/repo/stub/draft.txt +++ /dev/null @@ -1,22 +0,0 @@ -使用仪器分析分子: -质谱仪 -> 质量特征, 测分子质量(最大质荷比) -红外光谱 -> 化学键和官能团 -核磁共振氢谱 -> 氢原子的种类和数目 -X射线衍射 -> 复杂分子, 分析键长键角 -元素分析仪 -> 确定元素种类及比例, 写出实验式 -元素转换: - C -> CO2 - S -> SO2 - H -> H2O - N -> N2 (注意) - Cl -> HCl - -烷烃: -可以燃烧, 火焰较明亮 -可以在光照下和卤素单质发生取代(卤素单质光照下生成自由基 发生自由基取代反应) -可以高温分解为小的烷烃和烯烃 -不和酸性高锰酸钾, 酸碱反应, 不和Br2(CCl4)反应 -除 CH3Br 为气体外, 多溴代物为液体("油状液滴"), CBr4是固体 -光照用紫外灯或强日光(太阳光直射),不能用普通白炽灯 uv含量低 - - diff --git a/data/repo/stub/manifest.toml b/data/repo/stub/manifest.toml deleted file mode 100644 index 3eadc2b..0000000 --- a/data/repo/stub/manifest.toml +++ /dev/null @@ -1,4 +0,0 @@ -title = "测试用单元集" -package = "stub" -author = "__heurams__" -desc = "" diff --git a/data/repo/stub/payload.toml b/data/repo/stub/payload.toml deleted file mode 100644 index a25f580..0000000 --- a/data/repo/stub/payload.toml +++ /dev/null @@ -1,5 +0,0 @@ -["临安春雨初霁"] -note = ['陆游〔宋代〕'] -content = "临安/春雨/初霁/" -translation = "临安春雨初霁" -keyword_note = { "临安" = "南宋都城, 今杭州", "霁" = "雨后或雪后转晴" } diff --git a/data/repo/stub/schedule.toml b/data/repo/stub/schedule.toml deleted file mode 100644 index aff087d..0000000 --- a/data/repo/stub/schedule.toml +++ /dev/null @@ -1,11 +0,0 @@ -schedule = ["quick_review", "recognition", "final_review"] - -[routes] -quick_review = [["SelectMeaning", "1.0"], ["Recognition", "1.0"]] -recognition = [["Recognition", "1.0"]] -final_review = [["FillBlank", "1.0"], ["Recognition", "1.0"]] - -[annotation] -"quick_review" = "复习旧知" -"recognition" = "新知识" -"final_review" = "总复习" diff --git a/data/repo/stub/typedef.toml b/data/repo/stub/typedef.toml deleted file mode 100644 index 1d06672..0000000 --- a/data/repo/stub/typedef.toml +++ /dev/null @@ -1,17 +0,0 @@ -[annotation] -note = "笔记" -keyword_note = "关键词翻译" -translation = "语句翻译" -delimiter = "分隔符" -content = "内容" -tts_text = "文本转语音文本" - -[common] -delimiter = "/" -tts_text = "eval:payload['content'].replace('/', '')" - -[common.puzzles] # 谜题定义 -# 我们称 "Recognition" 为 recognition 谜题的 alia -"Recognition" = { __origin__ = "recognition", __hint__ = "", primary = "eval:payload['content']", secondary = ["eval:payload['keyword_note']", "eval:payload['note']"], top_dim = ["eval:payload['translation']"] } -"SelectMeaning" = { __origin__ = "mcq", __hint__ = "eval:payload['content']", primary = "eval:payload['content']", mapping = "eval:payload['keyword_note']", jammer = "eval:list(payload['keyword_note'].values())", max_riddles_num = "eval:default['mcq']['max_riddles_num']", prefix = "选择正确项: " } -"FillBlank" = { __origin__ = "cloze", __hint__ = "", text = "eval:payload['content']", delimiter = "eval:nucleon['delimiter']", min_denominator = "eval:default['cloze']['min_denominator']"} diff --git a/src/heurams/assets/art/logo-mono-dark.svg b/src/heurams/assets/art/logo-mono-dark.svg new file mode 100644 index 0000000..fc93eff --- /dev/null +++ b/src/heurams/assets/art/logo-mono-dark.svg @@ -0,0 +1,25 @@ + + + + + HeurAMS Monochrome Logo - Dark + Dark monochrome logo of the HeurAMS Project + + + + + + + + + + + + + + + + + + + diff --git a/src/heurams/assets/art/logo-mono-light.svg b/src/heurams/assets/art/logo-mono-light.svg new file mode 100644 index 0000000..d69dcfb --- /dev/null +++ b/src/heurams/assets/art/logo-mono-light.svg @@ -0,0 +1,25 @@ + + + + + HeurAMS Monochrome Logo - Light + Light monochrome logo of the HeurAMS Project + + + + + + + + + + + + + + + + + + + diff --git a/src/heurams/assets/art/logo.svg b/src/heurams/assets/art/logo.svg new file mode 100644 index 0000000..9ff9c27 --- /dev/null +++ b/src/heurams/assets/art/logo.svg @@ -0,0 +1,25 @@ + + + + + HeurAMS Logo + The logo of the HeurAMS Project + + + + + + + + + + + + + + + + + + + diff --git a/src/heurams/assets/data/cache/.keep b/src/heurams/assets/data/cache/.keep new file mode 100644 index 0000000..e69de29 diff --git a/data/config/_.toml b/src/heurams/assets/data/config/_.toml similarity index 100% rename from data/config/_.toml rename to src/heurams/assets/data/config/_.toml diff --git a/data/config/global.toml b/src/heurams/assets/data/config/global.toml similarity index 100% rename from data/config/global.toml rename to src/heurams/assets/data/config/global.toml diff --git a/data/config/interface/_.toml b/src/heurams/assets/data/config/interface/_.toml similarity index 100% rename from data/config/interface/_.toml rename to src/heurams/assets/data/config/interface/_.toml diff --git a/data/config/interface/global.toml b/src/heurams/assets/data/config/interface/global.toml similarity index 100% rename from data/config/interface/global.toml rename to src/heurams/assets/data/config/interface/global.toml diff --git a/data/config/interface/puzzles/_.toml b/src/heurams/assets/data/config/interface/puzzles/_.toml similarity index 100% rename from data/config/interface/puzzles/_.toml rename to src/heurams/assets/data/config/interface/puzzles/_.toml diff --git a/data/config/interface/puzzles/cloze.toml b/src/heurams/assets/data/config/interface/puzzles/cloze.toml similarity index 100% rename from data/config/interface/puzzles/cloze.toml rename to src/heurams/assets/data/config/interface/puzzles/cloze.toml diff --git a/data/config/interface/puzzles/mcq.toml b/src/heurams/assets/data/config/interface/puzzles/mcq.toml similarity index 100% rename from data/config/interface/puzzles/mcq.toml rename to src/heurams/assets/data/config/interface/puzzles/mcq.toml diff --git a/data/config/interface/widgets/_.toml b/src/heurams/assets/data/config/interface/widgets/_.toml similarity index 100% rename from data/config/interface/widgets/_.toml rename to src/heurams/assets/data/config/interface/widgets/_.toml diff --git a/data/config/interface/widgets/recognition.toml b/src/heurams/assets/data/config/interface/widgets/recognition.toml similarity index 100% rename from data/config/interface/widgets/recognition.toml rename to src/heurams/assets/data/config/interface/widgets/recognition.toml diff --git a/data/config/providers/_.toml b/src/heurams/assets/data/config/providers/_.toml similarity index 100% rename from data/config/providers/_.toml rename to src/heurams/assets/data/config/providers/_.toml diff --git a/data/config/providers/tts/_.toml b/src/heurams/assets/data/config/providers/tts/_.toml similarity index 100% rename from data/config/providers/tts/_.toml rename to src/heurams/assets/data/config/providers/tts/_.toml diff --git a/data/config/providers/tts/edgetts.toml b/src/heurams/assets/data/config/providers/tts/edgetts.toml similarity index 100% rename from data/config/providers/tts/edgetts.toml rename to src/heurams/assets/data/config/providers/tts/edgetts.toml diff --git a/data/config/repo/_.toml b/src/heurams/assets/data/config/repo/_.toml similarity index 100% rename from data/config/repo/_.toml rename to src/heurams/assets/data/config/repo/_.toml diff --git a/data/config/repo/cngk-t.toml b/src/heurams/assets/data/config/repo/cngk-t.toml similarity index 100% rename from data/config/repo/cngk-t.toml rename to src/heurams/assets/data/config/repo/cngk-t.toml diff --git a/data/config/repo/cngk.toml b/src/heurams/assets/data/config/repo/cngk.toml similarity index 100% rename from data/config/repo/cngk.toml rename to src/heurams/assets/data/config/repo/cngk.toml diff --git a/data/config/services/_.toml b/src/heurams/assets/data/config/services/_.toml similarity index 100% rename from data/config/services/_.toml rename to src/heurams/assets/data/config/services/_.toml diff --git a/data/config/services/audio.toml b/src/heurams/assets/data/config/services/audio.toml similarity index 100% rename from data/config/services/audio.toml rename to src/heurams/assets/data/config/services/audio.toml diff --git a/data/config/services/llm.toml b/src/heurams/assets/data/config/services/llm.toml similarity index 100% rename from data/config/services/llm.toml rename to src/heurams/assets/data/config/services/llm.toml diff --git a/data/config/services/sync.toml b/src/heurams/assets/data/config/services/sync.toml similarity index 100% rename from data/config/services/sync.toml rename to src/heurams/assets/data/config/services/sync.toml diff --git a/data/config/services/timer.toml b/src/heurams/assets/data/config/services/timer.toml similarity index 100% rename from data/config/services/timer.toml rename to src/heurams/assets/data/config/services/timer.toml diff --git a/data/config/services/tts.toml b/src/heurams/assets/data/config/services/tts.toml similarity index 100% rename from data/config/services/tts.toml rename to src/heurams/assets/data/config/services/tts.toml diff --git a/src/heurams/assets/data/misc/.keep b/src/heurams/assets/data/misc/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/assets/data/repo/.keep b/src/heurams/assets/data/repo/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/assets/data/session/.keep b/src/heurams/assets/data/session/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/heurams/context.py b/src/heurams/context.py index 74b2b0e..62d9eb4 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -22,7 +22,14 @@ logger = get_logger(__name__) logger.debug(f"包目录: {rootdir}") logger.debug(f"工作目录: {workdir}") -(workdir / "data" / "config").mkdir(parents=True, exist_ok=True) +default_data = rootdir / "assets" / "data" +user_data = workdir / "data" +if not user_data.exists(): + logger.info("初始化数据目录: %s", user_data) + import shutil + shutil.copytree(default_data, user_data) +else: + (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) config_var: ContextVar[ConfigDict] = ContextVar( "config_var", diff --git a/src/heurams/services/version.py b/src/heurams/services/version.py index 9d05552..70ca690 100644 --- a/src/heurams/services/version.py +++ b/src/heurams/services/version.py @@ -4,7 +4,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) ver = "0.5.0" -stage = "rc.1" +stage = "stable" codename = "fulcrum" codename_cn = "支点" From cf2283446d1976d3177740c68a3859ea481a63b7 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 17:55:22 +0800 Subject: [PATCH 74/79] =?UTF-8?q?docs:=20=E5=90=88=E5=B9=B6=E5=89=8D?= =?UTF-8?q?=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 18 +++++++++--------- ARCHITECTURE.md | 8 ++++---- README.md | 3 ++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 4badd4c..53aea94 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,12 +1,12 @@ # AI 编程工具说明 -本文档为 AI 工具以及在使用 AI 辅助向 HeurAMS 项目贡献代码时的开发者提供指导. +本文档为 AI 工具以及在使用 AI 辅助向 HeurAMS 项目贡献代码的开发者提供指导, 一般而言此文件会被自动读入多种 AI 工具的上下文. -AI 工具必须完整阅读此 `/AGENTS.md` 文件. +AI 工具应当完整阅读此 `/AGENTS.md` 文件. ## 查阅开发文档 -在帮助进行 HeurAMS 开发时,AI 工具应遵循标准的开发规范与流程, 应当自动查看或是在用户发出"初始化"指令后查看: +在帮助进行 HeurAMS 开发时,AI 工具应遵循标准的开发规范与流程, 应当自动查看或是在用户发出"初始化/init"指令后查看: - [贡献指南](/CONTRIBUTING.md) - [自述文件](/README.md) @@ -18,11 +18,11 @@ AI 工具必须完整阅读此 `/AGENTS.md` 文件. 2. 禁止 AI 在未经人工确认的情况下修改现有代码 3. 禁止 AI 不使用格式化工具而生成格式化文件的行为 4. 禁止 AI 修复任何"bug", 而不经人工确认 -5. 绝对禁止修改此 `/AGENTS.md` 文件 -6. 禁止一切不遵循项目设计原则, 另造独立库的 "糊屎" 行为 -7. 禁止 AI 直接操作 pip, uv, apt 等工具修改外部依赖或工具, 而应让人类开发者自己操作依赖 -8. 禁止使用不同于任何现有文件的现有注释语言的其他语言写新注释 -9. 禁止不读文件就直接覆写 +5. 禁止一切不遵循项目设计原则, 另造独立库的 "糊屎" 行为 +6. 禁止 AI 直接操作 pip, uv, apt 等工具修改外部依赖或工具, 而应让人类开发者自己操作依赖 +7. 禁止使用不同于任何现有文件的现有注释语言的其他语言写新注释 +8. 禁止不读文件就直接覆写 +9. 绝对禁止修改此 `/AGENTS.md` 文件 ## 许可证与法律要求 @@ -47,4 +47,4 @@ AI 助手负责: - 遵循此文档所述规则 - 主动提醒使用 AI 工具的开发者 -本文档参考自 [AI Coding Assistants — The Linux Kernel documentation](https://docs.kernel.org/process/coding-assistants.html) +本文档参考自 AI Coding Assistants — The Linux Kernel documentation diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6320c65..b587256 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -68,7 +68,7 @@ graph TB 项目以物理粒子隐喻为核心, 将记忆单元拆解为三个模型: -### Nucleon (核子) — 内容层 +### Nucleon (核子) - 内容层 ``` Nucleon(ident, payload, common) @@ -79,7 +79,7 @@ Nucleon(ident, payload, common) - 从 `repo.payload` 和 `repo.typedef["common"]` 配对创建. - 一旦创建, 内容不可修改 (`__setitem__` 抛出 `AttributeError`). -### Electron (电子) — 状态层 +### Electron (电子) - 状态层 ``` Electron(ident, algodata, algo_name) @@ -89,7 +89,7 @@ Electron(ident, algodata, algo_name) - `algodata` 是到仓库 `algodata.lict` 中对应字典的**引用**, 修改即持久化. - 核心方法:`activate()` (标记激活)、`revisor()` (评分迭代)、`is_due()` (到期判断). -### Orbital (轨道) — 策略层 +### Orbital (轨道) - 策略层 ``` orbital = { @@ -104,7 +104,7 @@ orbital = { - 定义复习阶段流程和各阶段内谜题选择策略的纯字典. - 每个阶段对应一组 `(谜题类型, 概率系数)` 元组列表, 概率系数 >1 的部分表示强制重复次数. -### Atom (原子) — 运行时组装 +### Atom (原子) - 运行时组装 ``` Atom(nucleon, electron, orbital) diff --git a/README.md b/README.md index d610f6a..83405c5 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,8 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ## 参与项目 欢迎参与到项目协作中! -详见[贡献指南](CONTRIBUTING.md). +详见[贡献指南](CONTRIBUTING.md). +关于 AI 辅助开发的说明, 请参阅[AGENTS.md](AGENTS.md). ## 许可证 From 7bf78ecdffedbeb2ca4de229c9795c0df2d013d3 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 18:02:59 +0800 Subject: [PATCH 75/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E4=BE=9D=E8=B5=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 83405c5..c31bc1e 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ |--------|----------|------| | 最小化安装 | tabulate, toml, transitions | 核心驱动程序库, 始终必需 | | interface | textual, psutil | 基本用户界面依赖 | -| algo-fsrs | py-fsrs | FSRS 算法模块 | +| algo-fsrs | fsrs | FSRS 算法模块 | | tts-edgetts | edge-tts | 微软文本转语音 | | llm | openai | OpenAI 式 API 调用 | | audio-playsound | playsound3 | 通用音频模块 | diff --git a/pyproject.toml b/pyproject.toml index 6267638..b994980 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,14 +14,13 @@ license-files = ["LICENSE"] dependencies = [ # 这些依赖只能驱动 kernel 程序库 "tabulate>=0.10.0", - "textual>=8.2.5", "toml>=0.10.2", "transitions>=0.9.3", ] [project.optional-dependencies] interface = [ # 基本用户界面依赖 - "textual>=8.2.3", + "textual>=8.2.5", "psutil>=7.2.2", ] algo-fsrs = [ From dd2469b49a6657dfef42f1bd4ddbf2e2a7d8f4c6 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 18:17:39 +0800 Subject: [PATCH 76/79] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E5=8F=AF=E7=94=A8=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/assets/data/config/global.toml | 2 +- .../assets/data/config/interface/global.toml | 2 +- .../assets/data/config/repo/cngk-t.toml | 11 ----------- src/heurams/assets/data/config/repo/cngk.toml | 11 ----------- .../assets/data/config/services/llm.toml | 2 +- .../assets/data/config/services/sync.toml | 2 +- src/heurams/interface/__main__.py | 19 ------------------- src/heurams/interface/screens/dashboard.py | 8 ++++---- src/heurams/kernel/algorithms/fsrs.py | 4 ++-- src/heurams/kernel/algorithms/sm15m.py | 4 +--- uv.lock | 4 +--- 11 files changed, 12 insertions(+), 57 deletions(-) delete mode 100644 src/heurams/assets/data/config/repo/cngk-t.toml delete mode 100644 src/heurams/assets/data/config/repo/cngk.toml diff --git a/src/heurams/assets/data/config/global.toml b/src/heurams/assets/data/config/global.toml index 9c0fd40..707741e 100644 --- a/src/heurams/assets/data/config/global.toml +++ b/src/heurams/assets/data/config/global.toml @@ -1,4 +1,4 @@ -zmq_debug = true +zmq_debug = false _zmq_debug_desc = "[调试] ZeroMQ 调试服务器, 这会在 zmq_debug_port 上打开一个服务器\n调试工具可远程在 HeurAMS 内执行任意 python 代码, 无必要请关闭" zmq_debug_port = 5555 _zmq_debug_port_desc = "[调试] ZeroMQ 调试服务器端口" diff --git a/src/heurams/assets/data/config/interface/global.toml b/src/heurams/assets/data/config/interface/global.toml index 37f575c..4d8de7b 100644 --- a/src/heurams/assets/data/config/interface/global.toml +++ b/src/heurams/assets/data/config/interface/global.toml @@ -10,7 +10,7 @@ quick_pass = true _quick_pass_desc = "[调试] 启用快速应答功能(跳过测验)" auto_pass = false _auto_pass_desc = "[调试] 自动通过测试模式" -scheduled_num = 420 +scheduled_num = 35 _scheduled_num_desc = "默认记忆单元数量\n可被单元集设置覆盖" refresh_on_resume = true _refresh_on_resume_desc = "[调试] 每当 Screen 激活后都刷新状态" diff --git a/src/heurams/assets/data/config/repo/cngk-t.toml b/src/heurams/assets/data/config/repo/cngk-t.toml deleted file mode 100644 index ea2bbef..0000000 --- a/src/heurams/assets/data/config/repo/cngk-t.toml +++ /dev/null @@ -1,11 +0,0 @@ -algorithm = "NSP-0" -_algorithm_desc = "记忆调度算法" -scheduled_num = 35 -_scheduled_num_desc = "单次记忆单元数量" - -[_algorithm_candidate] -NSP-0 = "筛选用非间隔重复调度器" -none = "不设置默认调度器" -SM-2 = "第二代 SuperMemo 简单间隔重复调度器" -SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" -FSRS = "先进开放间隔重复调度器" diff --git a/src/heurams/assets/data/config/repo/cngk.toml b/src/heurams/assets/data/config/repo/cngk.toml deleted file mode 100644 index ea2bbef..0000000 --- a/src/heurams/assets/data/config/repo/cngk.toml +++ /dev/null @@ -1,11 +0,0 @@ -algorithm = "NSP-0" -_algorithm_desc = "记忆调度算法" -scheduled_num = 35 -_scheduled_num_desc = "单次记忆单元数量" - -[_algorithm_candidate] -NSP-0 = "筛选用非间隔重复调度器" -none = "不设置默认调度器" -SM-2 = "第二代 SuperMemo 简单间隔重复调度器" -SM-15M = "第15代 SuperMemo 复杂间隔重复调度器 (不稳定且逆向工程)" -FSRS = "先进开放间隔重复调度器" diff --git a/src/heurams/assets/data/config/services/llm.toml b/src/heurams/assets/data/config/services/llm.toml index 6f748c0..a3e6234 100644 --- a/src/heurams/assets/data/config/services/llm.toml +++ b/src/heurams/assets/data/config/services/llm.toml @@ -1,4 +1,4 @@ -provider = "openai" +provider = "none" _provider_desc = "模型接口类型" [_provider_candidate] diff --git a/src/heurams/assets/data/config/services/sync.toml b/src/heurams/assets/data/config/services/sync.toml index 037a247..1d4e2fe 100644 --- a/src/heurams/assets/data/config/services/sync.toml +++ b/src/heurams/assets/data/config/services/sync.toml @@ -1,4 +1,4 @@ -provider = "webdav" +provider = "none" _provider_desc = "同步服务驱动类型" [_provider_candidate] diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 5dbacab..46f7d2f 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -7,24 +7,6 @@ import pickle logger = get_logger(__name__) - -def environment_check(): - from pathlib import Path - - logger.debug("检查环境路径") - subdir = ["cache/voice", "repo", "global", "config"] - for i in subdir: - i = Path(config_var.get()["global"]["paths"]["data"]) / i - if not i.exists(): - logger.info("创建目录: %s", i) - print(f"创建 {i}") - i.mkdir(exist_ok=True, parents=True) - else: - logger.debug("目录已存在: %s", i) - print(f"找到 {i}") - logger.debug("环境检查完成") - - def start_debug_server(app): logger = get_logger("zmq_debug") context = zmq.Context() @@ -56,7 +38,6 @@ def start_debug_server(app): def main(): - environment_check() app = HeurAMSApp() diff --git a/src/heurams/interface/screens/dashboard.py b/src/heurams/interface/screens/dashboard.py index 16be393..7910c03 100644 --- a/src/heurams/interface/screens/dashboard.py +++ b/src/heurams/interface/screens/dashboard.py @@ -66,10 +66,10 @@ class DashboardScreen(Screen): Vertical( Label(f"已加载 {len(self.repos)} 个单元集"), Label( - f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.progress['total'], self.repos))} 个单元" + f"共计 {reduce(lambda x, y: x + y, map(lambda x: x.progress['total'], self.repos)) if self.repos else 0} 个单元" ), Label( - f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.progress['touched'], self.repos))} 个单元" + f"已激活 {reduce(lambda x, y: x + y, map(lambda x: x.progress['touched'], self.repos)) if self.repos else 0} 个单元" ), Label(f""), classes="right", @@ -160,8 +160,8 @@ class DashboardScreen(Screen): repo_list_widget.append( ListItem( Static( - f"在 {config_var.get()['global']['paths']['repo']} 中未找到任何仓库.\n" - "请导入仓库后重启应用, 或者新建空的仓库." + f"在 {config_var.get()['global']['paths']['repo']} 中未找到任何单元集仓库目录.\n" + "请导入单元集后重启应用, 或者新建单元集." ), id="not-found", ) diff --git a/src/heurams/kernel/algorithms/fsrs.py b/src/heurams/kernel/algorithms/fsrs.py index 070d319..730f690 100644 --- a/src/heurams/kernel/algorithms/fsrs.py +++ b/src/heurams/kernel/algorithms/fsrs.py @@ -21,8 +21,8 @@ logger = get_logger(__name__) # 全局 Scheduler 状态文件路径 _SCHEDULER_STATE_FILE = pathlib.Path( - config_var.get()["global"]["paths"]["data"] -) / "global" / "fsrs_scheduler_state.json" + config_var.get()["global"]["paths"]["misc"] +) / "fsrs_scheduler_state.json" def _get_global_scheduler(): diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index 9ed86a0..f5517c6 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -600,9 +600,7 @@ class SM: # Global state management # ============================================================================ -_GLOBAL_STATE_FILE = pathlib.Path( - config_var.get()["global"]["paths"]["data"] -) / "global" / "sm15m_global_state.json" +_GLOBAL_STATE_FILE = pathlib.Path(config_var.get()["global"]["paths"]["misc"]) / "sm15m_global_state.json" def _get_global_sm(): diff --git a/uv.lock b/uv.lock index 66abfac..1270b94 100644 --- a/uv.lock +++ b/uv.lock @@ -439,7 +439,6 @@ version = "0.5.0" source = { editable = "." } dependencies = [ { name = "tabulate" }, - { name = "textual" }, { name = "toml" }, { name = "transitions" }, ] @@ -499,8 +498,7 @@ requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "tabulate", specifier = ">=0.10.0" }, - { name = "textual", specifier = ">=8.2.5" }, - { name = "textual", marker = "extra == 'interface'", specifier = ">=8.2.3" }, + { name = "textual", marker = "extra == 'interface'", specifier = ">=8.2.5" }, { name = "toml", specifier = ">=0.10.2" }, { name = "transitions", specifier = ">=0.9.3" }, { name = "zmq", marker = "extra == 'dev'", specifier = ">=0.0.0" }, From e019ffc957c0a50f54c26cbf433b8be8220a800b Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 18:38:03 +0800 Subject: [PATCH 77/79] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c31bc1e..d2b0235 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,19 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ 欢迎参与到项目协作中! 详见[贡献指南](CONTRIBUTING.md). -关于 AI 辅助开发的说明, 请参阅[AGENTS.md](AGENTS.md). +关于 AI 辅助开发的说明, 请参阅 [AGENTS.md](AGENTS.md). + +## 项目标识 + +HeurAMS 项目标识如下, 矢量图文件位于 `./src/heurams/assets/art/` 目录. + +
+ + + +
+ +颜色分别是: `#1660A5 (海蓝色)` `#545F70 (蓝灰色)` `#1A1A1A (暗色单色图标深黑色)` `#FFFFFF (明亮单色图标白色)`. ## 许可证 From 69f8bfb853c584980be032961bdd9df551165c9a Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 18:43:49 +0800 Subject: [PATCH 78/79] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2b0235..f28b2e7 100644 --- a/README.md +++ b/README.md @@ -135,8 +135,8 @@ HeurAMS 项目标识如下, 矢量图文件位于 `./src/heurams/assets/art/`
- +
颜色分别是: `#1660A5 (海蓝色)` `#545F70 (蓝灰色)` `#1A1A1A (暗色单色图标深黑色)` `#FFFFFF (明亮单色图标白色)`. From 048e74ad7fdd96f92908d5a59244cedb21eaec99 Mon Sep 17 00:00:00 2001 From: Wang Zhiyu Date: Thu, 7 May 2026 19:48:07 +0800 Subject: [PATCH 79/79] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 14 +-- CONTRIBUTING.md | 5 +- FAQ.md | 87 ++++++++++--------- README.md | 36 ++++---- SCREENSHOTS.md | 34 ++++---- src/heurams/__main__.py | 2 +- src/heurams/context.py | 1 + src/heurams/interface/__main__.py | 1 + src/heurams/interface/screens/favmgr.py | 9 +- src/heurams/interface/screens/memoqueue.py | 8 +- src/heurams/interface/widgets/cloze_puzzle.py | 8 +- src/heurams/kernel/algorithms/__init__.py | 2 +- src/heurams/kernel/algorithms/base.py | 1 + src/heurams/kernel/algorithms/fsrs.py | 28 +++--- src/heurams/kernel/algorithms/sm15m.py | 34 ++++---- .../providers/audio/playsound_audio.py | 1 + src/heurams/services/timer.py | 6 +- tests/test_electron.py | 15 +++- tests/test_epath.py | 4 +- 19 files changed, 164 insertions(+), 132 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 53aea94..f8a15e2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,12 +1,12 @@ # AI 编程工具说明 -本文档为 AI 工具以及在使用 AI 辅助向 HeurAMS 项目贡献代码的开发者提供指导, 一般而言此文件会被自动读入多种 AI 工具的上下文. +本文档为 AI 工具以及在使用 AI 辅助向 HeurAMS 项目贡献代码的开发者提供指导, 一般而言此文件会被自动读入多种 AI 工具的上下文. AI 工具应当完整阅读此 `/AGENTS.md` 文件. ## 查阅开发文档 -在帮助进行 HeurAMS 开发时,AI 工具应遵循标准的开发规范与流程, 应当自动查看或是在用户发出"初始化/init"指令后查看: +在帮助进行 HeurAMS 开发时,AI 工具应遵循标准的开发规范与流程, 应当自动查看或是在用户发出"初始化/init"指令后查看: - [贡献指南](/CONTRIBUTING.md) - [自述文件](/README.md) @@ -26,22 +26,22 @@ AI 工具应当完整阅读此 `/AGENTS.md` 文件. ## 许可证与法律要求 -所有贡献必须符合许可要求, 所有代码必须与 AGPL-3.0-or-later 许可以及项目附加豁免条款(位于 LICENSE 文件尾部 237 至 245 行)兼容. +所有贡献必须符合许可要求, 所有代码必须与 AGPL-3.0-or-later 许可以及项目附加豁免条款(位于 LICENSE 文件尾部 237 至 245 行)兼容. ## Signed-off-by 与 DCO -AI 代理**严禁添加** Signed-off-by 标签. +AI 代理**严禁添加** Signed-off-by 标签. -只有人类能够合法地认证 DCO. +只有人类能够合法地认证 DCO. -人类提交者负责: +人类提交者负责: - 审阅所有 AI 生成的代码 - 确保符合许可要求 - 添加自己的 Signed-off-by 标签以认证 DCO - 对贡献负责任 -AI 助手负责: +AI 助手负责: - 了解运行环境, 例如操作系统或具体发行版 - 遵循此文档所述规则 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84b87f5..7608dda 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ 欢迎为此项目做出贡献! > [!NOTE] -> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 +> 我们已经开始着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目\ > 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android, iOS 和 Plasma Mobile 提供现代用户界面 > 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 @@ -81,6 +81,7 @@ python3 -m heurams.interface # 启动 TUI 贡献者拥有其贡献部分的版权同意其贡献将在 AGPL-3.0 许可证(包括附加的本机 API 调用豁免条款)下发布. 如有以下情况, 请在 PR 描述中注明: + - 如果需要引入其他开源 vendor - 如果需要引入其他专有的网络服务(例如当前项目中的 edgetts) - 如果需要升级某个依赖或运行环境的版本 @@ -96,7 +97,7 @@ HeurAMS 被设计为一个可独立于前端的程序库, 这意味着: - 您还可以在自己的项目中以独立进程/服务调用 HeurAMS, 根据 AGPL-3.0 及本项目的附加许可条款, 如果调用发生在同一主机上且不涉及外部网络转发, 则可豁免许可证规定的特定义务而免于受 AGPL-3.0 "污染". 为了这点, 我们正在完善可选择启用的跨进程 RPC 模块, 这将成为潜进内核的跨平台标准件. - 如果您通过独立进程/服务调用方式开发了另外的软件, 开源但不愿使用 AGPL-3.0/GPL-3.0 许可证, 也可以联系我们, 我们乐于将您的项目链接添加到友链中 - + ## 软件开发之外的贡献 即使您不是软件开发人员, 我们也欢迎您加入贡献! diff --git a/FAQ.md b/FAQ.md index 83ef045..c4adfed 100644 --- a/FAQ.md +++ b/FAQ.md @@ -2,15 +2,15 @@ ## 什么是终端模拟器? -终端模拟器是在图形桌面环境中模拟并使用终端的应用程序, 例如 KDE Konsole, GNOME Terminal, Windows Terminal, iTerm2 等. +终端模拟器是在图形桌面环境中模拟并使用终端的应用程序, 例如 KDE Konsole, GNOME Terminal, Windows Terminal, iTerm2 等. -较旧 Windows 的那个很寒酸的小黑窗口也是终端模拟器(conhost.exe), 但它对此软件基本用户界面(以及一切现代终端应用)支持不佳, 建议在 Windows 平台使用 WezTerm (支持 sixel) 或 Windows Terminal (不支持 sixel). +较旧 Windows 的那个很寒酸的小黑窗口也是终端模拟器(conhost.exe), 但它对此软件基本用户界面(以及一切现代终端应用)支持不佳, 建议在 Windows 平台使用 WezTerm (支持 sixel) 或 Windows Terminal (不支持 sixel). ## 软件支持移动设备吗? -基本用户界面 (Textual TUI) 可在 Android Termux 中良好运行. +基本用户界面 (Textual TUI) 可在 Android Termux 中良好运行. -此外, 正在开发的 KiriMemo 前端基于 KDE Kirigami 框架, 将原生支持 Android 和 iOS. +此外, 正在开发的 KiriMemo 前端基于 KDE Kirigami 框架, 将原生支持 Android 和 iOS. ## HeurAMS 和 Anki 有什么区别? @@ -29,13 +29,13 @@ ## 软件是免费的吗? -是的, 完全免费, 且开源. 您无需支付任何费用即可使用全部功能. +是的, 完全免费, 且开源. 您无需支付任何费用即可使用全部功能. ## 黑乎乎的这个界面我怎么用? -得益于微软几十年对用户进行的"命令行即落后"教育, 以及 `conhost.exe` 和 `cmd.exe` 的糟糕体验, 您对终端用户界面感到不适应是完全正常的. +得益于微软几十年对用户进行的"命令行即落后"教育, 以及 `conhost.exe` 和 `cmd.exe` 的糟糕体验, 您对终端用户界面感到不适应是完全正常的. -但实际上, 虽然看起来像老式电脑屏幕, Textual 和终端标准其实比您想象得要现代一些. +但实际上, 虽然看起来像老式电脑屏幕, Textual 和终端标准其实比您想象得要现代一些. ### 可以用鼠标 @@ -44,6 +44,7 @@ 所以可能和您的想象不同, 您事实上可以直接用鼠标点击按钮, 就像使用普通软件一样. ### 也可以用键盘 + - `Tab` 键在不同区域之间切换焦点 - `方向键` 在列表中上下移动 - `Enter` 确认选择 @@ -51,6 +52,7 @@ - 屏幕上会有按键提示, 例如 `[n] 导航器` 表示按 `n` 键打开导航器 ### 触屏也可以 + 在平板或手机 Termux 中, 您可以触摸或者滑动屏幕操作. ## 我怎么启动这个软件? @@ -58,6 +60,7 @@ 首先需要确保系统中安装了 Python (推荐 3.12.13 版本) 并安装了 HeurAMS 的所需组件. ### Windows + 打开"命令提示符"或"PowerShell", 输入以下命令后按回车, 或者把这玩意另存为快捷方式: ``` @@ -65,22 +68,24 @@ python -m heurams.interface ``` ### macOS + 打开"终端"应用程序, 输入以上命令. ### Linux + 打开您的终端模拟器 (一般是按 Ctrl + Alt + T), 输入以上命令. 如果您觉得每次输入命令太麻烦, 可以创建一个桌面快捷方式或脚本文件, 详见网上的相关教程. ## 我怎么退出软件? -按键盘上的 `q` 键返回主界面后退出. +按键盘上的 `q` 键返回主界面后退出. 您的学习进度会自动保存, 不会丢失. ## 我看不到图片怎么办? -终端模拟器需要支持 sixel 图像协议才能显示图片. +终端模拟器需要支持 sixel 图像协议才能显示图片. - WezTerm (适用于几乎所有操作系统): 支持 - KDE Konsole: 支持 @@ -124,15 +129,15 @@ python -m heurams.interface ## 字体太小/太大怎么办? -在您的终端模拟器设置中找到"字体大小"选项进行调整. +在您的终端模拟器设置中找到"字体大小"选项进行调整. 软件会跟随终端的字体设置. ## 为什么我的界面和截图不一样? -截图使用的是 KDE Plasma 桌面上的 Konsole, 80x25 字符尺寸, Cascadia Code 和 Noto Sans SC 字体. +截图使用的是 KDE Plasma 桌面上的 Konsole, 80x25 字符尺寸, Cascadia Code 和 Noto Sans SC 字体. -如果您的终端尺寸更大, 界面会更宽裕; 如果使用不同字体或者不同操作系统, 视觉效果会略有差异. +如果您的终端尺寸更大, 界面会更宽裕; 如果使用不同字体或者不同操作系统, 视觉效果会略有差异. 功能上完全一致. @@ -144,9 +149,9 @@ python -m heurams.interface 并且这种方式于学术研究与实验不利, 用户自评分产生的数据是不可靠的. -因此 HeurAMS 的前端内建了基于用户行为分析的自动评分系统, 也就是"谜题". +因此 HeurAMS 的前端内建了基于用户行为分析的自动评分系统, 也就是"谜题". -它会根据题目本身难度和您的答题行为(包括但不限于正确性, 操作回退次数, 有效答题时间)并自动为您评分. +它会根据题目本身难度和您的答题行为(包括但不限于正确性, 操作回退次数, 有效答题时间)并自动为您评分. 但如果您或者某个单元集选择使用 `basic_puzzle`, 或者打算自己实现自动评分系统, 分数含义如下: @@ -170,7 +175,7 @@ python -m heurams.interface ## 我每天都要打开软件吗? 不学会怎样? -理论上不需要每天打开. 软件会自动记录每个知识点下次该复习的时间. +理论上不需要每天打开. 软件会自动记录每个知识点下次该复习的时间. 但建议您每天打开软件看下状态. @@ -183,9 +188,9 @@ python -m heurams.interface ## 能同时学多个科目吗? -可以. +可以. -每个科目或课程可以做成独立的"单元集". +每个科目或课程可以做成独立的"单元集". ## 我换电脑了, 怎么迁移数据? @@ -215,13 +220,13 @@ python -m heurams.interface ## 同时用 Anki 和 HeurAMS 会冲突吗? -不会. +不会. 两者是独立的软件, 数据互不影响. 您可以逐步将内容迁移到 HeurAMS, 也可以两个一起用. ## 我需要安装 Python 吗? -需要的, HeurAMS 是基于 Python 的软件. +需要的, HeurAMS 是基于 Python 的软件. - Windows/macOS: 从 python.org 下载安装即可 - Linux: 系统通常已自带 Python @@ -233,9 +238,9 @@ HeurAMS 建议的 Python 版本是 3.12.13. ## 软件安全吗? 会不会有病毒? -HeurAMS 是开源软件, 所有代码公开可查阅, 不会有病毒或后门. +HeurAMS 是开源软件, 所有代码公开可查阅, 不会有病毒或后门. -它只读写自己的 `data/` 文件夹, 不会动您电脑上的其他文件. +它只读写自己的 `data/` 文件夹, 不会动您电脑上的其他文件. ## 软件报错, 出现一堆我看不懂的英文怎么办? @@ -249,13 +254,13 @@ HeurAMS 是开源软件, 所有代码公开可查阅, 不会有病毒或后门. ## 怎么看我学了多少? 有统计吗? -仪表盘界面会显示统计信息. +仪表盘界面会显示统计信息. 您可以通过导航器随时回到仪表盘查看. ## 我觉得复习太快/太慢了, 能调吗? -可以. 您可以通过切换算法或调整算法参数或改变记忆单元数来改变复习节奏. +可以. 您可以通过切换算法或调整算法参数或改变记忆单元数来改变复习节奏. 在设置界面可以找到相关设置. @@ -277,13 +282,13 @@ HeurAMS 是开源软件, 所有代码公开可查阅, 不会有病毒或后门. ## 哪里可以下载别人做好的单元集? -目前项目还没有官方的单元集市场. +目前项目还没有官方的单元集市场. 但随着社区发展, 未来可能会有用户分享的单元集, 您也可以和朋友互相分享. ## 我能把学习内容导出打印吗? -可以. +可以. 软件本身支持将单元集导出为单一文本文件, 您可以用任何文本编辑器打开并打印. 也可以直接复制内容到 Word 等软件. @@ -318,13 +323,13 @@ data/repo/my_pack/ ## 为什么不用 Flutter? -Flutter 是构建跨平台图形界面的优秀框架, HeurAMS 的设计目标之一是保持核心程序库独立于特定前端. +Flutter 是构建跨平台图形界面的优秀框架, HeurAMS 的设计目标之一是保持核心程序库独立于特定前端. 但 Flutter 在 "集成 python" 方面不如 PyOtherSide, 只能通过 RPC 标准件和程序库通讯, 并且 Flutter 的桌面多窗口一直以来没有被官方稳定支持, 所以我们暂时放弃了 Flutter 而选择了 Kirigami. 当前我们优先开发了基于 Textual 的 TUI 前端和基于 Kirigami 的原生前端, 但这不排除未来出现 Flutter 或其他框架前端的可能性. -如果您有兴趣开发 Flutter 前端, 欢迎参考[贡献指南](CONTRIBUTING.md#新的用户界面前端). +如果您有兴趣开发 Flutter 前端, 欢迎参考[贡献指南](CONTRIBUTING.md#%E6%96%B0%E7%9A%84%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E5%89%8D%E7%AB%AF). ## 软件需要联网吗? @@ -336,11 +341,11 @@ Flutter 是构建跨平台图形界面的优秀框架, HeurAMS 的设计目标 ## 许可证中的"本机 API 调用豁免"是什么? -简言之, 如果您在自己的程序中通过本地进程间 API 方式的通信 (如同一主机上的 RPC 调用) 使用 HeurAMS, 而无需通过网络转发, 则您的程序不受 AGPL-3.0 许可证的约束. +简言之, 如果您在自己的程序中通过本地进程间 API 方式的通信 (如同一主机上的 RPC 调用) 使用 HeurAMS, 而无需通过网络转发, 则您的程序不受 AGPL-3.0 许可证的约束. -这项附加条款旨在鼓励第三方前端和工具的开发. +这项附加条款旨在鼓励第三方前端和工具的开发. -所以 HeurAMS 的许可证实质上是比原始的 AGPL-3.0 松一点的. +所以 HeurAMS 的许可证实质上是比原始的 AGPL-3.0 松一点的. ## HeurAMS 和百词斩有什么区别? @@ -360,29 +365,29 @@ Flutter 是构建跨平台图形界面的优秀框架, HeurAMS 的设计目标 ## 百词斩有图片联想记忆, HeurAMS 也有吗? -支持. +支持. -如果您的终端支持图片显示 (如 Konsole 或者 WezTerm), 单元集中可以包含图片, 复习时会直接展示. +如果您的终端支持图片显示 (如 Konsole 或者 WezTerm), 单元集中可以包含图片, 复习时会直接展示. -但图片需要您自己放入单元集. +但图片需要您自己放入单元集. ## 百词斩有打卡和排行榜, HeurAMS 有吗? -目前没有. +目前没有. -HeurAMS 不设打卡、排行榜或社交功能, 也不向任何人收集您的学习数据. +HeurAMS 不设打卡、排行榜或社交功能, 也不向任何人收集您的学习数据. ## 百词斩有现成的词书, HeurAMS 去哪找内容? -百词斩的课程是官方制作好的, HeurAMS 的内容需要您自己创建或从社区获取. +百词斩的课程是官方制作好的, HeurAMS 的内容需要您自己创建或从社区获取. 详见"如何创建自己的单元集?". ## 百词斩在手机上用很方便, HeurAMS 能在手机用吗? -可以, 但现阶段需要您"折腾"一下. +可以, 但现阶段需要您"折腾"一下. -Android 手机安装 Termux 后可运行 HeurAMS 的基本用户界面. +Android 手机安装 Termux 后可运行 HeurAMS 的基本用户界面. 此外, 正在开发的 KiriMemo 前端将原生支持 Android 和 iOS, 这就不需要用户去折腾了. @@ -396,12 +401,12 @@ Android 手机安装 Termux 后可运行 HeurAMS 的基本用户界面. 考虑到百词斩的算法和词库是事实上闭源的, 我们无从得知算法来源. -但 HeurAMS 的架构设计可保证单元集制成后效果不比百词斩差, 甚至优于百词斩. +但 HeurAMS 的架构设计可保证单元集制成后效果不比百词斩差, 甚至优于百词斩. -HeurAMS 的间隔重复算法基于相同的认知科学原理, 且算法透明可调, 您可以自由选择最适合自己的调度策略. +HeurAMS 的间隔重复算法基于相同的认知科学原理, 且算法透明可调, 您可以自由选择最适合自己的调度策略. ## 如何参与项目? -详见[贡献指南](CONTRIBUTING.md). +详见[贡献指南](CONTRIBUTING.md). 即使不是开发者, 您也可以通过编写文档、制作记忆单元集、翻译界面、答疑等方式参与. diff --git a/README.md b/README.md index f28b2e7..8beaa56 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,19 @@ ## 概述 -"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一种基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划, +"潜进" (HeurAMS: Heuristic Auxiliary Memorizing Scheduler, 启发式记忆辅助调度器) 是一种基于启发式算法与认知科学理论的辅助记忆调度器, 旨在帮助用户更高效地进行记忆工作与学习规划,\ 也是一种开放, 优雅, 易于扩展的间隔重复调度器实验平台, 旨在帮助研究者更高效地进行前沿记忆算法的研究. ## 关于此仓库 -此仓库为 "潜进" 的核心程序库在 python 语言下的实现 -包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块) +此仓库为 "潜进" 的核心程序库在 python 语言下的实现\ +包含数据模型与框架, 并内置了基于 textual 框架的前端实现 (interface 子模块)\ 除了通过内置前端进行学习外, 开发者也能在 python 环境中导入 `heurams` 库或使用 `RPC` 与 `heurams` 程序库实例通讯, 使用框架构建其他辅助记忆功能前端或其他应用程序 > [!NOTE] -> 我们已经着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目 -> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android, iOS 和 Plasma Mobile 提供现代用户界面 -> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 +> 我们已经着手于基于 KDE 用户界面框架 `Kirigami` 的现代跨平台前端开发, 称作 "KiriMemo", 包名是 "org.kde.kirimemo", 但其并非 KDE 项目\ +> 它通过 `PyOtherSide` 直接复用 python 内核, 为 Windows, Linux, macOS, Android, iOS 和 Plasma Mobile 提供现代用户界面\ +> 如果您善于开发 C++, QML, Qt 与 KDE 框架, 欢迎加入到 KiriMemo 项目的开发 ## 特性 @@ -72,11 +72,14 @@ #### 稳定版本 安装适用于用户体验的可选依赖(推荐): + ``` python -m pip install heurams[basic] -i https://pypi.pluv27.top/root/stable/+simple/ ``` -安装适用于一般计算机的通用音频模块(基于 playsound3): + +安装适用于一般计算机的通用音频模块(基于 playsound3):\ (此项不适用于 termux 环境, termux 的音频支持是内建的) + ``` python -m pip install heurams[audio-playsound] -i https://pypi.pluv27.top/root/stable/+simple/ ``` @@ -84,12 +87,13 @@ python -m pip install heurams[audio-playsound] -i https://pypi.pluv27.top/root/s #### 开发版本 > [!CAUTION] -> 对于部分 Linux 发行版和 Android Termux 用户: -> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖. -> 例如在 termux 上先运行 `pkg install cmake clang libzmq`. -> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器. +> 对于部分 Linux 发行版和 Android Termux 用户:\ +> 您需要先行安装 `cmake` 和 `libzmq` 才能正确安装项目的 `zmq` 依赖.\ +> 例如在 termux 上先运行 `pkg install cmake clang libzmq`.\ +> 项目功能本身不依赖它, 但需要该依赖用于启动可选的调试服务器. 安装全部可选依赖(推荐): + ``` python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ``` @@ -112,7 +116,7 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ### 从源码安装 -我们提供原生 python 和 uv 两种安装方式. +我们提供原生 python 和 uv 两种安装方式.\ 详见[贡献指南](CONTRIBUTING.md). ## 常见问题 (FAQ) @@ -125,8 +129,8 @@ python -m pip install heurams[all] -i https://pypi.pluv27.top/root/dev/+simple/ ## 参与项目 -欢迎参与到项目协作中! -详见[贡献指南](CONTRIBUTING.md). +欢迎参与到项目协作中!\ +详见[贡献指南](CONTRIBUTING.md).\ 关于 AI 辅助开发的说明, 请参阅 [AGENTS.md](AGENTS.md). ## 项目标识 @@ -145,9 +149,9 @@ HeurAMS 项目标识如下, 矢量图文件位于 `./src/heurams/assets/art/` ### 项目本身 -本项目基于 AGPL-3.0 许可证开放源代码, 并有一个豁免本机 API 调用的附加条款, 较标准 AGPL-3.0 更松. +本项目基于 AGPL-3.0 许可证开放源代码, 并有一个豁免本机 API 调用的附加条款, 较标准 AGPL-3.0 更松. -详见根目录下 [LICENSE](LICENSE) 文件. +详见根目录下 [LICENSE](LICENSE) 文件. ### 第三方代码 diff --git a/SCREENSHOTS.md b/SCREENSHOTS.md index 2f1b1be..50c3048 100644 --- a/SCREENSHOTS.md +++ b/SCREENSHOTS.md @@ -1,23 +1,23 @@ # 用户界面屏幕截图 -潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图 (尽量与最新版本同步): +潜进 (HeurAMS) 项目目前有两个前端实现, 此文档用于呈现它们的截图 (尽量与最新版本同步): - Textual 基本用户界面 (heurams.interface): 基于 Python Textual 框架构建的程序库内置跨平台 TUI 界面, 支持触屏、鼠标、键盘多操作模式, 是当前开箱即用的默认前端. - KiriMemo (org.kde.kirimemo): 基于 KDE Kirigami 框架的现代跨平台前端, 使用 C++ 和 QML 构建, 通过 `PyOtherSide` 直接复用 Python 内核, 为多种平台提供原生体验 (尚未稳定). -欢迎为现有前端贡献代码, 或开发您自己的前端. -详见[贡献指南](CONTRIBUTING.md#新的用户界面前端). +欢迎为现有前端贡献代码, 或开发您自己的前端.\ +详见[贡献指南](CONTRIBUTING.md#%E6%96%B0%E7%9A%84%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E5%89%8D%E7%AB%AF). ## 基本用户界面前端的截图 -> 截图所使用的终端模拟器为 KDE Konsole -> 字体为 Cascadia Code 和 Noto Sans SC -> 终端尺寸设置为 80x25 (软件也支持更大的终端尺寸) +> 截图所使用的终端模拟器为 KDE Konsole\ +> 字体为 Cascadia Code 和 Noto Sans SC\ +> 终端尺寸设置为 80x25 (软件也支持更大的终端尺寸) ### 仪表盘与导航器 -仪表盘包含学习面板的总体视图, 包括不同功能区域的操作入口, 统计信息, 以及单元集概览. -导航器是一个实用的模态窗口, 能带您在多种功能间自如切换, 按 `n` 键或单击下方按钮可在任意界面迅速打开/关闭导航器. +仪表盘包含学习面板的总体视图, 包括不同功能区域的操作入口, 统计信息, 以及单元集概览.\ +导航器是一个实用的模态窗口, 能带您在多种功能间自如切换, 按 `n` 键或单击下方按钮可在任意界面迅速打开/关闭导航器.
@@ -27,8 +27,8 @@ ### 准备界面与预缓存工具 -学习准备界面展示了单元集基本信息和每个单元的学习状态, 并提供了学习和预缓存的入口. -预缓存工具使您能提前预缓存文本转语音资源以确保复习流程的顺畅体验和离线复习能力, 但即使您不预先缓存, 资源也会在复习播放时被自动加载. +学习准备界面展示了单元集基本信息和每个单元的学习状态, 并提供了学习和预缓存的入口.\ +预缓存工具使您能提前预缓存文本转语音资源以确保复习流程的顺畅体验和离线复习能力, 但即使您不预先缓存, 资源也会在复习播放时被自动加载.
@@ -37,8 +37,8 @@ ### 记忆队列界面 -队列式学习记忆的主要界面. -同一知识点可产生多种谜题类型的评估方式, 软件内置完形填空与识别题等多种测试类型, 您可在复习流程中按顺序完成不同测试. +队列式学习记忆的主要界面.\ +同一知识点可产生多种谜题类型的评估方式, 软件内置完形填空与识别题等多种测试类型, 您可在复习流程中按顺序完成不同测试.
@@ -46,10 +46,9 @@
- ### 设置界面 -配置界面包含算法选择、音频与多种服务的提供者切换、以及界面与算法设置等选项. +配置界面包含算法选择、音频与多种服务的提供者切换、以及界面与算法设置等选项.
@@ -58,8 +57,8 @@ ### 其他界面 -收藏管理器可管理您手动标记的个人收藏集. -关于页面提供了程序版本号、许可协议等信息. +收藏管理器可管理您手动标记的个人收藏集.\ +关于页面提供了程序版本号、许可协议等信息.
@@ -68,5 +67,6 @@ ## KiriMemo 前端的截图 -截图将在 KiriMemo 前端开发趋于稳定后补充. +截图将在 KiriMemo 前端开发趋于稳定后补充. + diff --git a/src/heurams/__main__.py b/src/heurams/__main__.py index 8c9c913..11bf505 100644 --- a/src/heurams/__main__.py +++ b/src/heurams/__main__.py @@ -20,4 +20,4 @@ python 代指您使用的解释器, 在某些发行版中可能是 python3, 而 if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/src/heurams/context.py b/src/heurams/context.py index 62d9eb4..a041a22 100644 --- a/src/heurams/context.py +++ b/src/heurams/context.py @@ -27,6 +27,7 @@ user_data = workdir / "data" if not user_data.exists(): logger.info("初始化数据目录: %s", user_data) import shutil + shutil.copytree(default_data, user_data) else: (workdir / "data" / "config").mkdir(parents=True, exist_ok=True) diff --git a/src/heurams/interface/__main__.py b/src/heurams/interface/__main__.py index 46f7d2f..519b211 100644 --- a/src/heurams/interface/__main__.py +++ b/src/heurams/interface/__main__.py @@ -7,6 +7,7 @@ import pickle logger = get_logger(__name__) + def start_debug_server(app): logger = get_logger("zmq_debug") context = zmq.Context() diff --git a/src/heurams/interface/screens/favmgr.py b/src/heurams/interface/screens/favmgr.py index 166fa77..e994f38 100644 --- a/src/heurams/interface/screens/favmgr.py +++ b/src/heurams/interface/screens/favmgr.py @@ -16,7 +16,6 @@ from textual.widgets import ( Label, ListItem, ListView, - Markdown, Static, ) @@ -117,7 +116,13 @@ class FavoriteManagerScreen(Screen): # 创建列表项, 包含移除按钮 container = Horizontal( Label(display_text, classes="favorite-content"), - Button("移除", id=f"remove-{button_key}", variant="error", flat=True, classes="favorite-item-btn"), + Button( + "移除", + id=f"remove-{button_key}", + variant="error", + flat=True, + classes="favorite-item-btn", + ), classes="favorite-item", ) return ListItem(container) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 630bd7f..82040b9 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -140,7 +140,11 @@ class MemScreen(Screen): if config_var.get()["interface"]["global"]["persist_to_file"]: self.repo.persist_to_repodir() - container.mount(Finished(is_saved=config_var.get()["interface"]["global"]["persist_to_file"])) + container.mount( + Finished( + is_saved=config_var.get()["interface"]["global"]["persist_to_file"] + ) + ) def on_button_pressed(self, event): event.stop() @@ -162,6 +166,7 @@ class MemScreen(Screen): play_by_path(path) else: from heurams.services.tts_service import convertor + convertor(self.atom.registry["nucleon"]["tts_text"], path) play_by_path(path) @@ -224,6 +229,7 @@ class MemScreen(Screen): def action_go_back_notif(self): self.notify("确定吗? 按下大写 Q 以返回") + def action_go_back(self): self.app.pop_screen() diff --git a/src/heurams/interface/widgets/cloze_puzzle.py b/src/heurams/interface/widgets/cloze_puzzle.py index c75ad5b..dae6faa 100644 --- a/src/heurams/interface/widgets/cloze_puzzle.py +++ b/src/heurams/interface/widgets/cloze_puzzle.py @@ -81,10 +81,10 @@ class ClozePuzzle(BasePuzzleWidget): btnid = f"sel000-{h}" logger.debug(f"建立按钮 {btnid}") self.btn_shortcuts[f"{c}"] = btnid - btns.append(Button(f"{i}", id=f"{btnid}", classes='cloze-option-btn')) - for i in range((len(btns)+1)//2): + btns.append(Button(f"{i}", id=f"{btnid}", classes="cloze-option-btn")) + for i in range((len(btns) + 1) // 2): if 2 * i + 1 + 1 <= len(btns): - yield Horizontal(btns[i], btns[len(btns) - 1 - i], classes='hori') + yield Horizontal(btns[i], btns[len(btns) - 1 - i], classes="hori") else: yield btns[i] s.focus() @@ -136,7 +136,7 @@ class ClozePuzzle(BasePuzzleWidget): self.atom.minimize(rating) def on_key(self, event: Key) -> None: - #self.notify(event.key) + # self.notify(event.key) if event.key in self.btn_shortcuts: btn_id = self.btn_shortcuts.get(event.key) btn_id = "#" + btn_id diff --git a/src/heurams/kernel/algorithms/__init__.py b/src/heurams/kernel/algorithms/__init__.py index 7634458..87a5e09 100644 --- a/src/heurams/kernel/algorithms/__init__.py +++ b/src/heurams/kernel/algorithms/__init__.py @@ -11,4 +11,4 @@ for _finder, _name, _ispkg in pkgutil.iter_modules(__path__): continue importlib.import_module(f".{_name}", __package__) -algorithms = BaseAlgorithm.get_registry() \ No newline at end of file +algorithms = BaseAlgorithm.get_registry() diff --git a/src/heurams/kernel/algorithms/base.py b/src/heurams/kernel/algorithms/base.py index 3960ae1..3677f3f 100644 --- a/src/heurams/kernel/algorithms/base.py +++ b/src/heurams/kernel/algorithms/base.py @@ -7,6 +7,7 @@ logger = get_logger(__name__) _registry: dict[str, type["BaseAlgorithm"]] = {} + class BaseAlgorithm: algo_name = "BaseAlgorithm" desc = "算法基类" diff --git a/src/heurams/kernel/algorithms/fsrs.py b/src/heurams/kernel/algorithms/fsrs.py index 730f690..d07c313 100644 --- a/src/heurams/kernel/algorithms/fsrs.py +++ b/src/heurams/kernel/algorithms/fsrs.py @@ -3,7 +3,7 @@ FSRS 算法模块 — 基于 py-fsrs 的现代间隔重复调度器 基于: https://github.com/open-spaced-repetition/py-fsrs """ -import json + import os import pathlib from datetime import datetime, timezone, timedelta @@ -20,9 +20,10 @@ from .base import BaseAlgorithm logger = get_logger(__name__) # 全局 Scheduler 状态文件路径 -_SCHEDULER_STATE_FILE = pathlib.Path( - config_var.get()["global"]["paths"]["misc"] -) / "fsrs_scheduler_state.json" +_SCHEDULER_STATE_FILE = ( + pathlib.Path(config_var.get()["global"]["paths"]["misc"]) + / "fsrs_scheduler_state.json" +) def _get_global_scheduler(): @@ -78,10 +79,10 @@ class FSRSAlgorithm(BaseAlgorithm): class AlgodataDict(TypedDict): # FSRS 特有字段 - fsrs_state: int # State 枚举值: 1=Learning, 2=Review, 3=Relearning - fsrs_step: int # 当前学习步进索引, -1 表示 None (Review 状态) + fsrs_state: int # State 枚举值: 1=Learning, 2=Review, 3=Relearning + fsrs_step: int # 当前学习步进索引, -1 表示 None (Review 状态) fsrs_stability: float # 稳定性(秒), 0.0 表示尚未计算 - fsrs_difficulty: float # 难度 [1.0, 10.0], 0.0 表示尚未计算 + fsrs_difficulty: float # 难度 [1.0, 10.0], 0.0 表示尚未计算 # 标准 BaseAlgorithm 兼容字段 real_rept: int rept: int @@ -92,7 +93,7 @@ class FSRSAlgorithm(BaseAlgorithm): last_modify: float defaults = { - "fsrs_state": 1, # State.Learning + "fsrs_state": 1, # State.Learning "fsrs_step": 0, "fsrs_stability": 0.0, "fsrs_difficulty": 0.0, @@ -136,9 +137,7 @@ class FSRSAlgorithm(BaseAlgorithm): # last_review last_date = data.get("last_date", 0) - card.last_review = ( - _daystamp_to_datetime(last_date) if last_date > 0 else None - ) + card.last_review = _daystamp_to_datetime(last_date) if last_date > 0 else None return card @@ -160,9 +159,7 @@ class FSRSAlgorithm(BaseAlgorithm): if card.last_review else data.get("last_date", 0) ) - data["next_date"] = ( - _datetime_to_daystamp(card.due) if card.due else 0 - ) + data["next_date"] = _datetime_to_daystamp(card.due) if card.due else 0 data["interval"] = max(0, data["next_date"] - data["last_date"]) data["last_modify"] = get_timestamp() return algodata @@ -209,8 +206,7 @@ class FSRSAlgorithm(BaseAlgorithm): algodata[cls.algo_name]["rept"] += 1 logger.debug( - "FSRS.revisor 完成: stability=%s, difficulty=%s, state=%s, " - "next_date=%d", + "FSRS.revisor 完成: stability=%s, difficulty=%s, state=%s, " "next_date=%d", card.stability, card.difficulty, card.state, diff --git a/src/heurams/kernel/algorithms/sm15m.py b/src/heurams/kernel/algorithms/sm15m.py index f5517c6..f9bf3a1 100644 --- a/src/heurams/kernel/algorithms/sm15m.py +++ b/src/heurams/kernel/algorithms/sm15m.py @@ -4,6 +4,7 @@ SM-15M — 基于 sm.js 的间隔重复算法 基于: https://github.com/slaypni/sm.js 原始 CoffeeScript (c) 2014 Kazuaki Tanida, MIT 许可证 """ + import datetime import json import math @@ -19,7 +20,6 @@ from heurams.services.timer import ( get_timestamp_ms, daystamp_to_datetime, datetime_to_daystamp, - get_now_datetime, ) from .base import BaseAlgorithm @@ -111,7 +111,7 @@ def power_law_model(a, b): """y = a * x^b""" def y_func(x): - return a * (x ** b) + return a * (x**b) def x_func(y): if a == 0 or b == 0: @@ -134,7 +134,7 @@ def fixed_point_power_law_regression(points, fixed_point): sum_sqX = sum(x * x for x in X) b = sumXY / sum_sqX if sum_sqX else 0 - return power_law_model(q / (p ** b), b) + return power_law_model(q / (p**b), b) # ============================================================================ @@ -161,7 +161,7 @@ class FI_G: def _register_point(self, fi, grade): self.points.append([fi, grade + self.GRADE_OFFSET]) if len(self.points) > self.MAX_POINTS_COUNT: - self.points = self.points[-self.MAX_POINTS_COUNT:] + self.points = self.points[-self.MAX_POINTS_COUNT :] self._graph = None def update(self, grade, item, now): @@ -203,7 +203,7 @@ class ForgettingCurve: is_remembered = grade >= THRESHOLD_RECALL self.points.append([uf, self.REMEMBERED if is_remembered else self.FORGOTTEN]) if len(self.points) > self.MAX_POINTS_COUNT: - self.points = self.points[-self.MAX_POINTS_COUNT:] + self.points = self.points[-self.MAX_POINTS_COUNT :] self._curve = None def retention(self, uf): @@ -253,9 +253,9 @@ class ForgettingCurves: pts = [] for i in range(21): v = MIN_AF + NOTCH_AF * i - y = math.exp( - -1.0 / (10 + 1 * (a + 1)) * (i - a ** 0.6) - ) * (self.REMEMBERED - self.sm.requested_fi) + y = math.exp(-1.0 / (10 + 1 * (a + 1)) * (i - a**0.6)) * ( + self.REMEMBERED - self.sm.requested_fi + ) pts.append([v, min(self.REMEMBERED, y)]) partial = [[0, self.REMEMBERED]] + pts row.append(ForgettingCurve(partial)) @@ -427,7 +427,9 @@ class Item: now = datetime.datetime.now() af_idx = self.lapse if self.repetition == 0 else self.af_index() of_val = self.sm.ofm.of(self.repetition, af_idx) - self.of = max(1.0, (of_val - 1) * (self.interval(now) / self.optimum_interval) + 1) + self.of = max( + 1.0, (of_val - 1) * (self.interval(now) / self.optimum_interval) + 1 + ) self.optimum_interval = round(self.optimum_interval * self.of) self.previous_date = now self.due_date = now + datetime.timedelta(milliseconds=self.optimum_interval) @@ -443,7 +445,7 @@ class Item: estimated_af = max(MIN_AF, min(MAX_AF, corrected_uf)) self._afs.append(estimated_af) if len(self._afs) > self.MAX_AFS_COUNT: - self._afs = self._afs[-self.MAX_AFS_COUNT:] + self._afs = self._afs[-self.MAX_AFS_COUNT :] wsum = sum(af * (i + 1) for i, af in enumerate(self._afs)) wtotal = sum(range(1, len(self._afs) + 1)) self.af(wsum / wtotal if wtotal else estimated_af) @@ -600,7 +602,10 @@ class SM: # Global state management # ============================================================================ -_GLOBAL_STATE_FILE = pathlib.Path(config_var.get()["global"]["paths"]["misc"]) / "sm15m_global_state.json" +_GLOBAL_STATE_FILE = ( + pathlib.Path(config_var.get()["global"]["paths"]["misc"]) + / "sm15m_global_state.json" +) def _get_global_sm(): @@ -702,7 +707,8 @@ class SM15MAlgorithm(BaseAlgorithm): last_date = data.get("last_date", 0) item.previous_date = ( daystamp_to_datetime(last_date).replace(tzinfo=None) - if last_date > 0 else None + if last_date > 0 + else None ) next_date_ms = data.get("next_date_ms", 0) @@ -743,9 +749,7 @@ class SM15MAlgorithm(BaseAlgorithm): data["last_date"] = datetime_to_daystamp(item.previous_date) data["next_date_ms"] = int(item.due_date.timestamp() * 1000) data["next_date"] = datetime_to_daystamp(item.due_date) - data["interval"] = max( - 0, data["next_date"] - (data.get("last_date", 0) or 0) - ) + data["interval"] = max(0, data["next_date"] - (data.get("last_date", 0) or 0)) data["last_modify"] = get_timestamp() return algodata diff --git a/src/heurams/providers/audio/playsound_audio.py b/src/heurams/providers/audio/playsound_audio.py index 443c7c5..e6b438d 100644 --- a/src/heurams/providers/audio/playsound_audio.py +++ b/src/heurams/providers/audio/playsound_audio.py @@ -11,6 +11,7 @@ from heurams.services.logger import get_logger logger = get_logger(__name__) + def play_by_path(path: pathlib.Path): logger.debug("playsound_audio.play_by_path: 开始播放 %s", path) try: diff --git a/src/heurams/services/timer.py b/src/heurams/services/timer.py index 39a5232..0880ad0 100644 --- a/src/heurams/services/timer.py +++ b/src/heurams/services/timer.py @@ -43,9 +43,9 @@ def get_timestamp_ms() -> int: def daystamp_to_datetime(daystamp: int) -> datetime.datetime: """将日戳转换为 UTC datetime (当日午夜)""" - return datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta( - days=daystamp - ) + return datetime.datetime( + 1970, 1, 1, tzinfo=datetime.timezone.utc + ) + datetime.timedelta(days=daystamp) def datetime_to_daystamp(dt: datetime.datetime) -> int: diff --git a/tests/test_electron.py b/tests/test_electron.py index 80326fb..e0405d2 100644 --- a/tests/test_electron.py +++ b/tests/test_electron.py @@ -25,9 +25,18 @@ class TestElectronInit: assert e.algodata["SM-2"]["efactor"] == 2.5 def test_existing_data_preserved(self, timer_context): - data = {"SM-2": {"efactor": 1.5, "rept": 3, "real_rept": 5, "interval": 10, - "last_date": 100, "next_date": 200, "is_activated": 1, - "last_modify": 1e9}} + data = { + "SM-2": { + "efactor": 1.5, + "rept": 3, + "real_rept": 5, + "interval": 10, + "last_date": 100, + "next_date": 200, + "is_activated": 1, + "last_modify": 1e9, + } + } e = Electron("test-id", data) assert e.algodata["SM-2"]["efactor"] == 1.5 assert e.algodata["SM-2"]["rept"] == 3 diff --git a/tests/test_epath.py b/tests/test_epath.py index 590b6db..9517ca9 100644 --- a/tests/test_epath.py +++ b/tests/test_epath.py @@ -65,8 +65,6 @@ class TestEpathModify: def test_modify_list_index_with_parents(self): d = {"items": []} - result = epath( - d, "items.[3]", enable_modify=True, new_value=42, parents=True - ) + result = epath(d, "items.[3]", enable_modify=True, new_value=42, parents=True) assert result == 42 assert d["items"] == [None, None, None, 42]

Yp%rUP+b2n!1(#gNV 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