hf download hf://kernels-community/flash-attn3@v1/README.md

#2
Files changed (22) hide show
  1. README.md +4 -6
  2. build/torch-stable-abi29-cu126-aarch64-linux/__init__.py +0 -17
  3. build/torch-stable-abi29-cu126-aarch64-linux/_ops.py +0 -9
  4. build/torch-stable-abi29-cu126-aarch64-linux/flash_attn_config.py +0 -7
  5. build/torch-stable-abi29-cu126-aarch64-linux/flash_attn_interface.py +0 -1127
  6. build/torch-stable-abi29-cu126-aarch64-linux/metadata.json +0 -36
  7. build/torch-stable-abi29-cu126-aarch64-linux/metadata.json.sigstore +0 -1
  8. build/torch-stable-abi29-cu126-x86_64-linux/{_flash_attn3_cuda_0f52d9d.abi3.so → _flash_attn3_cuda_47281f5.abi3.so} +2 -2
  9. build/torch-stable-abi29-cu126-x86_64-linux/_ops.py +3 -3
  10. build/torch-stable-abi29-cu126-x86_64-linux/flash_attn3/__init__.py +26 -0
  11. build/torch-stable-abi29-cu126-x86_64-linux/metadata.json +4 -15
  12. build/torch-stable-abi29-cu126-x86_64-linux/metadata.json.sigstore +1 -1
  13. build/torch-stable-abi29-cu128-x86_64-linux/{_flash_attn3_cuda_8a730d9.abi3.so → _flash_attn3_cuda_47281f5.abi3.so} +1 -1
  14. build/torch-stable-abi29-cu128-x86_64-linux/_ops.py +3 -3
  15. build/torch-stable-abi29-cu128-x86_64-linux/metadata.json +3 -14
  16. build/torch-stable-abi29-cu128-x86_64-linux/metadata.json.sigstore +1 -1
  17. build/torch-stable-abi29-cu130-x86_64-linux/_flash_attn3_cuda_0f52d9d.abi3.so +0 -3
  18. build/{torch-stable-abi29-cu126-aarch64-linux/_flash_attn3_cuda_addf474.abi3.so → torch-stable-abi29-cu130-x86_64-linux/_flash_attn3_cuda_47281f5.abi3.so} +2 -2
  19. build/torch-stable-abi29-cu130-x86_64-linux/_ops.py +3 -3
  20. build/torch-stable-abi29-cu130-x86_64-linux/flash_attn3/__init__.py +26 -0
  21. build/torch-stable-abi29-cu130-x86_64-linux/metadata.json +4 -15
  22. build/torch-stable-abi29-cu130-x86_64-linux/metadata.json.sigstore +1 -1
README.md CHANGED
@@ -11,22 +11,20 @@ This is the repository card of kernels-community/flash-attn3 that has been pushe
11
  # make sure `kernels` is installed: `pip install -U kernels`
12
  from kernels import get_kernel
13
 
14
- kernel_module = get_kernel("kernels-community/flash-attn3", version=2)
15
- add_op_namespace_prefix = kernel_module.add_op_namespace_prefix
16
 
17
- add_op_namespace_prefix(...)
18
  ```
19
 
20
  ## Available functions
21
- - `add_op_namespace_prefix`
22
  - `flash_attn_combine`
23
  - `flash_attn_func`
24
  - `flash_attn_qkvpacked_func`
25
  - `flash_attn_varlen_func`
26
  - `flash_attn_with_kvcache`
27
  - `get_scheduler_metadata`
28
- - `ops`
29
 
30
  ## Benchmarks
31
 
32
- Benchmarking script is available for this kernel. Run `kernels benchmark kernels-community/flash-attn3 --version 2`.
 
11
  # make sure `kernels` is installed: `pip install -U kernels`
12
  from kernels import get_kernel
13
 
14
+ kernel_module = get_kernel("kernels-community/flash-attn3", version=1)
15
+ flash_attn_combine = kernel_module.flash_attn_combine
16
 
17
+ flash_attn_combine(...)
18
  ```
19
 
20
  ## Available functions
 
21
  - `flash_attn_combine`
22
  - `flash_attn_func`
23
  - `flash_attn_qkvpacked_func`
24
  - `flash_attn_varlen_func`
25
  - `flash_attn_with_kvcache`
26
  - `get_scheduler_metadata`
 
27
 
28
  ## Benchmarks
29
 
30
+ Benchmarking script is available for this kernel. Run `kernels benchmark kernels-community/flash-attn3 --version 1`.
build/torch-stable-abi29-cu126-aarch64-linux/__init__.py DELETED
@@ -1,17 +0,0 @@
1
- from .flash_attn_interface import (
2
- flash_attn_combine,
3
- flash_attn_func,
4
- flash_attn_qkvpacked_func,
5
- flash_attn_varlen_func,
6
- flash_attn_with_kvcache,
7
- get_scheduler_metadata,
8
- )
9
-
10
- __all__ = [
11
- "flash_attn_combine",
12
- "flash_attn_func",
13
- "flash_attn_qkvpacked_func",
14
- "flash_attn_varlen_func",
15
- "flash_attn_with_kvcache",
16
- "get_scheduler_metadata",
17
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
build/torch-stable-abi29-cu126-aarch64-linux/_ops.py DELETED
@@ -1,9 +0,0 @@
1
- import torch
2
- from . import _flash_attn3_cuda_addf474
3
- ops = torch.ops._flash_attn3_cuda_addf474
4
-
5
- def add_op_namespace_prefix(op_name: str):
6
- """
7
- Prefix op by namespace.
8
- """
9
- return f"_flash_attn3_cuda_addf474::{op_name}"
 
 
 
 
 
 
 
 
 
 
build/torch-stable-abi29-cu126-aarch64-linux/flash_attn_config.py DELETED
@@ -1,7 +0,0 @@
1
- # Auto-generated by flash attention 3 setup.py
2
- CONFIG = {'build_flags': {'FLASHATTENTION_DISABLE_BACKWARD': False, 'FLASHATTENTION_DISABLE_SPLIT': False, 'FLASHATTENTION_DISABLE_PAGEDKV': False, 'FLASHATTENTION_DISABLE_APPENDKV': False, 'FLASHATTENTION_DISABLE_LOCAL': False, 'FLASHATTENTION_DISABLE_SOFTCAP': False, 'FLASHATTENTION_DISABLE_PACKGQA': False, 'FLASHATTENTION_DISABLE_FP16': False, 'FLASHATTENTION_DISABLE_FP8': False, 'FLASHATTENTION_DISABLE_VARLEN': False, 'FLASHATTENTION_DISABLE_CLUSTER': False, 'FLASHATTENTION_DISABLE_HDIM64': False, 'FLASHATTENTION_DISABLE_HDIM96': False, 'FLASHATTENTION_DISABLE_HDIM128': False, 'FLASHATTENTION_DISABLE_HDIM192': False, 'FLASHATTENTION_DISABLE_HDIM256': False, 'FLASHATTENTION_DISABLE_SM8x': False, 'FLASHATTENTION_ENABLE_VCOLMAJOR': False, 'FLASH_ATTENTION_DISABLE_HDIMDIFF64': False, 'FLASH_ATTENTION_DISABLE_HDIMDIFF192': False}}
3
-
4
- def show():
5
- from pprint import pprint
6
- pprint(CONFIG)
7
-
 
 
 
 
 
 
 
 
build/torch-stable-abi29-cu126-aarch64-linux/flash_attn_interface.py DELETED
@@ -1,1127 +0,0 @@
1
- # Copyright (c) 2023, Tri Dao.
2
-
3
- from typing import Optional, Union, List, Tuple
4
-
5
- import torch
6
- import torch.nn as nn
7
-
8
- from ._ops import ops as flash_attn_3_cuda
9
- from ._ops import add_op_namespace_prefix
10
-
11
- def maybe_contiguous(x):
12
- return x.contiguous() if x is not None and x.stride(-1) != 1 else x
13
-
14
-
15
- def round_multiple(x, m):
16
- return (x + m - 1) // m * m
17
-
18
-
19
- def round_up_headdim(head_size: int) -> int:
20
- from .flash_attn_config import CONFIG
21
-
22
- if not CONFIG["build_flags"]["FLASHATTENTION_DISABLE_HDIM64"]:
23
- if head_size <= 64:
24
- return 64
25
- if not CONFIG["build_flags"]["FLASHATTENTION_DISABLE_HDIM96"]:
26
- if head_size <= 96:
27
- return 96
28
- if not CONFIG["build_flags"]["FLASHATTENTION_DISABLE_HDIM128"]:
29
- if head_size <= 128:
30
- return 128
31
- if not CONFIG["build_flags"]["FLASHATTENTION_DISABLE_HDIM192"]:
32
- if head_size <= 192:
33
- return 192
34
- if not CONFIG["build_flags"]["FLASHATTENTION_DISABLE_HDIM256"]:
35
- if head_size <= 256:
36
- return 256
37
- return 256
38
-
39
-
40
- @torch.library.custom_op(add_op_namespace_prefix("_flash_attn_forward"), mutates_args=(), device_types="cuda")
41
- def _flash_attn_forward(
42
- q: torch.Tensor,
43
- k: torch.Tensor,
44
- v: torch.Tensor,
45
- k_new: Optional[torch.Tensor] = None,
46
- v_new: Optional[torch.Tensor] = None,
47
- qv: Optional[torch.Tensor] = None,
48
- out_: Optional[torch.Tensor] = None,
49
- cu_seqlens_q: Optional[torch.Tensor] = None,
50
- cu_seqlens_k: Optional[torch.Tensor] = None,
51
- cu_seqlens_k_new: Optional[torch.Tensor] = None,
52
- seqused_q: Optional[torch.Tensor] = None,
53
- seqused_k: Optional[torch.Tensor] = None,
54
- max_seqlen_q: Optional[int] = None,
55
- max_seqlen_k: Optional[int] = None,
56
- page_table: Optional[torch.Tensor] = None,
57
- kv_batch_idx: Optional[torch.Tensor] = None,
58
- leftpad_k: Optional[torch.Tensor] = None,
59
- rotary_cos: Optional[torch.Tensor] = None,
60
- rotary_sin: Optional[torch.Tensor] = None,
61
- seqlens_rotary: Optional[torch.Tensor] = None,
62
- q_descale: Optional[torch.Tensor] = None,
63
- k_descale: Optional[torch.Tensor] = None,
64
- v_descale: Optional[torch.Tensor] = None,
65
- softmax_scale: Optional[float] = None,
66
- causal: bool = False,
67
- window_size_left: int = -1,
68
- window_size_right: int = -1,
69
- attention_chunk: int = 0,
70
- softcap: float = 0.0,
71
- rotary_interleaved: bool = True,
72
- scheduler_metadata: Optional[torch.Tensor] = None,
73
- num_splits: int = 1,
74
- pack_gqa: Optional[bool] = None,
75
- sm_margin: int = 0,
76
- ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
77
- q, k, k_new, v_new = [maybe_contiguous(x) for x in (q, k, k_new, v_new)]
78
- v = v.contiguous() if v.stride(-1) != 1 and v.stride(-3) != 1 else v
79
- cu_seqlens_q, cu_seqlens_k, cu_seqlens_k_new = [
80
- maybe_contiguous(x) for x in (cu_seqlens_q, cu_seqlens_k, cu_seqlens_k_new)
81
- ]
82
- seqused_q, seqused_k = [maybe_contiguous(x) for x in (seqused_q, seqused_k)]
83
- page_table, kv_batch_idx, leftpad_k = [
84
- maybe_contiguous(x) for x in (page_table, kv_batch_idx, leftpad_k)
85
- ]
86
- rotary_cos, rotary_sin = [maybe_contiguous(x) for x in (rotary_cos, rotary_sin)]
87
- seqlens_rotary = maybe_contiguous(seqlens_rotary)
88
- out, softmax_lse, out_accum, softmax_lse_accum = flash_attn_3_cuda.fwd(
89
- q,
90
- k,
91
- v,
92
- k_new,
93
- v_new,
94
- qv,
95
- out_,
96
- cu_seqlens_q,
97
- cu_seqlens_k,
98
- cu_seqlens_k_new,
99
- seqused_q,
100
- seqused_k,
101
- max_seqlen_q,
102
- max_seqlen_k,
103
- page_table,
104
- kv_batch_idx,
105
- leftpad_k,
106
- rotary_cos,
107
- rotary_sin,
108
- seqlens_rotary,
109
- q_descale,
110
- k_descale,
111
- v_descale,
112
- softmax_scale,
113
- causal,
114
- window_size_left,
115
- window_size_right,
116
- attention_chunk,
117
- softcap,
118
- rotary_interleaved,
119
- scheduler_metadata,
120
- num_splits,
121
- pack_gqa,
122
- sm_margin,
123
- )
124
-
125
- if out_accum is None:
126
- out_accum = torch.tensor([], device=out.device)
127
-
128
- if softmax_lse_accum is None:
129
- softmax_lse_accum = torch.tensor([], device=out.device)
130
-
131
- return out, softmax_lse, out_accum, softmax_lse_accum
132
-
133
-
134
- @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_forward"))
135
- def _flash_attn_forward_fake(
136
- q: torch.Tensor,
137
- k: torch.Tensor,
138
- v: torch.Tensor,
139
- k_new: Optional[torch.Tensor] = None,
140
- v_new: Optional[torch.Tensor] = None,
141
- qv: Optional[torch.Tensor] = None,
142
- out_: Optional[torch.Tensor] = None,
143
- cu_seqlens_q: Optional[torch.Tensor] = None,
144
- cu_seqlens_k: Optional[torch.Tensor] = None,
145
- cu_seqlens_k_new: Optional[torch.Tensor] = None,
146
- seqused_q: Optional[torch.Tensor] = None,
147
- seqused_k: Optional[torch.Tensor] = None,
148
- max_seqlen_q: Optional[int] = None,
149
- max_seqlen_k: Optional[int] = None,
150
- page_table: Optional[torch.Tensor] = None,
151
- kv_batch_idx: Optional[torch.Tensor] = None,
152
- leftpad_k: Optional[torch.Tensor] = None,
153
- rotary_cos: Optional[torch.Tensor] = None,
154
- rotary_sin: Optional[torch.Tensor] = None,
155
- seqlens_rotary: Optional[torch.Tensor] = None,
156
- q_descale: Optional[torch.Tensor] = None,
157
- k_descale: Optional[torch.Tensor] = None,
158
- v_descale: Optional[torch.Tensor] = None,
159
- softmax_scale: Optional[float] = None,
160
- causal: bool = False,
161
- window_size_left: int = -1,
162
- window_size_right: int = -1,
163
- attention_chunk: int = 0,
164
- softcap: float = 0.0,
165
- rotary_interleaved: bool = True,
166
- scheduler_metadata: Optional[torch.Tensor] = None,
167
- num_splits: int = 1,
168
- pack_gqa: Optional[bool] = None,
169
- sm_margin: int = 0,
170
- ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
171
- """
172
- Symbolic fake implementation of flash attention forward.
173
- Returns tensors with the correct shapes and dtypes without actual computation.
174
- """
175
-
176
- # Determine if we're in varlen mode
177
- is_varlen_q = cu_seqlens_q is not None
178
-
179
- # Get dimensions from query tensor
180
- if is_varlen_q:
181
- # varlen mode: q is (total_q, num_heads, head_size)
182
- total_q, num_heads, head_size = q.shape
183
- batch_size = cu_seqlens_q.shape[0] - 1
184
-
185
- if max_seqlen_q is None:
186
- raise ValueError("max_seqlen_q must be provided if cu_seqlens_q is provided")
187
- seqlen_q = max_seqlen_q
188
- else:
189
- # batch mode: q is (batch_size, seqlen_q, num_heads, head_size)
190
- batch_size, seqlen_q, num_heads, head_size = q.shape
191
- total_q = batch_size * q.shape[1]
192
- # Get value head dimension
193
- head_size_v = v.shape[-1]
194
-
195
- # Determine output dtype (FP8 inputs produce BF16 outputs)
196
- q_type = q.dtype
197
- if q_type == torch.float8_e4m3fn:
198
- out_dtype = torch.bfloat16
199
- else:
200
- out_dtype = q_type
201
-
202
- # Create output tensor
203
- if out_ is not None:
204
- # If out_ is provided, _flash_attn_forward becomes non-functional
205
- raise TypeError("Tracing (torch.compile/torch.export) with pre-allocated output tensor is not supported.")
206
-
207
- if is_varlen_q:
208
- out = torch.empty((total_q, num_heads, head_size_v), dtype=out_dtype, device=q.device)
209
- else:
210
- out = torch.empty((batch_size, seqlen_q, num_heads, head_size_v), dtype=out_dtype, device=q.device)
211
-
212
- # Create softmax_lse tensor
213
- if is_varlen_q:
214
- softmax_lse = torch.empty((num_heads, total_q), dtype=torch.float32, device=q.device)
215
- else:
216
- softmax_lse = torch.empty((batch_size, num_heads, seqlen_q), dtype=torch.float32, device=q.device)
217
-
218
- # TODO(guilhermeleobas): Implement "get_num_splits"
219
- # There's an heuristic to compute num_splits when "num_splits <= 0"
220
- # assert that num_splits is > 0 for now
221
- if num_splits <= 0:
222
- raise ValueError(f"tracing (torch.compile/torch.export) with num_splits <= 0 not supported. Got {num_splits=}")
223
-
224
- if num_splits > 1:
225
- if is_varlen_q:
226
- out_accum = torch.empty((num_splits, num_heads, total_q, head_size_v), dtype=torch.float32, device=q.device)
227
- softmax_lse_accum = torch.empty((num_splits, num_heads, total_q), dtype=torch.float32, device=q.device)
228
- else:
229
- out_accum = torch.empty((num_splits, batch_size, num_heads, seqlen_q, head_size_v), dtype=torch.float32, device=q.device)
230
- softmax_lse_accum = torch.empty((num_splits, batch_size, num_heads, seqlen_q), dtype=torch.float32, device=q.device)
231
- else:
232
- # Tensors are not set when num_splits < 1
233
- out_accum = torch.tensor([], device=out.device)
234
- softmax_lse_accum = torch.tensor([], device=out.device)
235
-
236
- return out, softmax_lse, out_accum, softmax_lse_accum
237
-
238
-
239
- @torch.library.custom_op(add_op_namespace_prefix("_flash_attn_backward"), mutates_args=("dq", "dk", "dv"), device_types="cuda")
240
- def _flash_attn_backward(
241
- dout: torch.Tensor,
242
- q: torch.Tensor,
243
- k: torch.Tensor,
244
- v: torch.Tensor,
245
- out: torch.Tensor,
246
- softmax_lse: torch.Tensor,
247
- cu_seqlens_q: Optional[torch.Tensor] = None,
248
- cu_seqlens_k: Optional[torch.Tensor] = None,
249
- sequed_q: Optional[torch.Tensor] = None,
250
- sequed_k: Optional[torch.Tensor] = None,
251
- max_seqlen_q: Optional[int] = None,
252
- max_seqlen_k: Optional[int] = None,
253
- dq: Optional[torch.Tensor] = None,
254
- dk: Optional[torch.Tensor] = None,
255
- dv: Optional[torch.Tensor] = None,
256
- softmax_scale: Optional[float] = None,
257
- is_causal: bool = False,
258
- window_size_left: int = -1,
259
- window_size_right: int = -1,
260
- softcap: float = 0.0,
261
- deterministic: bool = False,
262
- sm_margin: int = 0,
263
- ) -> torch.Tensor:
264
- # dq, dk, dv are allocated by us so they should already be contiguous
265
- dout, q, k, v, out = [maybe_contiguous(x) for x in (dout, q, k, v, out)]
266
- softmax_d, *rest = flash_attn_3_cuda.bwd(
267
- dout,
268
- q,
269
- k,
270
- v,
271
- out,
272
- softmax_lse,
273
- dq,
274
- dk,
275
- dv,
276
- cu_seqlens_q,
277
- cu_seqlens_k,
278
- sequed_q,
279
- sequed_k,
280
- max_seqlen_q,
281
- max_seqlen_k,
282
- softmax_scale,
283
- is_causal,
284
- window_size_left,
285
- window_size_right,
286
- softcap,
287
- deterministic,
288
- sm_margin,
289
- )
290
- return softmax_d
291
-
292
-
293
- @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_backward"))
294
- def _flash_attn_backward_fake(
295
- dout: torch.Tensor,
296
- q: torch.Tensor,
297
- k: torch.Tensor,
298
- v: torch.Tensor,
299
- out: torch.Tensor,
300
- softmax_lse: torch.Tensor,
301
- cu_seqlens_q: Optional[torch.Tensor] = None,
302
- cu_seqlens_k: Optional[torch.Tensor] = None,
303
- sequed_q: Optional[torch.Tensor] = None,
304
- sequed_k: Optional[torch.Tensor] = None,
305
- max_seqlen_q: Optional[int] = None,
306
- max_seqlen_k: Optional[int] = None,
307
- dq: Optional[torch.Tensor] = None,
308
- dk: Optional[torch.Tensor] = None,
309
- dv: Optional[torch.Tensor] = None,
310
- softmax_scale: Optional[float] = None,
311
- is_causal: bool = False,
312
- window_size_left: int = -1,
313
- window_size_right: int = -1,
314
- softcap: float = 0.0,
315
- deterministic: bool = False,
316
- sm_margin: int = 0,
317
- ) -> torch.Tensor:
318
-
319
- is_varlen_q = cu_seqlens_q is not None
320
- is_varlen_k = cu_seqlens_q is not None
321
- is_varlen = is_varlen_q or is_varlen_k or sequed_q is not None or sequed_k is not None
322
-
323
- if not is_varlen_q:
324
- batch_size = q.size(0)
325
- seqlen_q = q.size(1)
326
- seqlen_k = k.size(1)
327
- total_q = batch_size * q.size(1)
328
- else:
329
- batch_size = cu_seqlens_q.size(0) - 1
330
- total_q = q.size(0)
331
- seqlen_q = max_seqlen_q
332
- seqlen_k = max_seqlen_k
333
-
334
- if window_size_left >= seqlen_k - 1:
335
- window_size_left = -1
336
-
337
- if window_size_right >= seqlen_q - 1:
338
- window_size_right = -1
339
-
340
- if is_causal:
341
- window_size_right = 0
342
-
343
- is_causal = window_size_left < 0 and window_size_right == 0
344
-
345
- head_size = q.size(-1)
346
- head_size_v = v.size(-1)
347
- head_size_rounded = round_up_headdim(max(head_size, head_size_v))
348
-
349
- # Hopper gpus uses cuda compute capabilities 9.0
350
- cap = torch.cuda.get_device_capability(q.device)
351
- arch = cap[0] * 10 + cap[1]
352
-
353
- is_local = (window_size_left >= 0 or window_size_right >= 0) and not is_causal
354
-
355
- if head_size_rounded <= 64:
356
- kBlockM_sm90 = 96 if (is_causal and softcap > 0.0) else 128
357
- elif head_size_rounded <= 96:
358
- kBlockM_sm90 = 64
359
- elif head_size_rounded <= 128:
360
- kBlockM_sm90 = 64 if (is_causal or is_local or softcap > 0.0) else 80
361
- else:
362
- kBlockM_sm90 = 64
363
-
364
- kBlockM_sm80 = 128 if head_size_rounded <= 64 else 64
365
- kBlockM_sm86 = 64 if head_size_rounded <= 192 else 32
366
-
367
- if arch >= 90:
368
- kBlockM = kBlockM_sm90
369
- elif arch == 86 or arch == 89:
370
- kBlockM = kBlockM_sm86
371
- else:
372
- kBlockM = kBlockM_sm80
373
-
374
- num_heads = q.shape[-2]
375
- seqlen_q_rounded = round_multiple(seqlen_q, kBlockM)
376
-
377
- total_q_padded_rounded = round_multiple(total_q + batch_size * kBlockM, kBlockM)
378
-
379
- dq = torch.empty_like(q) if dq is None else dq
380
- dk = torch.empty_like(k) if dk is None else dk
381
- dv = torch.empty_like(v) if dv is None else dv
382
-
383
- if not is_varlen:
384
- softmax_d = torch.empty((batch_size, num_heads, seqlen_q_rounded), dtype=torch.float32, device=q.device)
385
- else:
386
- softmax_d = torch.empty((num_heads, total_q_padded_rounded), dtype=torch.float32, device=q.device)
387
-
388
- return softmax_d
389
-
390
-
391
- def setup_context(ctx, inputs, output):
392
- q, k, v = inputs[:3]
393
- out, softmax_lse, _, _ = output
394
- ctx.save_for_backward(q, k, v, out, softmax_lse)
395
- ctx.softmax_scale = inputs[-11]
396
- ctx.causal = inputs[-10]
397
- ctx.window_size = [inputs[-9], inputs[-8]]
398
- ctx.attention_chunk = inputs[-7]
399
- ctx.softcap = inputs[-6]
400
- ctx.sm_margin = inputs[-1]
401
-
402
-
403
- def _backward(ctx, dout, *grads):
404
- q, k, v, out, softmax_lse = ctx.saved_tensors
405
- dq, dk, dv = torch.empty_like(q), torch.empty_like(k), torch.empty_like(v)
406
- _flash_attn_backward(
407
- dout,
408
- q,
409
- k,
410
- v,
411
- out,
412
- softmax_lse,
413
- None, None, # cu_seqlens_q, cu_seqlens_k,
414
- None, None, # sequed_q, sequed_k,
415
- None, None, # max_seqlen_q, max_seqlen_k,
416
- dq,
417
- dk,
418
- dv,
419
- ctx.softmax_scale,
420
- ctx.causal,
421
- ctx.window_size[0],
422
- ctx.window_size[1],
423
- ctx.softcap,
424
- False, # deterministic
425
- ctx.sm_margin,
426
- )
427
- return dq, dk, dv, *((None,) * 21)
428
-
429
-
430
- _flash_attn_forward.register_autograd(_backward, setup_context=setup_context)
431
-
432
-
433
-
434
- class FlashAttnQKVPackedFunc(torch.autograd.Function):
435
- @staticmethod
436
- def forward(
437
- ctx,
438
- qkv,
439
- softmax_scale,
440
- causal,
441
- q_descale=None, k_descale=None, v_descale=None,
442
- window_size=(-1, -1),
443
- attention_chunk=0,
444
- softcap=0.0,
445
- deterministic=False,
446
- num_heads_q=None,
447
- sm_margin=0,
448
- return_softmax=False,
449
- ):
450
- if softmax_scale is None:
451
- softmax_scale = qkv.shape[-1] ** (-0.5)
452
- if qkv.dim() == 5:
453
- assert qkv.shape[-3] == 3
454
- q, k, v = qkv.unbind(dim=-3)
455
- else:
456
- assert qkv.dim() == 4
457
- assert num_heads_q is not None
458
- num_heads_k = (qkv.shape[2] - num_heads_q) // 2
459
- assert num_heads_k * 2 + num_heads_q == qkv.shape[2]
460
- q, k, v = qkv.split([num_heads_q, num_heads_k, num_heads_k], dim=-2)
461
- out, softmax_lse, *rest = _flash_attn_forward(
462
- q,
463
- k,
464
- v,
465
- None, None, # k_new, v_new
466
- None, # qv
467
- None, # out
468
- None, None, None, # cu_seqlens_q/k/k_new
469
- None, None, # seqused_q/k
470
- None, None, # max_seqlen_q/k
471
- None, None, None, # page_table, kv_batch_idx, leftpad_k,
472
- None, None, None, # rotary_cos/sin, seqlens_rotary
473
- q_descale, k_descale, v_descale,
474
- softmax_scale,
475
- causal=causal,
476
- window_size_left=window_size[0],
477
- window_size_right=window_size[1],
478
- attention_chunk=attention_chunk,
479
- softcap=softcap,
480
- sm_margin=sm_margin,
481
- )
482
- # ctx.save_for_backward(q, k, v, out_padded, softmax_lse)
483
- ctx.save_for_backward(q, k, v, out, softmax_lse)
484
- ctx.softmax_scale = softmax_scale
485
- ctx.causal = causal
486
- ctx.window_size = window_size
487
- ctx.attention_chunk = attention_chunk
488
- ctx.softcap = softcap
489
- ctx.deterministic = deterministic
490
- ctx.ndim = qkv.dim()
491
- ctx.sm_margin = sm_margin
492
- return (out, softmax_lse) if return_softmax else out
493
-
494
- @staticmethod
495
- def backward(ctx, dout, *args):
496
- q, k, v, out, softmax_lse = ctx.saved_tensors
497
- assert ctx.attention_chunk == 0, "FA3 backward does not support attention_chunk"
498
- if ctx.ndim == 5:
499
- qkv_shape = q.shape[:-2] + (3, *q.shape[-2:])
500
- dqkv = torch.empty(qkv_shape, dtype=q.dtype, device=q.device)
501
- dq, dk, dv = dqkv.unbind(dim=-3)
502
- else:
503
- num_heads_q = q.shape[2]
504
- num_heads_k = k.shape[2]
505
- qkv_shape = q.shape[:-2] + (num_heads_q + num_heads_k * 2, *q.shape[-1:])
506
- dqkv = torch.empty(qkv_shape, dtype=q.dtype, device=q.device)
507
- dq, dk, dv = dqkv.split([num_heads_q, num_heads_k, num_heads_k], dim=-2)
508
- _flash_attn_backward(
509
- dout,
510
- q,
511
- k,
512
- v,
513
- out,
514
- softmax_lse,
515
- None, None, # cu_seqlens_q, cu_seqlens_k,
516
- None, None, # sequed_q, sequed_k,
517
- None, None, # max_seqlen_q, max_seqlen_k,
518
- dq,
519
- dk,
520
- dv,
521
- ctx.softmax_scale,
522
- ctx.causal,
523
- ctx.window_size[0],
524
- ctx.window_size[1],
525
- ctx.softcap,
526
- ctx.deterministic,
527
- ctx.sm_margin,
528
- )
529
- dqkv = dqkv[..., : dout.shape[-1]] # We could have padded the head dimension
530
- return dqkv, None, None, None, None, None, None, None, None, None, None, None, None
531
-
532
-
533
- class FlashAttnFunc(torch.autograd.Function):
534
-
535
- @staticmethod
536
- def forward(
537
- ctx,
538
- q,
539
- k,
540
- v,
541
- softmax_scale,
542
- causal,
543
- qv=None,
544
- q_descale=None, k_descale=None, v_descale=None,
545
- window_size=(-1, -1),
546
- attention_chunk=0,
547
- softcap=0.0,
548
- num_splits=1,
549
- pack_gqa=None,
550
- deterministic=False,
551
- sm_margin=0,
552
- return_softmax=False,
553
- ):
554
- if softmax_scale is None:
555
- softmax_scale = (q.shape[-1] + (qv.shape[-1] if qv is not None else 0)) ** (-0.5)
556
- # out, q, k, v, out_padded, softmax_lse = _flash_attn_forward(
557
- out, softmax_lse, *rest = _flash_attn_forward(
558
- q,
559
- k,
560
- v,
561
- None, None, # k_new, v_new
562
- qv, # qv
563
- None, # out
564
- None, None, None, # cu_seqlens_q/k/k_new
565
- None, None, # seqused_q/k
566
- None, None, # max_seqlen_q/k
567
- None, None, None, # page_table, kv_batch_idx, leftpad_k,
568
- None, None, None, # rotary_cos/sin, seqlens_rotary
569
- q_descale, k_descale, v_descale,
570
- softmax_scale,
571
- causal=causal,
572
- window_size_left=window_size[0],
573
- window_size_right=window_size[1],
574
- attention_chunk=attention_chunk,
575
- softcap=softcap,
576
- num_splits=num_splits,
577
- pack_gqa=pack_gqa,
578
- sm_margin=sm_margin,
579
- )
580
- # ctx.save_for_backward(q, k, v, out_padded, softmax_lse)
581
- ctx.save_for_backward(q, k, v, out, softmax_lse)
582
- ctx.softmax_scale = softmax_scale
583
- ctx.causal = causal
584
- ctx.window_size = window_size
585
- ctx.attention_chunk = attention_chunk
586
- ctx.softcap = softcap
587
- ctx.deterministic = deterministic
588
- ctx.sm_margin = sm_margin
589
- return (out, softmax_lse) if return_softmax else out
590
-
591
- @staticmethod
592
- def backward(ctx, dout, *args):
593
- q, k, v, out, softmax_lse = ctx.saved_tensors
594
- assert ctx.attention_chunk == 0, "FA3 backward does not support attention_chunk"
595
- dq, dk, dv = torch.empty_like(q), torch.empty_like(k), torch.empty_like(v)
596
- _flash_attn_backward(
597
- dout,
598
- q,
599
- k,
600
- v,
601
- out,
602
- softmax_lse,
603
- None, None, # cu_seqlens_q, cu_seqlens_k,
604
- None, None, # sequed_q, sequed_k,
605
- None, None, # max_seqlen_q, max_seqlen_k,
606
- dq,
607
- dk,
608
- dv,
609
- ctx.softmax_scale,
610
- ctx.causal,
611
- ctx.window_size[0],
612
- ctx.window_size[1],
613
- ctx.softcap,
614
- ctx.deterministic,
615
- ctx.sm_margin,
616
- )
617
- dq = dq[..., : q.shape[-1]] # We could have padded the head dimension
618
- dk = dk[..., : k.shape[-1]]
619
- dv = dv[..., : v.shape[-1]]
620
- return dq, dk, dv, None, None, None, None, None, None, None, None, None, None, None, None, None, None
621
-
622
-
623
- class FlashAttnVarlenFunc(torch.autograd.Function):
624
-
625
- @staticmethod
626
- def forward(
627
- ctx,
628
- q,
629
- k,
630
- v,
631
- cu_seqlens_q,
632
- cu_seqlens_k,
633
- seqused_q,
634
- seqused_k,
635
- max_seqlen_q,
636
- max_seqlen_k,
637
- softmax_scale,
638
- causal,
639
- qv=None,
640
- q_descale=None, k_descale=None, v_descale=None,
641
- window_size=(-1, -1),
642
- attention_chunk=0,
643
- softcap=0.0,
644
- num_splits=1,
645
- pack_gqa=None,
646
- deterministic=False,
647
- sm_margin=0,
648
- return_softmax=False,
649
- ):
650
- if softmax_scale is None:
651
- softmax_scale = (q.shape[-1] + (qv.shape[-1] if qv is not None else 0)) ** (-0.5)
652
- # out, q, k, v, out_padded, softmax_lse = _flash_attn_varlen_forward(
653
- out, softmax_lse, *rest = _flash_attn_forward(
654
- q,
655
- k,
656
- v,
657
- None, None, # k_new, v_new
658
- qv, # qv
659
- None, # out
660
- cu_seqlens_q,
661
- cu_seqlens_k,
662
- None, # cu_seqlens_k_new
663
- seqused_q,
664
- seqused_k,
665
- max_seqlen_q,
666
- max_seqlen_k,
667
- None, None, None, # page_table, kv_batch_idx, leftpad_k,
668
- None, None, None, # rotary_cos/sin, seqlens_rotary
669
- q_descale, k_descale, v_descale,
670
- softmax_scale,
671
- causal=causal,
672
- window_size_left=window_size[0],
673
- window_size_right=window_size[1],
674
- attention_chunk=attention_chunk,
675
- softcap=softcap,
676
- num_splits=num_splits,
677
- pack_gqa=pack_gqa,
678
- sm_margin=sm_margin,
679
- )
680
- # ctx.save_for_backward(q, k, v, out_padded, softmax_lse, cu_seqlens_q, cu_seqlens_k, seqused_q, seqused_k)
681
- ctx.save_for_backward(q, k, v, out, softmax_lse, cu_seqlens_q, cu_seqlens_k, seqused_q, seqused_k)
682
- ctx.max_seqlen_q = max_seqlen_q
683
- ctx.max_seqlen_k = max_seqlen_k
684
- ctx.softmax_scale = softmax_scale
685
- ctx.causal = causal
686
- ctx.window_size = window_size
687
- ctx.attention_chunk = attention_chunk
688
- ctx.softcap = softcap
689
- ctx.deterministic = deterministic
690
- ctx.sm_margin = sm_margin
691
- return (out, softmax_lse) if return_softmax else out
692
-
693
- @staticmethod
694
- def backward(ctx, dout, *args):
695
- q, k, v, out, softmax_lse, cu_seqlens_q, cu_seqlens_k, seqused_q, seqused_k = ctx.saved_tensors
696
- assert ctx.attention_chunk == 0, "FA3 backward does not support attention_chunk"
697
- dq, dk, dv = torch.empty_like(q), torch.empty_like(k), torch.empty_like(v)
698
- _flash_attn_backward(
699
- dout,
700
- q,
701
- k,
702
- v,
703
- out,
704
- softmax_lse,
705
- cu_seqlens_q,
706
- cu_seqlens_k,
707
- seqused_q,
708
- seqused_k,
709
- ctx.max_seqlen_q,
710
- ctx.max_seqlen_k,
711
- dq,
712
- dk,
713
- dv,
714
- ctx.softmax_scale,
715
- ctx.causal,
716
- ctx.window_size[0],
717
- ctx.window_size[1],
718
- ctx.softcap,
719
- ctx.deterministic,
720
- ctx.sm_margin,
721
- )
722
- dq = dq[..., : q.shape[-1]] # We could have padded the head dimension
723
- dk = dk[..., : k.shape[-1]]
724
- dv = dv[..., : v.shape[-1]]
725
- return dq, dk, dv, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None
726
-
727
-
728
- def flash_attn_qkvpacked_func(
729
- qkv,
730
- softmax_scale=None,
731
- causal=False,
732
- q_descale=None, k_descale=None, v_descale=None,
733
- window_size=(-1, -1),
734
- attention_chunk=0,
735
- softcap=0.0,
736
- deterministic=False,
737
- num_heads_q=None,
738
- sm_margin=0,
739
- return_attn_probs=False,
740
- ):
741
- """dropout_p should be set to 0.0 during evaluation
742
- If Q, K, V are already stacked into 1 tensor, this function will be faster than
743
- calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
744
- of the gradients of Q, K, V.
745
- For multi-query and grouped-query attention (MQA/GQA), please see
746
- flash_attn_kvpacked_func and flash_attn_func.
747
-
748
- If window_size != (-1, -1), implements sliding window local attention. Query at position i
749
- will only attend to keys between [i - window_size[0], i + window_size[1]] inclusive.
750
-
751
- Arguments:
752
- qkv: (batch_size, seqlen, 3, nheads, headdim)
753
- dropout_p: float. Dropout probability.
754
- softmax_scale: float. The scaling of QK^T before applying softmax.
755
- Default to 1 / sqrt(headdim).
756
- causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
757
- window_size: (left, right). If not (-1, -1), implements sliding window local attention.
758
- softcap: float. Anything > 0 activates softcapping attention.
759
- alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of (-alibi_slope * |i - j|) is added to
760
- the attention score of query i and key j.
761
- deterministic: bool. Whether to use the deterministic implementation of the backward pass,
762
- which is slightly slower and uses more memory. The forward pass is always deterministic.
763
- return_attn_probs: bool. Whether to return the attention probabilities. This option is for
764
- testing only. The returned probabilities are not guaranteed to be correct
765
- (they might not have the right scaling).
766
- Return:
767
- out: (batch_size, seqlen, nheads, headdim).
768
- softmax_lse [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen). The
769
- logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
770
- normalization factor).
771
- S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
772
- The output of softmax (possibly with different scaling). It also encodes the dropout
773
- pattern (negative means that location was dropped, nonnegative means it was kept).
774
- """
775
- return FlashAttnQKVPackedFunc.apply(
776
- qkv,
777
- softmax_scale,
778
- causal,
779
- q_descale, k_descale, v_descale,
780
- window_size,
781
- attention_chunk,
782
- softcap,
783
- deterministic,
784
- num_heads_q,
785
- sm_margin,
786
- return_attn_probs,
787
- )
788
-
789
-
790
- def flash_attn_func(
791
- q,
792
- k,
793
- v,
794
- softmax_scale=None,
795
- causal=False,
796
- qv=None,
797
- q_descale=None, k_descale=None, v_descale=None,
798
- window_size=(-1, -1),
799
- attention_chunk=0,
800
- softcap=0.0,
801
- num_splits=1,
802
- pack_gqa=None,
803
- deterministic=False,
804
- sm_margin=0,
805
- return_attn_probs=False,
806
- ):
807
- """dropout_p should be set to 0.0 during evaluation
808
- Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
809
- than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
810
- For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
811
- 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
812
-
813
- If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
814
- For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
815
- 1 1 1 1 0
816
- 1 1 1 1 1
817
- If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
818
- 0 0
819
- 0 0
820
- 0 0
821
- 1 0
822
- 1 1
823
- If the row of the mask is all zero, the output will be zero.
824
-
825
- If window_size != (-1, -1), implements sliding window local attention. Query at position i
826
- will only attend to keys between
827
- [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
828
-
829
- Arguments:
830
- q: (batch_size, seqlen, nheads, headdim)
831
- k: (batch_size, seqlen, nheads_k, headdim)
832
- v: (batch_size, seqlen, nheads_k, headdim)
833
- dropout_p: float. Dropout probability.
834
- softmax_scale: float. The scaling of QK^T before applying softmax.
835
- Default to 1 / sqrt(headdim).
836
- causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
837
- window_size: (left, right). If not (-1, -1), implements sliding window local attention.
838
- alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
839
- (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
840
- is added to the attention score of query i and key j.
841
- deterministic: bool. Whether to use the deterministic implementation of the backward pass,
842
- which is slightly slower and uses more memory. The forward pass is always deterministic.
843
- return_attn_probs: bool. Whether to return the attention probabilities. This option is for
844
- testing only. The returned probabilities are not guaranteed to be correct
845
- (they might not have the right scaling).
846
- Return:
847
- out: (batch_size, seqlen, nheads, headdim).
848
- softmax_lse [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen). The
849
- logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
850
- normalization factor).
851
- """
852
- return FlashAttnFunc.apply(
853
- q,
854
- k,
855
- v,
856
- softmax_scale,
857
- causal,
858
- qv,
859
- q_descale, k_descale, v_descale,
860
- window_size,
861
- attention_chunk,
862
- softcap,
863
- num_splits,
864
- pack_gqa,
865
- deterministic,
866
- sm_margin,
867
- return_attn_probs,
868
- )
869
-
870
-
871
- def flash_attn_varlen_func(
872
- q,
873
- k,
874
- v,
875
- cu_seqlens_q,
876
- cu_seqlens_k,
877
- max_seqlen_q,
878
- max_seqlen_k,
879
- seqused_q=None,
880
- seqused_k=None,
881
- softmax_scale=None,
882
- causal=False,
883
- qv=None,
884
- q_descale=None, k_descale=None, v_descale=None,
885
- window_size=(-1, -1),
886
- attention_chunk=0,
887
- softcap=0.0,
888
- num_splits=1,
889
- pack_gqa=None,
890
- deterministic=False,
891
- sm_margin=0,
892
- return_attn_probs=False,
893
- ):
894
- return FlashAttnVarlenFunc.apply(
895
- q,
896
- k,
897
- v,
898
- cu_seqlens_q,
899
- cu_seqlens_k,
900
- seqused_q,
901
- seqused_k,
902
- max_seqlen_q,
903
- max_seqlen_k,
904
- softmax_scale,
905
- causal,
906
- qv,
907
- q_descale, k_descale, v_descale,
908
- window_size,
909
- attention_chunk,
910
- softcap,
911
- num_splits,
912
- pack_gqa,
913
- deterministic,
914
- sm_margin,
915
- return_attn_probs,
916
- )
917
-
918
-
919
- def flash_attn_combine(out_partial, lse_partial, out=None, out_dtype=None):
920
- return flash_attn_3_cuda.fwd_combine(out_partial, lse_partial, out, out_dtype)
921
-
922
-
923
- def flash_attn_with_kvcache(
924
- q,
925
- k_cache,
926
- v_cache,
927
- k=None,
928
- v=None,
929
- qv=None,
930
- rotary_cos=None,
931
- rotary_sin=None,
932
- cache_seqlens: Optional[Union[(int, torch.Tensor)]] = None,
933
- cache_batch_idx: Optional[torch.Tensor] = None,
934
- cache_leftpad: Optional[torch.Tensor] = None,
935
- page_table: Optional[torch.Tensor] = None,
936
- cu_seqlens_q: Optional[torch.Tensor] = None,
937
- cu_seqlens_k_new: Optional[torch.Tensor] = None,
938
- max_seqlen_q: Optional[int] = None,
939
- rotary_seqlens: Optional[torch.Tensor] = None,
940
- q_descale: Optional[torch.Tensor] = None,
941
- k_descale: Optional[torch.Tensor] = None,
942
- v_descale: Optional[torch.Tensor] = None,
943
- softmax_scale=None,
944
- causal=False,
945
- window_size=(-1, -1), # -1 means infinite context window
946
- attention_chunk=0,
947
- softcap=0.0, # 0.0 means deactivated
948
- rotary_interleaved=True,
949
- scheduler_metadata=None,
950
- num_splits=0, # Can be tuned for speed
951
- pack_gqa=None, # Can be tuned for speed
952
- sm_margin=0, # Can be tuned if some SMs are used for communication
953
- return_softmax_lse=False,
954
- ):
955
- """
956
- If k and v are not None, k_cache and v_cache will be updated *inplace* with the new values from
957
- k and v. This is useful for incremental decoding: you can pass in the cached keys/values from
958
- the previous step, and update them with the new keys/values from the current step, and do
959
- attention with the updated cache, all in 1 kernel.
960
-
961
- If you pass in k / v, you must make sure that the cache is large enough to hold the new values.
962
- For example, the KV cache could be pre-allocated with the max sequence length, and you can use
963
- cache_seqlens to keep track of the current sequence lengths of each sequence in the batch.
964
-
965
- Also apply rotary embedding if rotary_cos and rotary_sin are passed in. The key @k will be
966
- rotated by rotary_cos and rotary_sin at indices cache_seqlens, cache_seqlens + 1, etc.
967
- If causal or local (i.e., window_size != (-1, -1)), the query @q will be rotated by rotary_cos
968
- and rotary_sin at indices cache_seqlens, cache_seqlens + 1, etc.
969
- If not causal and not local, the query @q will be rotated by rotary_cos and rotary_sin at
970
- indices cache_seqlens only (i.e. we consider all tokens in @q to be at position cache_seqlens).
971
-
972
- See tests/test_flash_attn.py::test_flash_attn_kvcache for examples of how to use this function.
973
-
974
- Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
975
- than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
976
- For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
977
- 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
978
-
979
- If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
980
- For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
981
- 1 1 1 1 0
982
- 1 1 1 1 1
983
- If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
984
- 0 0
985
- 0 0
986
- 0 0
987
- 1 0
988
- 1 1
989
- If the row of the mask is all zero, the output will be zero.
990
-
991
- If window_size != (-1, -1), implements sliding window local attention. Query at position i
992
- will only attend to keys between
993
- [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
994
-
995
- Note: Does not support backward pass.
996
-
997
- Arguments:
998
- q: (batch_size, seqlen, nheads, headdim)
999
- k_cache: (batch_size_cache, seqlen_cache, nheads_k, headdim) if there's no page_table,
1000
- or (num_blocks, page_block_size, nheads_k, headdim) if there's a page_table (i.e. paged KV cache)
1001
- page_block_size can be arbitrary (e.g, 1, 2, 3, 64, etc.).
1002
- v_cache: (batch_size_cache, seqlen_cache, nheads_k, headdim_v) if there's no page_table,
1003
- or (num_blocks, page_block_size, nheads_k, headdim_v) if there's a page_table (i.e. paged KV cache)
1004
- k [optional]: (batch_size, seqlen_new, nheads_k, headdim). If not None, we concatenate
1005
- k with k_cache, starting at the indices specified by cache_seqlens.
1006
- v [optional]: (batch_size, seqlen_new, nheads_k, headdim_v). Similar to k.
1007
- qv [optional]: (batch_size, seqlen, nheads, headdim_v)
1008
- rotary_cos [optional]: (seqlen_ro, rotary_dim / 2). If not None, we apply rotary embedding
1009
- to k and q. Only applicable if k and v are passed in. rotary_dim must be divisible by 16.
1010
- rotary_sin [optional]: (seqlen_ro, rotary_dim / 2). Similar to rotary_cos.
1011
- cache_seqlens: int, or (batch_size,), dtype torch.int32. The sequence lengths of the
1012
- KV cache.
1013
- cache_batch_idx: (batch_size,), dtype torch.int32. The indices used to index into the KV cache.
1014
- If None, we assume that the batch indices are [0, 1, 2, ..., batch_size - 1].
1015
- If the indices are not distinct, and k and v are provided, the values updated in the cache
1016
- might come from any of the duplicate indices.
1017
- cache_leftpad: (batch_size,), dtype torch.int32. The index that the KV cache starts. If None, assume 0.
1018
- page_table [optional]: (batch_size, max_num_blocks_per_seq), dtype torch.int32.
1019
- softmax_scale: float. The scaling of QK^T before applying softmax.
1020
- Default to 1 / sqrt(headdim).
1021
- causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1022
- window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1023
- softcap: float. Anything > 0 activates softcapping attention.
1024
- rotary_interleaved: bool. Only applicable if rotary_cos and rotary_sin are passed in.
1025
- If True, rotary embedding will combine dimensions 0 & 1, 2 & 3, etc. If False,
1026
- rotary embedding will combine dimensions 0 & rotary_dim / 2, 1 & rotary_dim / 2 + 1
1027
- (i.e. GPT-NeoX style).
1028
- num_splits: int. If > 1, split the key/value into this many chunks along the sequence.
1029
- If num_splits == 1, we don't split the key/value. If num_splits == 0, we use a heuristic
1030
- to automatically determine the number of splits.
1031
- Don't change this unless you know what you are doing.
1032
- return_softmax_lse: bool. Whether to return the logsumexp of the attention scores.
1033
-
1034
- Return:
1035
- out: (batch_size, seqlen, nheads, headdim).
1036
- softmax_lse [optional, if return_softmax_lse=True]: (batch_size, nheads, seqlen). The
1037
- logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1038
- normalization factor).
1039
- """
1040
- assert k_cache.stride(-1) == 1, "k_cache must have contiguous last dimension"
1041
- assert v_cache.stride(-1) == 1, "v_cache must have contiguous last dimension"
1042
- if softmax_scale is None:
1043
- softmax_scale = (q.shape[-1] + (qv.shape[-1] if qv is not None else 0)) ** (-0.5)
1044
- if cache_seqlens is not None and isinstance(cache_seqlens, int):
1045
- cache_seqlens = torch.full(
1046
- (q.shape[0],), cache_seqlens, dtype=torch.int32, device=k_cache.device
1047
- )
1048
- cache_seqlens = maybe_contiguous(cache_seqlens)
1049
- out, softmax_lse, *rest = _flash_attn_forward(
1050
- q,
1051
- k_cache,
1052
- v_cache,
1053
- k,
1054
- v,
1055
- qv,
1056
- None, # out
1057
- cu_seqlens_q,
1058
- None, # cu_seqlens_k
1059
- cu_seqlens_k_new,
1060
- None, # seqused_q
1061
- cache_seqlens,
1062
- max_seqlen_q,
1063
- None, # max_seqlen_k
1064
- page_table,
1065
- cache_batch_idx,
1066
- cache_leftpad,
1067
- rotary_cos,
1068
- rotary_sin,
1069
- rotary_seqlens,
1070
- q_descale, k_descale, v_descale,
1071
- softmax_scale,
1072
- causal=causal,
1073
- window_size_left=window_size[0],
1074
- window_size_right=window_size[1],
1075
- attention_chunk=attention_chunk,
1076
- softcap=softcap,
1077
- rotary_interleaved=rotary_interleaved,
1078
- scheduler_metadata=scheduler_metadata,
1079
- num_splits=num_splits,
1080
- pack_gqa=pack_gqa,
1081
- sm_margin=sm_margin,
1082
- )
1083
- # return (out, softmax_lse) if return_softmax_lse else out
1084
- return (out, softmax_lse, *rest) if return_softmax_lse else out
1085
-
1086
-
1087
- def get_scheduler_metadata(
1088
- batch_size, max_seqlen_q, max_seqlen_k, num_heads_q, num_heads_kv, headdim,
1089
- cache_seqlens: torch.Tensor,
1090
- qkv_dtype=torch.bfloat16,
1091
- headdim_v=None,
1092
- cu_seqlens_q: Optional[torch.Tensor] = None,
1093
- cu_seqlens_k_new: Optional[torch.Tensor] = None,
1094
- cache_leftpad: Optional[torch.Tensor] = None,
1095
- page_size: Optional[int] = None,
1096
- max_seqlen_k_new=0,
1097
- causal=False,
1098
- window_size=(-1, -1), # -1 means infinite context window
1099
- attention_chunk=0,
1100
- has_softcap=False,
1101
- num_splits=0, # Can be tuned for speed
1102
- pack_gqa=None, # Can be tuned for speed
1103
- sm_margin=0, # Can be tuned if some SMs are used for communication
1104
- ):
1105
- cache_seqlens = maybe_contiguous(cache_seqlens)
1106
- if headdim_v is None:
1107
- headdim_v = headdim
1108
- scheduler_metadata = flash_attn_3_cuda.get_scheduler_metadata(
1109
- batch_size, max_seqlen_q, max_seqlen_k, num_heads_q, num_heads_kv, headdim, headdim_v,
1110
- qkv_dtype,
1111
- cache_seqlens,
1112
- cu_seqlens_q,
1113
- None, # cu_seqlens_k
1114
- cu_seqlens_k_new,
1115
- None, # seqused_q
1116
- cache_leftpad,
1117
- page_size,
1118
- max_seqlen_k_new,
1119
- causal,
1120
- window_size[0], window_size[1],
1121
- attention_chunk,
1122
- has_softcap,
1123
- num_splits,
1124
- pack_gqa,
1125
- sm_margin,
1126
- )
1127
- return scheduler_metadata
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
build/torch-stable-abi29-cu126-aarch64-linux/metadata.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "name": "flash-attn3",
3
- "id": "_flash_attn3_cuda_addf474",
4
- "version": 1,
5
- "license": "BSD-3-Clause",
6
- "python-depends": [],
7
- "kernel-depends": [],
8
- "backend": {
9
- "type": "cuda",
10
- "archs": [
11
- "8.0",
12
- "9.0a"
13
- ]
14
- },
15
- "digest": {
16
- "algorithm": "sha256",
17
- "files": {
18
- "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
19
- "_flash_attn3_cuda_addf474.abi3.so": "R0iCttxlNUiJqaxkibP/ueRJt02xYQ8DLmuU2dV4iHQ=",
20
- "_ops.py": "4sqwjhtKEY9fRKr7Vk2ZAG4trj5QLXAyJX7jMFQAk/c=",
21
- "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
- "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
- }
24
- },
25
- "provenance": {
26
- "kernel-builder": {
27
- "version": "0.17.0-dev0",
28
- "commit": "081dcd473f8eca27226eef1f9c47c45b86c756b5",
29
- "dirty": false
30
- },
31
- "kernel": {
32
- "commit": "addf4741fafb55b4c101b15985dfaeea7c7c2f3a",
33
- "dirty": false
34
- }
35
- }
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
build/torch-stable-abi29-cu126-aarch64-linux/metadata.json.sigstore DELETED
@@ -1 +0,0 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHTDCCBtGgAwIBAgIUFBQ8huzgVtR52CJX6phG/E6nHvgwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MTAwOTE2WhcNMjYwODI3MTAxOTE2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBcU8vI9OOtlC/hxQRDBlwZ10vRuo++3zCTnqoO1SGhkNrB6epxd4Mfe4GGmLXEoURj3j441/LN2ZRw6fRB7L0KOCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUZM7nC7HZyIlbOoxm+bVCj2kQIk4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKGFkZGY0NzQxZmFmYjU1YjRjMTAxYjE1OTg1ZGZhZWVhN2M3YzJmM2EwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwNDUzNzg2NjYvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoEKx/58AAAQDAEcwRQIhAOp4d+F7iNZvDpJngoiQOM0suv22LIXLp1mVlSGIY6lbAiAmre0w4ULKlTNZuan4nSqe1PaXecb450AGxqMpoYcEljAKBggqhkjOPQQDAwNpADBmAjEAwuZD+4yG6PkeBn98U/YYnz80H1CfTX2MssoYzOQZrclCUhwObPECLrYyYdWPt0ilAjEA4lybmnjH4NSsVs9brDfY3ks8NBy9v1kyyvLlPktHrYfLg6Go3gRmyvdwlUU1bh1c"},"tlogEntries":[{"logIndex":"2615769314","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1787825357","inclusionPromise":{"signedEntryTimestamp":"MEQCICewmT+sdmoUVbv8bEqaCkhoGJCaB9toR70A/qiEkLZaAiA4KRnj7Eb6+5BJI6wp5WXetn8qPKAzVrBsmpOx8duORQ=="},"inclusionProof":{"logIndex":"2493865052","rootHash":"Zr8NCEQrPuF8ZrKLN7K8gUvogLwd8lnyex7J366X+e0=","treeSize":"2493865063","hashes":["UsAxuHihwTM0F6jiitt44ZYWarK9+yS5g9xKuH8IW0M=","QZbRgLLSjaqmTsgTIGoGwiiaFx839XZzguuClHackG8=","e5b/AYKdh88XryIHCPwf84ng2J4aSlqqbYnpOjvJ4rw=","vBU+qvfiGbkcjGki2Tz09MjLXTtcuLWsR1ILJYbcyec=","Bz192670BP/DtrZA73Dx27TFAuIRn+gkVy7Rw2iQwYQ=","f/Hwqa6xE0m3E1jSIiKqXv2Vv9dDj1TPHN+2bcH/n2Q=","DyUe5poSVZKoV2zH+IssS94I/3KUWGNpyigpct4JDIc=","TVmA212Aoc3NvMI6wi3DWzcJdrmISdCXXMvGhdgUDPs=","QJDcRiGVOZB3ZqnStLyI6p5cHJuHYlpj9l30D6dJ4Yw=","VHkNTYfdfGLDpVFWfWKSjfjcRuvQlmuUAdBmyFPK/Jo=","Vtj0cV1JVg42BarN6IFuc9sxxwj5qjpEvAS3hvIgmqQ=","usYuW9ftMWWjBIVuil0n2P3fbsrU4FRBFZln2tQbHGQ=","65nLcE82CMT/uSWMopvTC90nO7as1YEdu7mW501kZBw=","Ht3LUeLpnjrcUg7YO0SSbg+oDasSRyW4K6209DcTr0I=","7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=","0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2493865063\nZr8NCEQrPuF8ZrKLN7K8gUvogLwd8lnyex7J366X+e0=\n\n— rekor.sigstore.dev wNI9ajBGAiEAzBLS4PZv3u5BRf7j1Iui6Ro294Dk9+RFN1711I+WLz4CIQD/UpJXxhjZX4FJgXIs5BddGiQRJuh2+hPykMz7HryGkw==\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmNTk3NjFlMzhiNjkzNDczZDFmZWVlNjYxZTc1ZGQ4ZWNjODg3ZTVkMzk0ODkwYTI2OTA4NTU5MmRlYjI4YjEzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUNmZ0h1MEdRdkVSTjRZMmx0TkExT004djVSc283R3FYZW5YanFHZ1VleGNnSWhBUFVJWWk1bHRVODRjMWtUN3k3OUlUN3ozZkQyV1JYODBnMU1RUFRERUpKOSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5SSFowRjNTVUpCWjBsVlJrSlJPR2gxZW1kV2RGSTFNa05LV0Rad2FFY3ZSVFp1U0habmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTlZFRjNUMVJGTWxkb1kwNU5hbGwzVDBSSk0wMVVRWGhQVkVVeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZDWTFVNGRrazVUMDkwYkVNdmFIaFJVa1JDYkhkYU1UQjJVblZ2S3lzemVrTlVibkVLYjA4eFUwZG9hMDV5UWpabGNIaGtORTFtWlRSSFIyMU1XRVZ2VlZKcU0ybzBOREV2VEU0eVdsSjNObVpTUWpkTU1FdFBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZhVFRkdUNrTTNTRnA1U1d4aVQyOTRiU3RpVmtOcU1tdFJTV3MwZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOVpWMUpyV21wUk0wNUVSbTFaVjFwcFRsUldhVTVIVFhoTlJFWnBDazFVVlRWUFJGWnJXbTFHYkZwWFJUTlplbVJxVFcxWmVsbFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWxOVkZVMVQwUldhMXB0Um13S1dsZEZNMWw2WkdwTmJWbDZXVlJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWtLVFZSVk5VOUVWbXRhYlVac1dsZEZNMWw2WkdwTmJWbDZXVlJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwZEdhMXBIV1RBS1RucFJlRnB0Um0xWmFsVXhXV3BTYWsxVVFYaFpha1V4VDFSbk1WcEhXbWhhVjFab1RqSk5NMWw2U20xTk1rVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1RrUlZlazU2WnpKT2FsbDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZTM2d2TlRoQlFVRlJSQXBCUldOM1VsRkphRUZQY0RSa0swWTNhVTVhZGtSd1NtNW5iMmxSVDAwd2MzVjJNakpNU1ZoTWNERnRWbXhUUjBsWk5teGlRV2xCYlhKbE1IYzBWVXhMQ214VVRscDFZVzQwYmxOeFpURlFZVmhsWTJJME5UQkJSM2h4VFhCdldXTkZiR3BCUzBKblozRm9hMnBQVUZGUlJFRjNUbkJCUkVKdFFXcEZRWGQxV2tRS0t6UjVSelpRYTJWQ2JqazRWUzlaV1c1Nk9EQklNVU5tVkZneVRYTnpiMWw2VDFGYWNtTnNRMVZvZDA5aVVFVkRUSEpaZVZsa1YxQjBNR2xzUVdwRlFRbzBiSGxpYlc1cVNEUk9VM05XY3psaWNrUm1XVE5yY3poT1FuazVkakZyZVhsMlRHeFFhM1JJY2xsbVRHYzJSMjh6WjFKdGVYWmtkMnhWVlRGaWFERmpDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg4c7SsE4fNL2ujrkdk41m/zgVNjA8D4tSo2cHOFUKQMQCFGThRRBmHjOwVGW4E3N3HR64gzTOGA8yMDI2MDgyNzEwMDkxNlowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdwwggHYAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI3MTAwOTE2WjAvBgkqhkiG9w0BCQQxIgQg+qG4yk22r/p/MCANlXF3wmfeATi58VUJSZNGK5aVsMIwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGgwZgIxAN2+77Cc9kdsp2A60lgtyWDVc4ahpiGBZPoYFCL+vUZz8ZT8TJDnvRe6QjQHYwfGOwIxAJrHj97rBcjI0/q/uhpHywSZQ3II0wqjf6Uc3WXR5jBxKeiCmIMi4ROdTO0ktn2xWw=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"9Zdh44tpNHPR/u5mHnXdjsyIfl05SJCiaQhVkt6yixM="},"signature":"MEYCIQCfgHu0GQvERN4Y2ltNA1OM8v5Rso7GqXenXjqGgUexcgIhAPUIYi5ltU84c1kT7y79IT7z3fD2WRX80g1MQPTDEJJ9"}}
 
 
build/torch-stable-abi29-cu126-x86_64-linux/{_flash_attn3_cuda_0f52d9d.abi3.so → _flash_attn3_cuda_47281f5.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:504cfe6ebed9546becabdc40727c4f27197b9f368448ebc9ad9be4aa2f468c87
3
- size 798357424
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:02cb8bb1ed36846eac484229dff9eb920e3dcd18bca462e467d4b1d93898052d
3
+ size 798352168
build/torch-stable-abi29-cu126-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _flash_attn3_cuda_0f52d9d
3
- ops = torch.ops._flash_attn3_cuda_0f52d9d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_flash_attn3_cuda_0f52d9d::{op_name}"
 
1
  import torch
2
+ from . import _flash_attn3_cuda_47281f5
3
+ ops = torch.ops._flash_attn3_cuda_47281f5
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_flash_attn3_cuda_47281f5::{op_name}"
build/torch-stable-abi29-cu126-x86_64-linux/flash_attn3/__init__.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ctypes
2
+ import importlib.util
3
+ import sys
4
+ from pathlib import Path
5
+ from types import ModuleType
6
+
7
+
8
+ def _import_from_path(file_path: Path) -> ModuleType:
9
+ # We cannot use the module name as-is, after adding it to `sys.modules`,
10
+ # it would also be used for other imports. So, we make a module name that
11
+ # depends on the path for it to be unique using the hex-encoded hash of
12
+ # the path.
13
+ path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
14
+ module_name = path_hash
15
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
16
+ if spec is None:
17
+ raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
18
+ module = importlib.util.module_from_spec(spec)
19
+ if module is None:
20
+ raise ImportError(f"Cannot load module {module_name} from spec")
21
+ sys.modules[module_name] = module
22
+ spec.loader.exec_module(module) # type: ignore
23
+ return module
24
+
25
+
26
+ globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
build/torch-stable-abi29-cu126-x86_64-linux/metadata.json CHANGED
@@ -1,10 +1,9 @@
1
  {
2
  "name": "flash-attn3",
3
- "id": "_flash_attn3_cuda_0f52d9d",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
7
- "kernel-depends": [],
8
  "backend": {
9
  "type": "cuda",
10
  "archs": [
@@ -16,21 +15,11 @@
16
  "algorithm": "sha256",
17
  "files": {
18
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
19
- "_flash_attn3_cuda_0f52d9d.abi3.so": "UEz+br7ZVGvsq9xAcnxPJxl7nzaESOvJrZvkqi9GjIc=",
20
- "_ops.py": "skEK8ihOH71VCjft8pGBiJcdk5CRvJWcb81mL7YyQQQ=",
 
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
24
- },
25
- "provenance": {
26
- "kernel-builder": {
27
- "version": "0.17.0-dev0",
28
- "commit": "081dcd473f8eca27226eef1f9c47c45b86c756b5",
29
- "dirty": false
30
- },
31
- "kernel": {
32
- "commit": "0f52d9d81c14d81c1d5bbde875c3d85b0fa37cc7",
33
- "dirty": false
34
- }
35
  }
36
  }
 
1
  {
2
  "name": "flash-attn3",
3
+ "id": "_flash_attn3_cuda_47281f5",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
 
7
  "backend": {
8
  "type": "cuda",
9
  "archs": [
 
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
18
+ "_flash_attn3_cuda_47281f5.abi3.so": "AsuLse02hG6sSEIp3/nrkg49zRi8pGLkZ9Sx2TiYBS0=",
19
+ "_ops.py": "qhazHfRzv7OkC0vnHustj4UksH6An4mU8dLo91m2ziQ=",
20
+ "flash_attn3/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
  }
build/torch-stable-abi29-cu126-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHSTCCBtCgAwIBAgIUIvRHmwBVQK27sQhhGxwnXv67kjwwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MjAxMzA0WhcNMjYwODI3MjAyMzA0WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwbLy+orb7yZqEtPD1l8cjPbNDfwgGYzYmgAhb9mGQwr7QTZXE5J1cYM8vqIldzw4aa8WFRFnpIH1xn3/EvQsMaOCBe8wggXrMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUKPgQqvYqJRzHCnex0kNsBlnABdAwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDBmNTJkOWQ4MWMxNGQ4MWMxZDViYmRlODc1YzNkODViMGZhMzdjYzcwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwODkxNTM1MjgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoETay2QAAAQDAEYwRAIgX05aB9qKaWZEARIT6SW2me4eTZWN/lZ6ngrUYqxlz68CIC0tNMzvxLS5ddguClbPbRAZ6eJ82wD4GKI5HHVielhaMAoGCCqGSM49BAMDA2cAMGQCMF4D5EkBGT8gPae2IVxI+LENttTYpo3SDTa7bZjkB+K8kP1e2KTIQ1ephaf6U7sdTAIwLSSg0d0PzDtHtbo1+SGTlEf0RhV8lDSXw308caWcCtgROeseyBGgQTnfMy4KrSq7"}, "tlogEntries":[{"logIndex":"2618837100", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787861585", "inclusionPromise":{"signedEntryTimestamp":"MEQCIHcyqGcGPm8CLXULv6no3dgcAlsB/fXXxwwFu1Y/z1n1AiBeooBkUfcGRpQnv/uL/Af9VF7JW3VbQteiuPFX2Ri9cA=="}, "inclusionProof":{"logIndex":"2496932838", "rootHash":"3VAb5eRBE78EzD30pMObabCcEVO7asjJKWf85MHIv4Q=", "treeSize":"2496932841", "hashes":["RlfzhXRlaVb1dWK6dyI+FoEJtlPvgxzg/iSXidy8AlI=", "Cvu7hg5YfuKVHcGyF6kHa7Ng4tdWEuBFEb3AJYHz0Og=", "Yqln5D4GTKRbwmIUXFtyl5nTrk4Km03fzJGUQMSLXyw=", "0YHhMRyM49+hBAVwguYCB9cKJfRzye2xCzB+zr7kIio=", "uB+z7Dck/2UKAnnprryhNGZQqiP8xObhgGG5budOmPE=", "ZZ7A0WF9TrltVaS1UL4yUsFfHXtS0cPB4Xg3ZPYT2tI=", "XHtByHTOI8DrY/YiGKUiyoMaLwC4vUQnDpJz0DsOfrc=", "KU/5qTnchtfh+lVBmpgbwGtW8za9KWOF/uDiYFDghnM=", "w3HaAreLxIokmrX0CllDsJ79U/1ZwiMcb0pebOjkT54=", "JQiuQMw8M2FbRIlsChY2u6mqTNQNFORoEICw/YpOWXs=", "7miArd4rv5JDTAL0CrXluOO1cZ6JqCt31WwycaYdKs8=", "LyTvxBbtFt2C77xSe3YHWz88fi+OwkikHvRTXNyMCV8=", "oXpZdinIWOxn8d4g/7Q6OdCals+/SNep+Ou+M4o98Q8=", "QutiLOAfQukwHVQ717gM+94FF/5Giel82kbXkTx/F8w=", "7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=", "0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2496932841\n3VAb5eRBE78EzD30pMObabCcEVO7asjJKWf85MHIv4Q=\n\n— rekor.sigstore.dev wNI9ajBFAiAWN+Y23+vxiKvWB3cZp1HLjZs4K3U50KiNLReg2VBSYQIhAP9k5XWzOu29gLh/Uugiw+AXYUsJ8ifcmE8/nOZendJB\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmMmExMzliZjczYzZlMDg2ZmUxMzc2YWRkNzAyOWZjN2Y5ZmQxYmNlYTk3NmRhZDAxNThiOTBhNmMyYjAyOTZkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRld6TzVRaEVOb3RVNUFQRFFIMzEzQ0NtampnNkN6TzVRUEFWeE9HblVFL0FpQU8vNzhYWFhIbENmaVR0L2FqSHF6aEFLb2RleEQ4VDBHRDE4VlF2OE1lMlE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRWRU5EUW5SRFowRjNTVUpCWjBsVlNYWlNTRzEzUWxaUlN6STNjMUZvYUVkNGQyNVlkalkzYTJwM2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTmFrRjRUWHBCTUZkb1kwNU5hbGwzVDBSSk0wMXFRWGxOZWtFd1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVYzWWt4NUsyOXlZamQ1V25GRmRGQkVNV3c0WTJwUVlrNUVabmRuUjFsNldXMW5RV2dLWWpsdFIxRjNjamRSVkZwWVJUVktNV05aVFRoMmNVbHNaSHAzTkdGaE9GZEdVa1p1Y0VsSU1YaHVNeTlGZGxGelRXRlBRMEpsT0hkbloxaHlUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZMVUdkUkNuRjJXWEZLVW5wSVEyNWxlREJyVG5OQ2JHNUJRbVJCZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5SMWt4VFcxUk5WcEVaM2haZWtVd1drUm5lRmw2Um10T1YwcHBDbHBIVlRST2VsWnFUVEpSTkU1WFNYZGFiVVY2VGpKT2FrNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDFIV1RGTmJWRTFXa1JuZUZsNlJUQmFSR2Q0V1hwR2EwNVhTbWxhUjFVMFRucFdhazB5VVRRS1RsZEpkMXB0UlhwT01rNXFUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDFIV1RGTmJWRTFXa1JuZUZsNlJUQmFSR2Q0V1hwR2EwNVhTbWtLV2tkVk5FNTZWbXBOTWxFMFRsZEpkMXB0UlhwT01rNXFUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUkNiVTVVU21zS1QxZFJORTFYVFhoT1IxRTBUVmROZUZwRVZtbFpiVkpzVDBSak1WbDZUbXRQUkZacFRVZGFhRTE2WkdwWmVtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1QwUnJlRTVVVFRGTmFtZDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwVVZsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTTjBKSWEwRUtaSGRDTVVGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZWR0Y1TWxGQlFVRlJSQXBCUlZsM1VrRkpaMWd3TldGQ09YRkxZVmRhUlVGU1NWUTJVMWN5YldVMFpWUmFWMDR2YkZvMmJtZHlWVmx4ZUd4Nk5qaERTVU13ZEU1TmVuWjRURk0xQ21Sa1ozVkRiR0pRWWxKQldqWmxTamd5ZDBRMFIwdEpOVWhJVm1sbGJHaGhUVUZ2UjBORGNVZFRUVFE1UWtGTlJFRXlZMEZOUjFGRFRVWTBSRFZGYTBJS1IxUTRaMUJoWlRKSlZuaEpLMHhGVG5SMFZGbHdiek5UUkZSaE4ySmFhbXRDSzBzNGExQXhaVEpMVkVsUk1XVndhR0ZtTmxVM2MyUlVRVWwzVEZOVFp3b3daREJRZWtSMFNIUmliekVyVTBkVWJFVm1NRkpvVmpoc1JGTllkek13T0dOaFYyTkRkR2RTVDJWelpYbENSMmRSVkc1bVRYazBTM0pUY1RjS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyDADAgEAMIICvwYJKoZIhvcNAQcCoIICsDCCAqwCAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgg16t70Oz7UW53QtziikKf7ILP6cKRKtWdbA8uDeNc+8CFE30C1iKuPuvQRRlzZOnUPmxMdCSGA8yMDI2MDgyNzIwMTMwNFowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdowggHWAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI3MjAxMzA0WjAvBgkqhkiG9w0BCQQxIgQgB/Kpk3o+eNYDFSZczruSN1BkoCVKS3Is36nQ8cZtGaowgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGYwZAIwBm4XTaiwB98QP1HQ0nBoYxVo3d/67P4242t9QeSXOdm2+SRE0G6N2J9PFkBUBSeRAjAnNpCRfGb6MtvnHuL07s+rCQtIQ0mQrWczQP1g3rUdPwAav7tTHw3w95hTsdzd8Ys="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"8qE5v3PG4Ib+E3at1wKfx/n9G86pdtrQFYuQpsKwKW0="}, "signature":"MEQCIFWzO5QhENotU5APDQH313CCmjjg6CzO5QPAVxOGnUE/AiAO/78XXXHlCfiTt/ajHqzhAKodexD8T0GD18VQv8Me2Q=="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"1973428633","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1782518629","inclusionPromise":{"signedEntryTimestamp":"MEYCIQDCyEFVrf/PiKPN9ElmwrvSh9BX45zduf/uucUFzegx9gIhAJW7bylKgGXzFf9DOyPhOCmypspnvAIlKMfemHqQ0qaj"},"inclusionProof":{"logIndex":"1851524371","rootHash":"Qjdo30p8XWEHTPjc6VwTvdlLJc8QTYvDlWeHvtB2Vms=","treeSize":"1851524389","hashes":["3kP/uLcm6RZtuLyXpFlpjirIMACtLH0heyaRZozYX/U=","GEeVBwNLpXUqPCjU0CbY89WuFTToOHlOfvciDzmLGEw=","UPV5/kHDMx7rFEwdcOhnu9EkTlhsh4LKz2HyHdIbdG4=","ehGmdY3KgdVnjxhgPdydTLZC0xO+9iOLTeio7zwSsIE=","A7G/eMP62s0HFyL8d5LWi/ElUKeF4P9r/LDdGXVY2Ew=","XiQlWiROSRSHfkI+J/M3955iJUd9RcqSgVZJ2mlkYV0=","Wdllnp8SId/YtRn3pOdAK4C/ZxhU7UGY5BwhSftyuX0=","oJjTWHTqS/TUyXxNmX3wlyDZsnTxxJeLd1N81BbJN9Q=","KWE0KrOJD/Dq7DkhL1da9kPDp72uQzyG7H1rUNKjhSE=","F/E+IBLEkJoA0SxKVYMfSDV1fewa94v46ZNBuuH5NNg=","XlI4aVuorCLlTnjn2TYC/z1MnWgASm+mgSvhh6NUwn0=","YIvmYTmatT5c8GJFUcC+FIN+astoVJW85SRS23hm6K0=","5SicDVFW/8/mpbov3/7HmgjUm4Z/ok9MDfkpyklk/zc=","zBViQsza/o62MhKl7o4JWnBX2kwGEPVYEl7i+HPv9MA=","NDIRlqxO0IaGr94q86MIU7VCAN3yEEgOHS4loya5lu4=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1851524389\nQjdo30p8XWEHTPjc6VwTvdlLJc8QTYvDlWeHvtB2Vms=\n\n— rekor.sigstore.dev wNI9ajBFAiEA4wzBghVW6Meg11MIyrtsTOrvwPDLrwDKPJhoHMO8ILMCIFoABRJLbBEhKH5N8qpdOPjSg6tTLN7EQG0FVu/C658U\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlOTE0ZjgxMzA3YTE3YmUzMzY1YTFlYmRlZGZhY2ZkMTg4NGUxMjBlYWE5ZDk2ZmM0NzA2YTRhNDE2MGVhNDZhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNuU3ZmMlN6MUF3b3FNeFQ0SDMzOVFELzBjV041UjAxUlFJSERQWWR2SUpBSWdFU21jK2RicXNZckNQSUYzRy93anU3ZTdNWXBvbzVxVEYxakdUd0JjZFc0PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5STFowRjNTVUpCWjBsVlMwZ3hZblZLSzFwNFNUTTVUMWRVUTFWWGFXbEdhblpyZUdscmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxU1ROTlJFRjNUWHBSTlZkb1kwNU5hbGwzVG1wSk0wMUVRWGhOZWxFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZaY0dOeWJXaGFSWGxvWVhOT1p6RTNTakpqTm5KMFNHOVJlRk54YTBsd1QwNVJOWElLVWl0WVkweGlhMkpXY0RKTFVYWnRlWFk1TkdzemRrNXBWemRsTVRsbGRHaFBkVTVHV1dGdlZUQmtZakpuVHpKc1ZtRlBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZHTlhvd0NsUXZhRlF3Um1STmQzbElVM1J6ZFRBNVFYbHNObXRKZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU9SR041VDBSR2JVNVVWVFZPYWsxNVRWZEdiRTVxWXpGT1JHeHBDbHBYU1hsYVJFcG9XV3BGTTA1SFVtcFpWRlY0VFdwbk1rNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2xhVjBsNVdrUkthRmxxUlRNS1RrZFNhbGxVVlhoTmFtY3lUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2tLV2xkSmVWcEVTbWhaYWtVelRrZFNhbGxVVlhoTmFtY3lUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUlJNMDFxWjNnS1dtcFZNVTlVV1hwTmFrWm9XbFJaTTA1VVVUVlpiVlpwVFcxUmVWbFhTWGhPZWxKcldUSkZNVTFVU1RST2FtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1kNVRsUkZNMDFFUVhkT1ZFMTJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTNXbXAzZUd0QlFVRlJSQXBCUldkM1VtZEphRUZMYUZKUU5HRXlWelZPWjBkU01XRk9XbmhRWjJGS01XWmFkalpzUlRSWE5HTklSbWhUS3pRdmFUZExRV2xGUVd0Q2VrWk9jbEJGQ2tWa2JFeGthWGgzWTFOWk4zSlFkVEo0YkhwT1VuVkhjaXRYVnpWSWRXbENSVTlyZDBObldVbExiMXBKZW1vd1JVRjNUVVJoUVVGM1dsRkplRUZOV1VvS1p6WXZhMk4zV2tVeFFTdFNhVGxqYTFWblVEQklVMmxTTkVGeFUzTkJRMlJvYUhSbU5uUk5SRGRFVGpSSlkwcFNSazF5YWxoUE4wcFJWR05wTjJkSmR3cEhUM05WVGpsdFMzUlhNakpKT0M5SWJ6VjVMMGhrYlVwRmJHSnpVbTg1U0RsT2QxRlpjbE5LUW1Sa2NtRnRXRTVoTVRWV2VsTkxaRk40YmtSVVYyWk1DaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyzADAgEAMIICwgYJKoZIhvcNAQcCoIICszCCAq8CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgwrEzS7Wtc5UvrTVN5pPigcwbuzi9+j9qzn0tKh7+08ECFQDG2kFqr0JeL6GeyxxZYj+NmqXVwhgPMjAyNjA2MjcwMDAzNDlaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHcMIIB2AIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYyNzAwMDM0OVowLwYJKoZIhvcNAQkEMSIEIML05BDj7l5jMkpY+Xrgm912bzTHBFcLJS3iKcF2nB47MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRoMGYCMQDnANCK9nD/qDuz2KZCeSkMYUp7p4yElLQjqvQb2JtOWX6dhYGr5gl8LxIJBe7xziUCMQCMlneQQv5V+PlnhPUobCh76z+5RUh7DAmXDEd19vzwc+gBm2dArPjeE0alohQcwOk="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"6RT4Ewehe+M2Wh697frP0YhOEg6qnZb8RwakpBYOpGo="},"signature":"MEUCIQCnSvf2Sz1AwoqMxT4H339QD/0cWN5R01RQIHDPYdvIJAIgESmc+dbqsYrCPIF3G/wju7e7MYpoo5qTF1jGTwBcdW4="}}
build/torch-stable-abi29-cu128-x86_64-linux/{_flash_attn3_cuda_8a730d9.abi3.so → _flash_attn3_cuda_47281f5.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:e7c51038223450b4841a978f88a0d2bd41f4dabc2218d395ecdaa1ee3c736a68
3
  size 802030296
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cc5e6babfafb4f539327c695c8112c66a0c273069df7c35b2a072672d102c658
3
  size 802030296
build/torch-stable-abi29-cu128-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _flash_attn3_cuda_8a730d9
3
- ops = torch.ops._flash_attn3_cuda_8a730d9
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_flash_attn3_cuda_8a730d9::{op_name}"
 
1
  import torch
2
+ from . import _flash_attn3_cuda_47281f5
3
+ ops = torch.ops._flash_attn3_cuda_47281f5
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_flash_attn3_cuda_47281f5::{op_name}"
build/torch-stable-abi29-cu128-x86_64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "flash-attn3",
3
- "id": "_flash_attn3_cuda_8a730d9",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
@@ -15,22 +15,11 @@
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
18
- "_flash_attn3_cuda_8a730d9.abi3.so": "58UQOCI0ULSEGpePiKDSvUH02rwiGNOV7Nqh7jxzamg=",
19
- "_ops.py": "IB37k3QlN7IQi8rLoaWXzh4VROcbFVi4jSfLdb9Ew+w=",
20
  "flash_attn3/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
24
- },
25
- "provenance": {
26
- "kernel-builder": {
27
- "version": "0.17.0-dev0",
28
- "sha": "81580bb92577f2f7228661ca2a221fc052375709",
29
- "dirty": false
30
- },
31
- "kernel": {
32
- "sha": "8a730d96c37560ccf1d3e09f7bbccdc886818f33",
33
- "dirty": false
34
- }
35
  }
36
  }
 
1
  {
2
  "name": "flash-attn3",
3
+ "id": "_flash_attn3_cuda_47281f5",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
 
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
18
+ "_flash_attn3_cuda_47281f5.abi3.so": "zF5rq/r7T1OTJ8aVyBEsZqDCcwad98NbKgcmctECxlg=",
19
+ "_ops.py": "qhazHfRzv7OkC0vnHustj4UksH6An4mU8dLo91m2ziQ=",
20
  "flash_attn3/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
  }
build/torch-stable-abi29-cu128-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHTDCCBtGgAwIBAgIUBbPaF4GfHWiJF2BP+z2xfOqWX+wwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNzA4MTY0NTUxWhcNMjYwNzA4MTY1NTUxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEk6u0Xe1L6S9FFfKSj4SjjKgM+N9JXbMfTVDLt5pezHfqp7zi2N2DNugWfs9iBkQeYNQ8a+Pzk05SD+OsxwFFXqOCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUWOXruGfRmmOC+ochUvqvGmqwlccwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoOGE3MzBkOTZjMzc1NjBjY2YxZDNlMDlmN2JiY2NkYzg4NjgxOGYzMzATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE3MzBkOTZjMzc1NjBjY2YxZDNlMDlmN2JiY2NkYzg4NjgxOGYzMzAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE3MzBkOTZjMzc1NjBjY2YxZDNlMDlmN2JiY2NkYzg4NjgxOGYzMzAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDhhNzMwZDk2YzM3NTYwY2NmMWQzZTA5ZjdiYmNjZGM4ODY4MThmMzMwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMjg5MzExOTk3MDMvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABn0KfHc4AAAQDAEcwRQIgRSaXej+tkk42/vNQIBFmsUoPXmOVmbzTK62Z5WaRaW4CIQCULbQMlVKcnGJUvWibZ3MxoPgFyDHwKjs1EkKzeJb/kjAKBggqhkjOPQQDAwNpADBmAjEAgklushRgcgTaPMcLoqowUbMyR7IXzfvStS6Skb/zJ6Ohjm+QusKc6DbljWz+z1hQAjEA8NIun66yXhOhbH8fJYTF2u2WdiEoOC8yNF0RDeDWfARfQ1QOciQGFb/JgTJbFJzU"},"tlogEntries":[{"logIndex":"2118035315","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1783529152","inclusionPromise":{"signedEntryTimestamp":"MEQCIB3e2B2G67heW9SQyQRn/+x6btXbEqF1fZzetYvyJKOGAiBrJpyKKqVO6rXxhK+Ploj6olp0TV7icpGvGB2lK8dsRQ=="},"inclusionProof":{"logIndex":"1996131053","rootHash":"83vKyngorA7aIqoKaf2MZaJVFg6lSUW0woJD/f3wjKA=","treeSize":"1996131063","hashes":["ETNiPA+FCYAg8m/E53BLdDL/BAB8kM00lA+0TebUQX8=","fVgrfNLxMjAoGtFN6e0NtB01SbwCGY9xD/aeQk0ueb0=","g+LqnIMQr/tidXza8lU8VuLHAzON173YpZNYsIvdL3o=","vtx3tgO6guw0LPj50VW0gmh9TgUqK0Mw8n/o6cFHHcM=","pt1BRaKYgN4jk6cKPNunchUXv3OVL8ZiK98gl6STwcE=","+vjSCHPmFaGdkTyrItILGTzTgaZe+SSwI76buoVmdNk=","AuJ5yZaX+ax7RYvlF2vIN8NXOhG9s88y0+UyfRJaNWU=","JGTXipcBf6+rNH7aPgajrQAqSGaN4vKPKRw+PvB8NEs=","560g9I2weWseHzpI3f9zEK9EopDHVGbzWDjki/071bw=","kxfqdkfoPYkMfiH0NX6ff9usYaftJo0K/1UNn+5yQlM=","3zUpFG7ktUxnvEcdtooG5SRvctKvdckUSOz9B1RjplM=","9q0OT+BptjINoR8zAzEP3oPUCirDQTT26JI3eJtmyZI=","rGFoGtRVfl41SgsFsU2IgUCjfRmn18jvpugaT99fFtg=","v3Rnvwdy/iZuSJqQSjxAKTt0GBmX+4XksDaltKHxXs0=","lwFfNQVdnM+UXReXH9xyhoIKaRe1KrqgBwsxZGklig0=","frI9BMUdqa/KPLUCZ9yfDzZ2Z6tglf7SvThMJqEFBKU=","Bcvbbu+tDL+zr1H2q26c2ATmVu7v/f7JIFweUu7qDK8=","WajL3ZhY6ZX9meV3VTH9TkrbM31OF4o6+7foL0Uf6PI=","cyKMKBvHkQtwb2xR5svh+YppANOVdn7X8t4DuKMxICA=","+/VZ56MsIPxMiyLAodzKXo5TEWdQp36z89qLhpzloAo=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1996131063\n83vKyngorA7aIqoKaf2MZaJVFg6lSUW0woJD/f3wjKA=\n\n— rekor.sigstore.dev wNI9ajBFAiEAwuF173o7KsUM9T3wCjZZ0hw/fJ/TjrO02kKq63v02gcCIAwP6+DuMHt+RBcTVdLKB3sf+/sspPy0l8uj5AJPCuo5\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI0NDYxNTg3Y2JjMmI4MzFlMTU2NWRhOTA3ZTQzZDU1ZDc4YzJmNmI1M2ZlNDFlMzI0ZTU1OWQzNWYzODFmMzM0In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRVRKMHFkdHVrN0V0NER6cHdudTg1enNvU0ZXWk9VSnVCcXE0dFFvUm9LSEFpQVhzRXR3cjgzajAvK2E1UGdZRGtYcHBaN21xMnVLbThXaVp3OWhIOENQVVE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVSRU5EUW5SSFowRjNTVUpCWjBsVlFtSlFZVVkwUjJaSVYybEtSakpDVUN0Nk1uaG1UM0ZYV0N0M2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDU2UVRSTlZGa3dUbFJWZUZkb1kwNU5hbGwzVG5wQk5FMVVXVEZPVkZWNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZyTm5Vd1dHVXhURFpUT1VaR1prdFRhalJUYW1wTFowMHJUamxLV0dKTlpsUldSRXdLZERWd1pYcElabkZ3TjNwcE1rNHlSRTUxWjFkbWN6bHBRbXRSWlZsT1VUaGhLMUI2YXpBMVUwUXJUM040ZDBaR1dIRlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZYVDFoeUNuVkhabEp0YlU5REsyOWphRlYyY1haSGJYRjNiR05qZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOVBSMFV6VFhwQ2EwOVVXbXBOZW1NeFRtcENhbGt5V1hoYVJFNXNDazFFYkcxT01rcHBXVEpPYTFsNlp6Uk9hbWQ0VDBkWmVrMTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDlIUlROTmVrSnJUMVJhYWsxNll6Rk9ha0pxV1RKWmVGcEVUbXhOUkd4dFRqSkthVmt5VG1zS1dYcG5ORTVxWjNoUFIxbDZUWHBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDlIUlROTmVrSnJUMVJhYWsxNll6Rk9ha0pxV1RKWmVGcEVUbXdLVFVSc2JVNHlTbWxaTWs1cldYcG5ORTVxWjNoUFIxbDZUWHBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUm9hRTU2VFhjS1drUnJNbGw2VFROT1ZGbDNXVEpPYlUxWFVYcGFWRUUxV21wa2FWbHRUbXBhUjAwMFQwUlpORTFVYUcxTmVrMTNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1jMVRYcEZlRTlVYXpOTlJFMTJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNHdTMlpJWXpSQlFVRlJSQXBCUldOM1VsRkpaMUpUWVZobGFpdDBhMnMwTWk5MlRsRkpRa1p0YzFWdlVGaHRUMVp0WW5wVVN6WXlXalZYWVZKaFZ6UkRTVkZEVlV4aVVVMXNWa3RqQ201SFNsVjJWMmxpV2pOTmVHOVFaMFo1UkVoM1MycHpNVVZyUzNwbFNtSXZhMnBCUzBKblozRm9hMnBQVUZGUlJFRjNUbkJCUkVKdFFXcEZRV2RyYkhVS2MyaFNaMk5uVkdGUVRXTk1iM0Z2ZDFWaVRYbFNOMGxZZW1aMlUzUlRObE5yWWk5NlNqWlBhR3B0SzFGMWMwdGpOa1JpYkdwWGVpdDZNV2hSUVdwRlFRbzRUa2wxYmpZMmVWaG9UMmhpU0RobVNsbFVSakoxTWxka2FVVnZUME00ZVU1R01GSkVaVVJYWmtGU1psRXhVVTlqYVZGSFJtSXZTbWRVU21KR1NucFZDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyzADAgEAMIICwgYJKoZIhvcNAQcCoIICszCCAq8CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgns+vQzBQayBeyRXV4q/N3wplSUcdE9r/YlPDt8zbyNACFQCr7exowLDfWhG4cNpK+PuTwPErBxgPMjAyNjA3MDgxNjQ1NTJaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHcMIIB2AIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDcwODE2NDU1MlowLwYJKoZIhvcNAQkEMSIEIJm689Q1sTOKbHJo9PN3e/Pa/SbZJGzPH+hLfMS3gXdXMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRoMGYCMQDM5s3EIiG3yhNlXHNwq98dq+TQurG7r/LddD7V+DIVPChdd+PRSRUXKe+KCTOgNPECMQDmMS/XbYok+2AwvK4PTWu8jemU40LFkrgnyFwkkiUYgtpWulQQxWWwoS3zRNlACTo="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"RGFYfLwrgx4VZdqQfkPVXXjC9rU/5B4yTlWdNfOB8zQ="},"signature":"MEQCIETJ0qdtuk7Et4Dzpwnu85zsoSFWZOUJuBqq4tQoRoKHAiAXsEtwr83j0/+a5PgYDkXppZ7mq2uKm8WiZw9hH8CPUQ=="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"1973428740","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1782518630","inclusionPromise":{"signedEntryTimestamp":"MEYCIQCD7YbwkOFqOspji1aixt67T4JazCZg+BLHsm6WXZCGtQIhALNkT/Yz1g360eGvmh4U8gfKALxMy4svFNjshoZOZ9uU"},"inclusionProof":{"logIndex":"1851524478","rootHash":"6AEi5zwZD2B2DdLWDmq4RBI3SXn4+Ywmj14tLQ/kx3w=","treeSize":"1851524489","hashes":["ZVu2zOFqRnXS7dhF58+FV3YIi6T2DVBOFR5qC6pZH5Q=","SspTZBFCG/Uj7fIjQ+RCrl5HVbjkMZ+UxD5oGV5XvWM=","Edr+jIncEKsnuLmOdyIwMYzFNdS+04zyEc4NhkuwSqE=","+UEIFV8XY9jMpn5XfpoI/9VZJCXFv6ZTWDIZ0/Wjn0E=","Sta4rrWeLrBtoEumP4FMVtBr+n96AXw8W0CJfx1jhfg=","la0N1VAKKgK4FsbrjXpN28xEvPebmXEwlVYOSQf1Ofc=","qriMQl9FQH/IRSzYdiKRlmKw+LMtyFmnhn4IC/Rf3Gw=","B2e6SoLnEcazEBK3nQSgQTxsRL3eJLBp/qMOzgWGdFo=","Wdllnp8SId/YtRn3pOdAK4C/ZxhU7UGY5BwhSftyuX0=","oJjTWHTqS/TUyXxNmX3wlyDZsnTxxJeLd1N81BbJN9Q=","KWE0KrOJD/Dq7DkhL1da9kPDp72uQzyG7H1rUNKjhSE=","F/E+IBLEkJoA0SxKVYMfSDV1fewa94v46ZNBuuH5NNg=","XlI4aVuorCLlTnjn2TYC/z1MnWgASm+mgSvhh6NUwn0=","YIvmYTmatT5c8GJFUcC+FIN+astoVJW85SRS23hm6K0=","5SicDVFW/8/mpbov3/7HmgjUm4Z/ok9MDfkpyklk/zc=","zBViQsza/o62MhKl7o4JWnBX2kwGEPVYEl7i+HPv9MA=","NDIRlqxO0IaGr94q86MIU7VCAN3yEEgOHS4loya5lu4=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1851524489\n6AEi5zwZD2B2DdLWDmq4RBI3SXn4+Ywmj14tLQ/kx3w=\n\n— rekor.sigstore.dev wNI9ajBFAiA9VhK/jiJog/4qoXoxf4CreYZRC1hNJsscnF/JxJYjywIhAOcU5D3RinBjZOgtuSzIbrsDjdTHFJtEU+dlZQXVyUiu\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjYzAyZmQxYzc3ZTJjNWQwNmY4MzA5NzdkNjM3NzFjNTdmZjAxOTBlMzBlYWM0MjdmZGM0ZjM5MmI5YWJkYzI3In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJSDlFVGJHb3FrY01zbmMxRHdsNkpXRWprVTlRYmtPRDlRaVlhTjV1N0h3SEFpRUFnNmNubFBucFdIWW9WMWdEU3dMc1RTRWV6THNZM1FVQnN2T1p5Y0JicFRVPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRla05EUW5SSFowRjNTVUpCWjBsVllqTlhkUzlJZG14dE56azJOeTl1V1Vabk0wdDJjRzAyUVZOQmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxU1ROTlJFRjNUWHBWZDFkb1kwNU5hbGwzVG1wSk0wMUVRWGhOZWxWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZtWjFrdlRVbzRXV3BpYzNZeGNqVjRTMnRKT1Vwa1ZIQllkbUpGYWxkTGFHOXlWM1VLYzI1dGMxQnBPSFlyV1RscFdHazFNMnd3V1U1WmVqQkhXbmt4VDNwaWNsTkpkV2s0UVZaaksxazNXVlpRTkdJMFRIRlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZIWVhwSUNsUlpOV1prZVU1RFJsQldaR0U1VTBGb1FVaDNaV3BSZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU9SR041VDBSR2JVNVVWVFZPYWsxNVRWZEdiRTVxWXpGT1JHeHBDbHBYU1hsYVJFcG9XV3BGTTA1SFVtcFpWRlY0VFdwbk1rNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2xhVjBsNVdrUkthRmxxUlRNS1RrZFNhbGxVVlhoTmFtY3lUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2tLV2xkSmVWcEVTbWhaYWtVelRrZFNhbGxVVlhoTmFtY3lUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUlJNMDFxWjNnS1dtcFZNVTlVV1hwTmFrWm9XbFJaTTA1VVVUVlpiVlpwVFcxUmVWbFhTWGhPZWxKcldUSkZNVTFVU1RST2FtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1kNVRsUkZNMDFFUVhkT1ZFMTJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTNXbXA0ZEd0QlFVRlJSQXBCUldOM1VsRkpaMk5zTTJVclMyUmFiM056UXpobFJrUmxiRWxYWnpaQ2NGSlFaVnBwWVhBdlN5OVlVWEZpVWxwQlFqQkRTVkZFZEdSMmVrTk1SbnBpQ2s5UUsyVTRSMU5qWTNwbVVGSlRhbEV2U0V4ak56bHdlVEU0YTBKcU5XUktZV3BCUzBKblozRm9hMnBQVUZGUlJFRjNUbTlCUkVKc1FXcENWWFZpYlRnS1p6aEtTRUkxU2pSNk5sUklTa0ZZUkRrd1EyTnJXRFpEZGxkeFJrRnRkbXQzUWs0eGJXbzFUV2RXVGpNd1NuaEVVa3d2YTI5SVMwRnZhMmREVFZGRFdBcDVOalUxTHpWSFJ6WTNjaTlHU1N0SE1VMW5RVFpaUVUwMFMwbFRPVk40Y3k5WVZuVk9WVkIzU0VaMGVXTk9kRVp0ZVZSalQxUnVaMUJ5V0dWcWNXczlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgNw/zRK3sEjj0msEXE8MOGFzyO+EAxgvzSjoiL02gnjUCFQC6gzini/bFEtVBfOrUGxr4sxlKXBgPMjAyNjA2MjcwMDAzNTBaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYyNzAwMDM1MFowLwYJKoZIhvcNAQkEMSIEIIXDl8Bhx5KTGIV7Qhrk24byBx9/HQhVBQY7hwytn+V2MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMDibPp4p1N7GBnUbApVOTByrzwQk1R6/d2Rn6yZKVexwR2+3152Wa0fZpvk7HIQxCAIxAObFN65lBcJBI7/4+O0uWunWzSe4VL5Ve1fh1BzE/mtrwI0PE1Py8gfMRtYYsL8l4w=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"zAL9HHfixdBvgwl31jdxxX/wGQ4w6sQn/cTzkrmr3Cc="},"signature":"MEUCIH9ETbGoqkcMsnc1Dwl6JWEjkU9QbkOD9QiYaN5u7HwHAiEAg6cnlPnpWHYoV1gDSwLsTSEezLsY3QUBsvOZycBbpTU="}}
build/torch-stable-abi29-cu130-x86_64-linux/_flash_attn3_cuda_0f52d9d.abi3.so DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3e7e7178a8d0c67e197101b4a0d52983a4891d0e4b970316582f4d37ddfb1bac
3
- size 821408256
 
 
 
 
build/{torch-stable-abi29-cu126-aarch64-linux/_flash_attn3_cuda_addf474.abi3.so → torch-stable-abi29-cu130-x86_64-linux/_flash_attn3_cuda_47281f5.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:474882b6dc65354889a9ac6489b3ffb9e449b74db1610f032e6b94d9d5788874
3
- size 780674496
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fe8097092fd3f9710b766b418d616d93824f9682c9cd8a8ab7d5ab98743405d4
3
+ size 821403000
build/torch-stable-abi29-cu130-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _flash_attn3_cuda_0f52d9d
3
- ops = torch.ops._flash_attn3_cuda_0f52d9d
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_flash_attn3_cuda_0f52d9d::{op_name}"
 
1
  import torch
2
+ from . import _flash_attn3_cuda_47281f5
3
+ ops = torch.ops._flash_attn3_cuda_47281f5
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_flash_attn3_cuda_47281f5::{op_name}"
build/torch-stable-abi29-cu130-x86_64-linux/flash_attn3/__init__.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ctypes
2
+ import importlib.util
3
+ import sys
4
+ from pathlib import Path
5
+ from types import ModuleType
6
+
7
+
8
+ def _import_from_path(file_path: Path) -> ModuleType:
9
+ # We cannot use the module name as-is, after adding it to `sys.modules`,
10
+ # it would also be used for other imports. So, we make a module name that
11
+ # depends on the path for it to be unique using the hex-encoded hash of
12
+ # the path.
13
+ path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
14
+ module_name = path_hash
15
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
16
+ if spec is None:
17
+ raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
18
+ module = importlib.util.module_from_spec(spec)
19
+ if module is None:
20
+ raise ImportError(f"Cannot load module {module_name} from spec")
21
+ sys.modules[module_name] = module
22
+ spec.loader.exec_module(module) # type: ignore
23
+ return module
24
+
25
+
26
+ globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
build/torch-stable-abi29-cu130-x86_64-linux/metadata.json CHANGED
@@ -1,10 +1,9 @@
1
  {
2
  "name": "flash-attn3",
3
- "id": "_flash_attn3_cuda_0f52d9d",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
7
- "kernel-depends": [],
8
  "backend": {
9
  "type": "cuda",
10
  "archs": [
@@ -16,21 +15,11 @@
16
  "algorithm": "sha256",
17
  "files": {
18
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
19
- "_flash_attn3_cuda_0f52d9d.abi3.so": "Pn5xeKjQxn4ZcQG0oNUpg6SJHQ5LlwMWWC9NN937G6w=",
20
- "_ops.py": "skEK8ihOH71VCjft8pGBiJcdk5CRvJWcb81mL7YyQQQ=",
 
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
24
- },
25
- "provenance": {
26
- "kernel-builder": {
27
- "version": "0.17.0-dev0",
28
- "commit": "081dcd473f8eca27226eef1f9c47c45b86c756b5",
29
- "dirty": false
30
- },
31
- "kernel": {
32
- "commit": "0f52d9d81c14d81c1d5bbde875c3d85b0fa37cc7",
33
- "dirty": false
34
- }
35
  }
36
  }
 
1
  {
2
  "name": "flash-attn3",
3
+ "id": "_flash_attn3_cuda_47281f5",
4
  "version": 1,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
 
7
  "backend": {
8
  "type": "cuda",
9
  "archs": [
 
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "KXVmQJM+KhWc2UqWJesupCaP+mqAvTx7yGueFATglHE=",
18
+ "_flash_attn3_cuda_47281f5.abi3.so": "/oCXCS/T+XELdmtBjWFtk4JPloLJzYqKt9WrmHQ0BdQ=",
19
+ "_ops.py": "qhazHfRzv7OkC0vnHustj4UksH6An4mU8dLo91m2ziQ=",
20
+ "flash_attn3/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
21
  "flash_attn_config.py": "uxo+eyMcDit//8YDaS4Rtk5BTMKzTSK9tOKTjdWVe/w=",
22
  "flash_attn_interface.py": "y0bD2JYGMFgX6iDre3zJN2sBPuq/12N6Mo55Z+HQCNQ="
23
  }
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
  }
build/torch-stable-abi29-cu130-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHSTCCBtCgAwIBAgIUEShlgJwi8L+3RbEuEO6vTkbvLzUwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MjAxMzA1WhcNMjYwODI3MjAyMzA1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6EMV+p7AvrpSZ6Xpoj73ACLrTw8mDkv3Ubazj5SLdwZoB9L2P+wKG3bnqeDcefQKXUQy2ed3FUm/y3lKwUvAc6OCBe8wggXrMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUUZlbsXQR0Tl4tyhrbxv3tr45mrcwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoMGY1MmQ5ZDgxYzE0ZDgxYzFkNWJiZGU4NzVjM2Q4NWIwZmEzN2NjNzAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDBmNTJkOWQ4MWMxNGQ4MWMxZDViYmRlODc1YzNkODViMGZhMzdjYzcwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwODkxNTM1MjgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoETazxEAAAQDAEYwRAIgGVcfvpNb4q9kttyXZpEKjD/nYTtR7UFzRGrXbbnOeDkCIBU5XcJTKSS1JyOsl8/vNVYbDSDCyxiiBYdfUBn05Ze1MAoGCCqGSM49BAMDA2cAMGQCMBW3hIfWGN0Ct6RcjHhqtMUGOcZ8bTAhWr4HDmQduZE5eHGOK+IuCUtz2TRGexPVnwIwRFbo6bSab8GUg2B3DRFDGxkjKeYJ14w1qj16iUW+8n3NdHmkEPaAo8TS4uqfdoKo"}, "tlogEntries":[{"logIndex":"2618837112", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787861585", "inclusionPromise":{"signedEntryTimestamp":"MEQCIDbxp0zS858yU8meowxp/LSkbxI2dmvw/rm3dJT1rI+KAiBDd4hpfifIx+LOEU37XqqBwuqJ/HA2WPlE+gZD9VL9SQ=="}, "inclusionProof":{"logIndex":"2496932850", "rootHash":"2T3dy5dbShO24qI1pPbx+iFq2dmcvNZLjEsyplVyXSc=", "treeSize":"2496932851", "hashes":["2S3YyHDfwX7jc/Nr+CStdmNtxhX8IP/6HUTLxaukqGw=", "6wGz4lftE9E5iryFHtsV2WzeWG2SD7O9zd43s1Kxbuw=", "uB+z7Dck/2UKAnnprryhNGZQqiP8xObhgGG5budOmPE=", "ZZ7A0WF9TrltVaS1UL4yUsFfHXtS0cPB4Xg3ZPYT2tI=", "XHtByHTOI8DrY/YiGKUiyoMaLwC4vUQnDpJz0DsOfrc=", "KU/5qTnchtfh+lVBmpgbwGtW8za9KWOF/uDiYFDghnM=", "w3HaAreLxIokmrX0CllDsJ79U/1ZwiMcb0pebOjkT54=", "JQiuQMw8M2FbRIlsChY2u6mqTNQNFORoEICw/YpOWXs=", "7miArd4rv5JDTAL0CrXluOO1cZ6JqCt31WwycaYdKs8=", "LyTvxBbtFt2C77xSe3YHWz88fi+OwkikHvRTXNyMCV8=", "oXpZdinIWOxn8d4g/7Q6OdCals+/SNep+Ou+M4o98Q8=", "QutiLOAfQukwHVQ717gM+94FF/5Giel82kbXkTx/F8w=", "7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=", "0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2496932851\n2T3dy5dbShO24qI1pPbx+iFq2dmcvNZLjEsyplVyXSc=\n\n— rekor.sigstore.dev wNI9ajBEAiAq71f4G9BQ0U+Q32t05GBC/rGLVnbbiWIF0oWaAk3PQQIgAy1eq31lYE4I32A5Jx1o3/sZrfgIyNCYiBNbs15xH5Y=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyNmNjYjM4MjM2NTk2ZTRhNTNiZmYxZWNjOTJkYmQ2YzYxZTdkYzFkNWNmZTZjMDgxOGQ4MWVlNmQ5ZWI3ZWNjIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRVpsOE81alRWQTFxai9CcHJzOVhXTmJOMnFxYTEyelZzYkRna29vMXlPa0FpRUEzSWNNZkRwSmhUWndwYXNHaHVCU2drN2wvWmJKaTV5ckdwRDJhYkdLdENnPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRWRU5EUW5SRFowRjNTVUpCWjBsVlJWTm9iR2RLZDJrNFRDc3pVbUpGZFVWUE5uWlVhMkoyVEhwVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTmFrRjRUWHBCTVZkb1kwNU5hbGwzVDBSSk0wMXFRWGxOZWtFeFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVUyUlUxV0szQTNRWFp5Y0ZOYU5saHdiMm8zTTBGRFRISlVkemh0Ukd0Mk0xVmlZWG9LYWpWVFRHUjNXbTlDT1V3eVVDdDNTMGN6WW01eFpVUmpaV1pSUzFoVlVYa3laV1F6UmxWdEwza3piRXQzVlhaQll6WlBRMEpsT0hkbloxaHlUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZWV214aUNuTllVVkl3Vkd3MGRIbG9jbUo0ZGpOMGNqUTFiWEpqZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU5SMWt4VFcxUk5WcEVaM2haZWtVd1drUm5lRmw2Um10T1YwcHBDbHBIVlRST2VsWnFUVEpSTkU1WFNYZGFiVVY2VGpKT2FrNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDFIV1RGTmJWRTFXa1JuZUZsNlJUQmFSR2Q0V1hwR2EwNVhTbWxhUjFVMFRucFdhazB5VVRRS1RsZEpkMXB0UlhwT01rNXFUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDFIV1RGTmJWRTFXa1JuZUZsNlJUQmFSR2Q0V1hwR2EwNVhTbWtLV2tkVk5FNTZWbXBOTWxFMFRsZEpkMXB0UlhwT01rNXFUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUkNiVTVVU21zS1QxZFJORTFYVFhoT1IxRTBUVmROZUZwRVZtbFpiVkpzVDBSak1WbDZUbXRQUkZacFRVZGFhRTE2WkdwWmVtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1QwUnJlRTVVVFRGTmFtZDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwVVZsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTTjBKSWEwRUtaSGRDTVVGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZWR0Y2ZUVWQlFVRlJSQXBCUlZsM1VrRkpaMGRXWTJaMmNFNWlOSEU1YTNSMGVWaGFjRVZMYWtRdmJsbFVkRkkzVlVaNlVrZHlXR0ppYms5bFJHdERTVUpWTlZoalNsUkxVMU14Q2twNVQzTnNPQzkyVGxaWllrUlRSRU41ZUdscFFsbGtabFZDYmpBMVdtVXhUVUZ2UjBORGNVZFRUVFE1UWtGTlJFRXlZMEZOUjFGRFRVSlhNMmhKWmxjS1IwNHdRM1EyVW1OcVNHaHhkRTFWUjA5aldqaGlWRUZvVjNJMFNFUnRVV1IxV2tVMVpVaEhUMHNyU1hWRFZYUjZNbFJTUjJWNFVGWnVkMGwzVWtaaWJ3bzJZbE5oWWpoSFZXY3lRak5FVWtaRVIzaHJha3RsV1VveE5IY3hjV294Tm1sVlZ5czRiak5PWkVodGEwVlFZVUZ2T0ZSVE5IVnhabVJ2UzI4S0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgvG2pKnxI0vP1eHVsaKVWPqK45+/UddSASpaKBpNMonoCFHl1f7zZGNcAJg7GJnhUl8Rr8/ySGA8yMDI2MDgyNzIwMTMwNVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdwwggHYAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI3MjAxMzA1WjAvBgkqhkiG9w0BCQQxIgQgLaPHorvVHIXXA1cFp2zQ1IsA650w30+aWUYprjbc5UcwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGgwZgIxAOxD/fFPKglDwbpyFww9JHRR72WZzgAsjNNbxBTathxmKxlyUGJTFmsim+wNpMMExgIxAMqjqu8U5Ira/TAPtL8wznOH6hXV6ArTuJNJUwo7Np2UTGQRqExZrIkeaKuXap/78w=="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"JsyzgjZZbkpTv/HsyS29bGHn3B1c/mwIGNge5tnrfsw="}, "signature":"MEUCIEZl8O5jTVA1qj/Bprs9XWNbN2qqa12zVsbDgkoo1yOkAiEA3IcMfDpJhTZwpasGhuBSgk7l/ZbJi5yrGpD2abGKtCg="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"1973428852","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1782518631","inclusionPromise":{"signedEntryTimestamp":"MEUCIAS3s8htVd+GX3fP6Q7RuA2O12ZG+QpzszqvkkfHn9/TAiEA6lVpnaLE3s7g+1RhhGSXgjdeiSCWqhWmGIVqWPTWmRU="},"inclusionProof":{"logIndex":"1851524590","rootHash":"KRlv4WOEhLGAxq3A0N8oS9IuTtyJm12HYniu4fKYfVI=","treeSize":"1851524613","hashes":["sL0IJgfUqJQu2yO/Fpy6EvV+XmkKJMw/4yb3wv5Yl7o=","LLTP/KG/hPqUPc8mxkPpJSHokS5C1o5T/ssOWM52aD8=","fzVmNZP+V12JAmY/o1JEY4g2YMNGReiF/s8NG+mE2gI=","aJ/5ZezFSaqxg2fX3GtgDu9ju+lpi3IM0ll07NXPVPY=","6/Ff8Rzz2rlFBGgCg4Cr7g4WmjCJkX0CJXeUqa4Mqrw=","Ip17Q8kGzrvGkfCNTaLKtzPnoeO6ep3QizuEWn09KTY=","vYyv1S6sndj979YuON1/iIs0bR6ULdfXr8/qCCSMLEo=","D7KryKA++QXmfrwCETdnsxZiy6gwMgGzvbDJZYmHQbA=","Wdllnp8SId/YtRn3pOdAK4C/ZxhU7UGY5BwhSftyuX0=","X7GxOYZ+uCUysb9vCYUNmNq8IOFSCrY2GZl9x9qRO+I=","oJjTWHTqS/TUyXxNmX3wlyDZsnTxxJeLd1N81BbJN9Q=","KWE0KrOJD/Dq7DkhL1da9kPDp72uQzyG7H1rUNKjhSE=","F/E+IBLEkJoA0SxKVYMfSDV1fewa94v46ZNBuuH5NNg=","XlI4aVuorCLlTnjn2TYC/z1MnWgASm+mgSvhh6NUwn0=","YIvmYTmatT5c8GJFUcC+FIN+astoVJW85SRS23hm6K0=","5SicDVFW/8/mpbov3/7HmgjUm4Z/ok9MDfkpyklk/zc=","zBViQsza/o62MhKl7o4JWnBX2kwGEPVYEl7i+HPv9MA=","NDIRlqxO0IaGr94q86MIU7VCAN3yEEgOHS4loya5lu4=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1851524613\nKRlv4WOEhLGAxq3A0N8oS9IuTtyJm12HYniu4fKYfVI=\n\n— rekor.sigstore.dev wNI9ajBEAiAO2K5Fnyp7YVBEfgS4nYWB28POx3IN8M9kWknIvZF4MgIgVVHsoB7k7wld7tvpuM+eIIL234lgnGevFnzCMmUhsFE=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzYzgyMDUxZDBjZWU1NWU0ZjQ4NGZiNTJlOGM3M2JkNDdlOGI2YzU0ODkyZGVmNjFmYzZhNzJkYWZkY2VjNWQxIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJSEZkTmd0UTN1aW85QWZobXlEekNBOW9Ec2l5WVpXdjFnanozU1ROK2JjTUFpRUFyQ3huajZYT3l3NnYxSlB3NFYyL056L3JzaERNVTZXUnpHOUliVy9qQ1FFPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVWRU5EUW5STFowRjNTVUpCWjBsVlExVjFaa3RyUVc5dlJFaFBjazU2ZUd0NGVHaHBXR3BRVGxFNGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxU1ROTlJFRjNUWHBWZDFkb1kwNU5hbGwzVG1wSk0wMUVRWGhOZWxWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZEVWpSRE5rRlNUR2cxVlhKek9VMHlVbkY0SzI1YWREQk9MMUJSYmxaYWJ6WTVkVWdLVTBob1IwY3hUa3RrWVd3d1REUXplbXhLTm1wVlpuUnlVR0ZLWkZnNWNXVTNSbmg0UjJWRGFqRXJXbTFXSzJKa1FtRlBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZNVkRoMkNucG9hekpCWjAxWk5rUXdZVTR6TVdFM2VVNXdhVEZ2ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU9SR041VDBSR2JVNVVWVFZPYWsxNVRWZEdiRTVxWXpGT1JHeHBDbHBYU1hsYVJFcG9XV3BGTTA1SFVtcFpWRlY0VFdwbk1rNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2xhVjBsNVdrUkthRmxxUlRNS1RrZFNhbGxVVlhoTmFtY3lUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDVFWTNsUFJFWnRUbFJWTlU1cVRYbE5WMFpzVG1wak1VNUViR2tLV2xkSmVWcEVTbWhaYWtVelRrZFNhbGxVVlhoTmFtY3lUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUlJNMDFxWjNnS1dtcFZNVTlVV1hwTmFrWm9XbFJaTTA1VVVUVlpiVlpwVFcxUmVWbFhTWGhPZWxKcldUSkZNVTFVU1RST2FtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOYW1kNVRsUkZNMDFFUVhkT1ZFMTJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtNTNXbXA1YURSQlFVRlJSQXBCUldkM1VtZEphRUZMZDBOdU9UVkJZa00yTW05dFJEUlZMMHhLWjJwQ1NVUm9OV0Z6YjNCdVJGbG1VVTR4VEN0dmFVcGFRV2xGUVhFMGFuZElkVzh5Q2tkdFEwRktSMllySzJ0V1IxZzBlSGRDYURsRlNYVmpNbk12V21wdk1VRlFWRWQzZDBObldVbExiMXBKZW1vd1JVRjNUVVJoVVVGM1dtZEplRUZKUVVJS1pWVTBaazB2YzAxT04wNHhVMk0wVTJaRU5Fd3lSSFJHVG1OdGFVVm5TVnBaYzBjeGFXSXZibVJHY2xFeFpVMWpWa1ZEYjBsVFZISmtVak12YVdkSmVBcEJUVGR1VWpWM016VnRUa3RyY2xnMU0ydDZhMHc0TVRVMk1qWmpiMUIyVEVGQmEwTmhjVEZNVW1abE1rSmlRbU5pUVZCUVZXcFVOVkpCYWs1TE5YUmlDalozUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyzADAgEAMIICwgYJKoZIhvcNAQcCoIICszCCAq8CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg8mGP/IqUe8x74yCCynLAgqYoxgwolx+7DrFAkyXen8MCFQDHHI7t6iH+vS5N9Uszi3FFBNcjqRgPMjAyNjA2MjcwMDAzNTFaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHcMIIB2AIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYyNzAwMDM1MVowLwYJKoZIhvcNAQkEMSIEIG1u3VWiZMabpL3Ee6OkFVaZFIYFgQZDXI+JrRucMoWSMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRoMGYCMQDW8/Yg08mM8jDZauSuF9UGc1pCBj625v44MIpJMdpLFuS+StfJ3BmJQ9RvtLXhmxQCMQDnf9p5qVhkCIVFm13xgzOrrAInSlX2SkTtBPdvk2JzspLGp0/vOrYDyJqO2OpEVEE="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"PIIFHQzuVeT0hPtS6Mc71H6LbFSJLe9h/Gpy2v3OxdE="},"signature":"MEUCIHFdNgtQ3uio9AfhmyDzCA9oDsiyYZWv1gjz3STN+bcMAiEArCxnj6XOyw6v1JPw4V2/Nz/rshDMU6WRzG9IbW/jCQE="}}