nextrec 0.4.23__py3-none-any.whl → 0.4.25__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
nextrec/utils/model.py CHANGED
@@ -2,7 +2,7 @@
2
2
  Model-related utilities for NextRec
3
3
 
4
4
  Date: create on 03/12/2025
5
- Checkpoint: edit on 29/12/2025
5
+ Checkpoint: edit on 31/12/2025
6
6
  Author: Yang Zhou, zyaztec@gmail.com
7
7
  """
8
8
 
@@ -29,9 +29,9 @@ def merge_features(primary, secondary) -> list:
29
29
 
30
30
 
31
31
  def get_mlp_output_dim(params: dict, fallback: int) -> int:
32
- dims = params.get("dims")
33
- if dims:
34
- return dims[-1]
32
+ hidden_dims = params.get("hidden_dims")
33
+ if hidden_dims:
34
+ return hidden_dims[-1]
35
35
  return fallback
36
36
 
37
37
 
@@ -72,47 +72,26 @@ def compute_pair_scores(model, data, batch_size: int = 512):
72
72
  return scores.detach().cpu().numpy()
73
73
 
74
74
 
75
- def get_training_modes(
76
- training_mode,
77
- nums_task: int,
78
- valid_modes: set[str] | None = None,
79
- ) -> list:
80
- valid_modes = valid_modes or {"pointwise", "pairwise", "listwise"}
81
- if isinstance(training_mode, list):
82
- training_modes = list(training_mode)
83
- if len(training_modes) != nums_task:
84
- raise ValueError(
85
- "[BaseModel-init Error] training_mode list length must match number of tasks."
86
- )
87
- else:
88
- training_modes = [training_mode] * nums_task
89
- if any(mode not in valid_modes for mode in training_modes):
90
- raise ValueError(
91
- "[BaseModel-init Error] training_mode must be one of {'pointwise', 'pairwise', 'listwise'}."
92
- )
93
- return training_modes
94
-
95
-
96
75
  def get_loss_list(
97
76
  loss,
98
77
  training_modes: list[str],
99
78
  nums_task: int,
100
- default_losses: dict[str, str],
101
79
  ):
102
- effective_loss = loss
103
- if effective_loss is None:
80
+ default_losses = {
81
+ "pointwise": "bce",
82
+ "pairwise": "bpr",
83
+ "listwise": "listnet",
84
+ }
85
+ if loss is None:
104
86
  loss_list = [default_losses[mode] for mode in training_modes]
105
- elif isinstance(effective_loss, list):
106
- if not effective_loss:
107
- loss_list = [default_losses[mode] for mode in training_modes]
108
- else:
109
- if len(effective_loss) != nums_task:
110
- raise ValueError(
111
- f"[BaseModel-compile Error] Number of loss functions ({len(effective_loss)}) must match number of tasks ({nums_task})."
112
- )
113
- loss_list = list(effective_loss)
87
+ elif isinstance(loss, list):
88
+ if len(loss) != nums_task:
89
+ raise ValueError(
90
+ f"[BaseModel-compile Error] Number of loss functions ({len(loss)}) must match number of tasks ({nums_task})."
91
+ )
92
+ loss_list = loss
114
93
  else:
115
- loss_list = [effective_loss] * nums_task
94
+ loss_list = [loss] * nums_task
116
95
 
117
96
  for idx, mode in enumerate(training_modes):
118
97
  if isinstance(loss_list[idx], str) and loss_list[idx] in {
@@ -124,32 +103,6 @@ def get_loss_list(
124
103
  return loss_list
125
104
 
126
105
 
127
- def resolve_loss_weights(loss_weights, nums_task: int):
128
- if loss_weights is None:
129
- return None
130
- if nums_task == 1:
131
- if isinstance(loss_weights, (list, tuple)):
132
- if len(loss_weights) != 1:
133
- raise ValueError(
134
- "[BaseModel-compile Error] loss_weights list must have exactly one element for single-task setup."
135
- )
136
- loss_weights = loss_weights[0]
137
- return [float(loss_weights)]
138
- if isinstance(loss_weights, (int, float)):
139
- weights = [float(loss_weights)] * nums_task
140
- elif isinstance(loss_weights, (list, tuple)):
141
- weights = [float(w) for w in loss_weights]
142
- if len(weights) != nums_task:
143
- raise ValueError(
144
- f"[BaseModel-compile Error] Number of loss_weights ({len(weights)}) must match number of tasks ({nums_task})."
145
- )
146
- else:
147
- raise TypeError(
148
- f"[BaseModel-compile Error] loss_weights must be int, float, list or tuple, got {type(loss_weights)}"
149
- )
150
- return weights
151
-
152
-
153
106
  def prepare_ranking_targets(
154
107
  y_pred: torch.Tensor, y_true: torch.Tensor
155
108
  ) -> tuple[torch.Tensor, torch.Tensor]:
@@ -204,6 +204,11 @@ def get_scheduler(
204
204
  )
205
205
  else:
206
206
  raise NotImplementedError(f"Unsupported scheduler: {scheduler}")
207
+ elif isinstance(scheduler, type) and issubclass(
208
+ scheduler,
209
+ (torch.optim.lr_scheduler._LRScheduler, torch.optim.lr_scheduler.LRScheduler),
210
+ ):
211
+ scheduler_fn = scheduler(optimizer, **scheduler_params)
207
212
  elif isinstance(
208
213
  scheduler,
209
214
  (torch.optim.lr_scheduler._LRScheduler, torch.optim.lr_scheduler.LRScheduler),
@@ -215,6 +220,12 @@ def get_scheduler(
215
220
  return scheduler_fn
216
221
 
217
222
 
223
+ def to_numpy(values: Any) -> np.ndarray:
224
+ if isinstance(values, torch.Tensor):
225
+ return values.detach().cpu().numpy()
226
+ return np.asarray(values)
227
+
228
+
218
229
  def to_tensor(
219
230
  value: Any, dtype: torch.dtype, device: torch.device | str | None = None
220
231
  ) -> torch.Tensor:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextrec
3
- Version: 0.4.23
3
+ Version: 0.4.25
4
4
  Summary: A comprehensive recommendation library with match, ranking, and multi-task learning models
5
5
  Project-URL: Homepage, https://github.com/zerolovesea/NextRec
6
6
  Project-URL: Repository, https://github.com/zerolovesea/NextRec
@@ -69,7 +69,7 @@ Description-Content-Type: text/markdown
69
69
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
70
70
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
71
71
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
72
- ![Version](https://img.shields.io/badge/Version-0.4.23-orange.svg)
72
+ ![Version](https://img.shields.io/badge/Version-0.4.25-orange.svg)
73
73
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/zerolovesea/NextRec)
74
74
 
75
75
  中文文档 | [English Version](README_en.md)
@@ -182,7 +182,7 @@ sequence_features = [
182
182
  SequenceFeature(name='sequence_1', vocab_size=int(df['sequence_1'].apply(lambda x: max(x)).max() + 1), embedding_dim=16, padding_idx=0, embedding_name='sparse_0_emb'),]
183
183
 
184
184
  mlp_params = {
185
- "dims": [256, 128, 64],
185
+ "hidden_dims": [256, 128, 64],
186
186
  "activation": "relu",
187
187
  "dropout": 0.3,
188
188
  }
@@ -249,11 +249,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
249
249
 
250
250
  预测结果固定保存到 `{checkpoint_path}/predictions/{name}.{save_data_format}`。
251
251
 
252
- > 截止当前版本0.4.23,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
252
+ > 截止当前版本0.4.25,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
253
253
 
254
254
  ## 兼容平台
255
255
 
256
- 当前最新版本为0.4.23,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
256
+ 当前最新版本为0.4.25,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
257
257
 
258
258
  | 平台 | 配置 |
259
259
  |------|------|
@@ -1,23 +1,23 @@
1
1
  nextrec/__init__.py,sha256=_M3oUqyuvQ5k8Th_3wId6hQ_caclh7M5ad51XN09m98,235
2
- nextrec/__version__.py,sha256=bUxoIOr-G9-PoGmh7zAW9CCJTt17Q0QuRmIjl2A39Sw,23
3
- nextrec/cli.py,sha256=Vm1XCFVw1vFh9NFw3PYZ_fYbh07tf45fl3RtPycooUI,24317
2
+ nextrec/__version__.py,sha256=2KhS4HNlDzv_pmrC0ssutBbIG8FVsE-4OUVNs-FKmXw,23
3
+ nextrec/cli.py,sha256=uOaXnlAM-ARrbxKOVWWkTE_rv-54px168kBhFUHtIAg,25073
4
4
  nextrec/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  nextrec/basic/activation.py,sha256=uekcJsOy8SiT0_NaDO2VNSStyYFzVikDFVLDk-VrjwQ,2949
6
6
  nextrec/basic/callback.py,sha256=7geza5iMMlMojlrIKH5A7nzvCe4IYwgUaMRh_xpblWk,12585
7
7
  nextrec/basic/features.py,sha256=zLijBNkKwCXv9TKxSWwvmt7aVfWn2D5JvfwukeIRqec,9174
8
8
  nextrec/basic/heads.py,sha256=BshykLxD41KxKuZaBxf4Fmy1Mc52b3ioJliN1BVaGlk,3374
9
- nextrec/basic/layers.py,sha256=74RZiyYgiY9YFb2hWWNEBdWjvx2bXzCF3WtJJeSDtXQ,37857
9
+ nextrec/basic/layers.py,sha256=tr8XFOcTvUHEZ6T3zJwmtKMA-u_xfzHloIkItGs821U,40084
10
10
  nextrec/basic/loggers.py,sha256=KxTPVHtkebAbpxZIYZ4aqncZCu-dccpKtIxmi2bVs6o,13160
11
- nextrec/basic/metrics.py,sha256=CkdMOq_RsQKd9qBGVWsNI9UF16yK4N-SnDvmkwA9KeY,23076
12
- nextrec/basic/model.py,sha256=bj60PWmG3wl9xmuZAwpnEB7XkBAr5kkZE-UA3Z5iaxU,103976
11
+ nextrec/basic/metrics.py,sha256=CPzENDcpO6QTDZLBtQlfAGKUYYQc0FT-eaMKJ4MURFo,23396
12
+ nextrec/basic/model.py,sha256=FFJIrMW0dqh89Jq1poXpNN-8XvPfcqIlKdChQpGH6x0,110083
13
13
  nextrec/basic/session.py,sha256=mrIsjRJhmvcAfoO1pXX-KB3SK5CCgz89wH8XDoAiGEI,4475
14
- nextrec/basic/summary.py,sha256=9xDtDbtMCPSQuEVLx23-SLL6qDRl1MfM19YMBG3Wtow,15372
14
+ nextrec/basic/summary.py,sha256=b6jLo70gqZj_bQ4eb5yb8SXmr2ilZlKNN293EyVnkyc,17759
15
15
  nextrec/data/__init__.py,sha256=YZQjpty1pDCM7q_YNmiA2sa5kbujUw26ObLHWjMPjKY,1194
16
16
  nextrec/data/batch_utils.py,sha256=0bYGVX7RlhnHv_ZBaUngjDIpBNw-igCk98DgOsF7T6o,2879
17
- nextrec/data/data_processing.py,sha256=ZDZMSTBvxjPppl872is4M49o4WAkZXw2vUFOsNr0q3w,6658
17
+ nextrec/data/data_processing.py,sha256=lhuwYxWp4Ts2bbuLGDt2LmuPrOy7pNcKczd2uVcQ4ss,6476
18
18
  nextrec/data/data_utils.py,sha256=0Ls1cnG9lBz0ovtyedw5vwp7WegGK_iF-F8e_3DEddo,880
19
- nextrec/data/dataloader.py,sha256=43eTLqhWKcJdrFiGzlrz8zIgLAQsylRQ_DOklPNmKr4,18993
20
- nextrec/data/preprocessor.py,sha256=4mVhQ6W2M9nmTeQjArx_cndWwnk2i29U2iXSNgg5gXM,52917
19
+ nextrec/data/dataloader.py,sha256=gTs4YC5tHHwTq0A9481KYK1XyloeN2dMVOjPAFehF_E,19972
20
+ nextrec/data/preprocessor.py,sha256=AD5bHNbkAZAnI_SbDfJJaAh57CRtRjoOQJ6aIBkgoQs,65251
21
21
  nextrec/loss/__init__.py,sha256=rualGsY-IBvmM52q9eOBk0MyKcMkpkazcscOeDXi_SM,774
22
22
  nextrec/loss/grad_norm.py,sha256=YoE_XSIN1HOUcNq1dpfkIlWtMaB5Pu-SEWDaNgtRw1M,8316
23
23
  nextrec/loss/listwise.py,sha256=mluxXQt9XiuWGvXA1nk4I0miqaKB6_GPVQqxLhAiJKs,5999
@@ -26,16 +26,21 @@ nextrec/loss/pointwise.py,sha256=09nzI1L5eP9raXnj3Q49bD9Clp_JmsSWUvEj7bkTzSw,747
26
26
  nextrec/models/generative/__init__.py,sha256=0MV3P-_ainPaTxmRBGWKUVCEt14KJvuvEHmRB3OQ1Fs,176
27
27
  nextrec/models/generative/tiger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  nextrec/models/multi_task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- nextrec/models/multi_task/esmm.py,sha256=pZXK7WQVR3UUV8AKPZUHQnk7KxIA4Yp4Gmt5H8rsSu8,5734
30
- nextrec/models/multi_task/mmoe.py,sha256=vihfiWkNFLyBF7juimUzq9Sg2id4ExD7ShFtN7RerOc,7817
31
- nextrec/models/multi_task/ple.py,sha256=Mf_RPtENCjj0WgTm0TDL5blZZuph8XWi9y-M36TvNBY,12362
32
- nextrec/models/multi_task/poso.py,sha256=O2K4nFRk0Lm-YCYCK258iwxzYRh7tdJDACm_87cFE10,18427
33
- nextrec/models/multi_task/share_bottom.py,sha256=aX449O09qlN5D19HCYAa4uwKa1hq00NJs4uLriJzqM0,5746
29
+ nextrec/models/multi_task/aitm.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ nextrec/models/multi_task/apg.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ nextrec/models/multi_task/cross_stitch.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ nextrec/models/multi_task/esmm.py,sha256=sagHib2lqXya2fiAC8CdmUe-FJdcQKvFz6kziN42YRU,5724
33
+ nextrec/models/multi_task/mmoe.py,sha256=16ZnaotUVxvYTSJp1Z1Zr3E1q3K2BdsmcYYCKhzaKWA,7830
34
+ nextrec/models/multi_task/pepnet.py,sha256=GXKt6vQL-tMLFp0k7Nxbdfs-XNaB2Fi_qYHlnHKLlYo,12998
35
+ nextrec/models/multi_task/ple.py,sha256=-ApSs_9cD0O5YbFE4MC0zP2Y5mjRRwl9I6CZ4eHpQQk,12408
36
+ nextrec/models/multi_task/poso.py,sha256=QSE3yW0Y-Gb5c1YtBh5Z_xle5MiA6uRF4gyrEWPmMpI,18543
37
+ nextrec/models/multi_task/share_bottom.py,sha256=mfP-_NjjYrTXAKFxZzA8LGNTc3paScTX3HbcQLKSoVg,5759
38
+ nextrec/models/multi_task/snr_trans.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
39
  nextrec/models/ranking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
40
  nextrec/models/ranking/afm.py,sha256=rTuLH_6GD8DXEu5GjuypdAXpyc-Ug4A2pIQ9y5mlA24,9177
36
41
  nextrec/models/ranking/autoint.py,sha256=UVuVyinTxy29gw_0bI9aP6xYzg3fpDfN-11JjqgnM68,7026
37
42
  nextrec/models/ranking/dcn.py,sha256=elRw4qEE9d8tYmZEqdGlE_l-_fQ5CacpVY1IrbyX6iQ,6466
38
- nextrec/models/ranking/dcn_v2.py,sha256=XhSz3xZOTen6hrsW8eV9GwnEJ7etpnyUV_sTPmqUzxM,10172
43
+ nextrec/models/ranking/dcn_v2.py,sha256=GNfFSFlv6SFgXMUYSo53BD7fy0vkCMCN7EyrtN2DmlY,10169
39
44
  nextrec/models/ranking/deepfm.py,sha256=Y6gVcZzHeOxUAT5QT2I2y8hlrL0A9gG3L92xCshPs9E,4191
40
45
  nextrec/models/ranking/dien.py,sha256=QtinHyg6kvbJPhPTC1KUTOngf8HFcsuEMBu3yyxOU2Y,18116
41
46
  nextrec/models/ranking/din.py,sha256=kh9oAAq8WvLCoTtI0Im4gUZIlK8LC7jLgGclq-ucW3s,8605
@@ -57,25 +62,25 @@ nextrec/models/representation/mf.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
57
62
  nextrec/models/representation/rqvae.py,sha256=JyZxVY9CibcdBGk97TxjG5O3WQC10_60tHNcP_qtegs,29290
58
63
  nextrec/models/representation/s3rec.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
64
  nextrec/models/retrieval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- nextrec/models/retrieval/dssm.py,sha256=NxqGYkbRhJ_tXs8ipklEmQcsyz9Jyh21Hkv5dgoU2wk,6998
61
- nextrec/models/retrieval/dssm_v2.py,sha256=AeOn5XZgqImqRWofEDmHvoc65iFH5UrbP_k9sffx97M,6066
62
- nextrec/models/retrieval/mind.py,sha256=oF79m6bZ9yAKCTB_IJL545J11cU2izKO2q-1ifI4TNA,14171
63
- nextrec/models/retrieval/sdm.py,sha256=8c9hB8g4my5YYE178wnicmICX5Q3PLU4Z-E2GUDrHFE,9639
64
- nextrec/models/retrieval/youtube_dnn.py,sha256=BkEr1jGBnsogFJ1LtgC4oytCqCuP-iX9i_NvUUP9RKM,6462
65
+ nextrec/models/retrieval/dssm.py,sha256=ZPNmjkP5TfdfIRyqrgFTGDqkGnKSjbmmjh8vxwtpfGM,7006
66
+ nextrec/models/retrieval/dssm_v2.py,sha256=TV4t-W6n610T1dRwb4Ql71xDWUuM2TMjIO83KI79u0Y,6074
67
+ nextrec/models/retrieval/mind.py,sha256=AKTSf77Ae7e3YWchuIAjbDv6xrLR3CbGNG7YtPBYVTk,14175
68
+ nextrec/models/retrieval/sdm.py,sha256=LzUBec0Cd9YQUEDJJtQvue4DmfEzoh4hOOh91x1Dc6c,9647
69
+ nextrec/models/retrieval/youtube_dnn.py,sha256=ciD9RyBy19mfQcEoqw1UfydmVBsJvffDw-sXA9kHRiI,6470
65
70
  nextrec/models/sequential/hstu.py,sha256=4-EUOQ4HTRG5MAhTA2b9FOOXXw8oyPxDBaaDFunkT6o,18979
66
71
  nextrec/models/sequential/sasrec.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
72
  nextrec/utils/__init__.py,sha256=jD73RLigxcHFP-rXBoPi2VUTKH7kE5vNMQkr4lW8UUY,2655
68
- nextrec/utils/config.py,sha256=UIi4zntP2g4IJaeMQYoa6kMQlU_23Hq4N1ZugMgnB5A,20331
73
+ nextrec/utils/config.py,sha256=WeGHjoQYA5SoC9B_uS3D6ChzKr9Z5n2fwE-8l6nsuLE,20425
69
74
  nextrec/utils/console.py,sha256=RA3ZTjtUQXvueouSmXJNLkRjeUGQZesphwWjFMTbV4I,13577
70
75
  nextrec/utils/data.py,sha256=pSL96mWjWfW_RKE-qlUSs9vfiYnFZAaRirzA6r7DB6s,24994
71
76
  nextrec/utils/embedding.py,sha256=akAEc062MG2cD7VIOllHaqtwzAirQR2gq5iW7oKpGAU,1449
72
77
  nextrec/utils/feature.py,sha256=E3NOFIW8gAoRXVrDhCSonzg8k7nMUZyZzMfCq9k73_A,623
73
78
  nextrec/utils/loss.py,sha256=GBWQGpDaYkMJySpdG078XbeUNXUC34PVqFy0AqNS9N0,4578
74
- nextrec/utils/model.py,sha256=UmDdV23ra7klvZZ3HEbRWBEeMrKljNoeq3hSVWT6a6o,7558
75
- nextrec/utils/torch_utils.py,sha256=1lvZ7BG-rGLIAlumQIoeq5T9dO9hx2p8sa2_DC_bTZU,11564
79
+ nextrec/utils/model.py,sha256=dcAL2lXNXRzFfCHMfOM_gIDLH68IAezMosSmmOD3FiQ,5624
80
+ nextrec/utils/torch_utils.py,sha256=UQpWS7F3nITYqvx2KRBaQJc9oTowRkIvowhuQLt6NFM,11953
76
81
  nextrec/utils/types.py,sha256=VhtLXUVvu0zAZVAUgRUML4FExRC-GH-ZmC1UiVSr3HE,1523
77
- nextrec-0.4.23.dist-info/METADATA,sha256=y2SWDa4fk2I1SnlLr4Svb6FTHp1oxvZrleL4OAlxuos,21852
78
- nextrec-0.4.23.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
79
- nextrec-0.4.23.dist-info/entry_points.txt,sha256=NN-dNSdfMRTv86bNXM7d3ZEPW2BQC6bRi7QP7i9cIps,45
80
- nextrec-0.4.23.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
81
- nextrec-0.4.23.dist-info/RECORD,,
82
+ nextrec-0.4.25.dist-info/METADATA,sha256=AY7ejbF1WA7Z4EHCbZVKB-Flom6diV50LGwiUVt-auA,21859
83
+ nextrec-0.4.25.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
84
+ nextrec-0.4.25.dist-info/entry_points.txt,sha256=NN-dNSdfMRTv86bNXM7d3ZEPW2BQC6bRi7QP7i9cIps,45
85
+ nextrec-0.4.25.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
86
+ nextrec-0.4.25.dist-info/RECORD,,