commit 4bde241d1cb2e1990fcdfb939ecd9f41a2f186be74ebf3c275247817cbf6d97a Author: Matej Cepl Date: Fri Aug 15 14:16:06 2025 +0000 - Update to 3.14.0~rc2: - Library - gh-137426: Remove the code deprecation of importlib.abc.ResourceLoader. It is documented as deprecated, but left for backwards compatibility with other classes in importlib.abc. - gh-137282: Fix tab completion and dir() on concurrent.futures. - gh-137257: Bump the version of pip bundled in ensurepip to version 25.2 - gh-137226: Fix behavior of annotationlib.ForwardRef.evaluate() when the type_params parameter is passed and the name of a type param is also present in an enclosing scope. - gh-130522: Fix unraisable TypeError raised during interpreter shutdown in the threading module. - gh-137059: Fix handling of file URLs with a Windows drive letter in the URL authority by urllib.request.url2pathname(). This fixes a regression in earlier pre-releases of Python 3.14. - gh-130577: tarfile now validates archives to ensure member offsets are non-negative. (Contributed by Alexander Enrique Urieles Nieto in gh-130577; CVE-2025-8194, bsc#1247249). - gh-135228: When dataclasses replaces a class with a slotted dataclass, the original class can now be garbage collected again. Earlier changes in Python 3.14 caused this class to always remain in existence together with the replacement class synthesized by dataclasses. - Documentation - gh-136155: We are now checking for fatal errors in EPUB OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python314?expand=0&rev=91 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch b/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch new file mode 100644 index 0000000..d687e02 --- /dev/null +++ b/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch @@ -0,0 +1,73 @@ +--- + Lib/test/test_pyexpat.py | 4 ++++ + Lib/test/test_sax.py | 3 +++ + Lib/test/test_xml_etree.py | 10 ++++++++++ + 3 files changed, 17 insertions(+) + +Index: Python-3.14.0b4/Lib/test/test_pyexpat.py +=================================================================== +--- Python-3.14.0b4.orig/Lib/test/test_pyexpat.py 2025-07-09 07:53:01.180304305 +0200 ++++ Python-3.14.0b4/Lib/test/test_pyexpat.py 2025-07-09 07:55:44.221539903 +0200 +@@ -791,6 +791,10 @@ + self.assertEqual(started, ['doc']) + + def test_reparse_deferral_disabled(self): ++ if expat.version_info < (2, 6, 0): ++ self.skipTest(f'Expat {expat.version_info} does not ' ++ 'support reparse deferral') ++ + started = [] + + def start_element(name, _): +Index: Python-3.14.0b4/Lib/test/test_sax.py +=================================================================== +--- Python-3.14.0b4.orig/Lib/test/test_sax.py 2025-07-09 07:53:01.235965215 +0200 ++++ Python-3.14.0b4/Lib/test/test_sax.py 2025-07-09 07:55:44.222266328 +0200 +@@ -1241,6 +1241,9 @@ + + self.assertEqual(result.getvalue(), start + b"") + ++ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), ++ f'Expat {pyexpat.version_info} does not ' ++ 'support reparse deferral') + def test_flush_reparse_deferral_disabled(self): + result = BytesIO() + xmlgen = XMLGenerator(result) +Index: Python-3.14.0b4/Lib/test/test_xml_etree.py +=================================================================== +--- Python-3.14.0b4.orig/Lib/test/test_xml_etree.py 2025-07-09 07:53:01.649732434 +0200 ++++ Python-3.14.0b4/Lib/test/test_xml_etree.py 2025-07-09 07:55:44.223264648 +0200 +@@ -138,6 +138,11 @@ + return mock.patch.object(cls, "__eq__", autospec=True, wraps=eq) + + ++IS_SLE_15_7 = os.environ.get("SLE_VERSION", "") == "0150700" ++fails_with_expat_2_6_0 = (unittest.expectedFailure ++ # 2.4 version patched in SLE ++ if IS_SLE_15_7 and pyexpat.version_info >= (2, 4, 0) else ++ lambda test: test) + def checkwarnings(*filters, quiet=False): + def decorator(test): + def newtest(*args, **kwargs): +@@ -1547,9 +1552,11 @@ + self.assert_event_tags(parser, [('end', 'root')]) + self.assertIsNone(parser.close()) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_1(self): + self.test_simple_xml(chunk_size=1, flush=True) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_5(self): + self.test_simple_xml(chunk_size=5, flush=True) + +@@ -1774,6 +1781,9 @@ + + self.assert_event_tags(parser, [('end', 'doc')]) + ++ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), ++ f'Expat {pyexpat.version_info} does not ' ++ 'support reparse deferral') + def test_flush_reparse_deferral_disabled(self): + parser = ET.XMLPullParser(events=('start', 'end')) + diff --git a/CVE-2025-4516-DecodeError-handler.patch b/CVE-2025-4516-DecodeError-handler.patch new file mode 100644 index 0000000..1aafbf7 --- /dev/null +++ b/CVE-2025-4516-DecodeError-handler.patch @@ -0,0 +1,480 @@ +From 3a939ff2298d147459116f98a09549d0f1954039 Mon Sep 17 00:00:00 2001 +From: Serhiy Storchaka +Date: Tue, 4 Feb 2025 11:44:39 +0200 +Subject: Fix use-after-free in the unicode-escape decoder with error handler + +If the error handler is used, a new bytes object is created to set as +the object attribute of UnicodeDecodeError, and that bytes object then +replaces the original data. A pointer to the decoded data will became invalid +after destroying that temporary bytes object. So we need other way to return +the first invalid escape from _PyUnicode_DecodeUnicodeEscapeInternal(). + +_PyBytes_DecodeEscape() does not have such issue, because it does not +use the error handlers registry, but it should be changed for compatibility +with _PyUnicode_DecodeUnicodeEscapeInternal(). +--- + Include/internal/pycore_bytesobject.h | 5 + Include/internal/pycore_unicodeobject.h | 12 +- + Lib/test/test_codeccallbacks.py | 39 +++++++ + Lib/test/test_codecs.py | 52 ++++++++-- + Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst | 2 + Objects/bytesobject.c | 41 ++++--- + Objects/unicodeobject.c | 46 +++++--- + Parser/string_parser.c | 26 +++-- + 8 files changed, 160 insertions(+), 63 deletions(-) + +Index: Python-3.14.0b1/Include/internal/pycore_bytesobject.h +=================================================================== +--- Python-3.14.0b1.orig/Include/internal/pycore_bytesobject.h 2025-05-06 15:33:52.000000000 +0000 ++++ Python-3.14.0b1/Include/internal/pycore_bytesobject.h 2025-05-17 06:44:53.614667081 +0000 +@@ -20,8 +20,9 @@ + + // Helper for PyBytes_DecodeEscape that detects invalid escape chars. + // Export for test_peg_generator. +-PyAPI_FUNC(PyObject*) _PyBytes_DecodeEscape(const char *, Py_ssize_t, +- const char *, const char **); ++PyAPI_FUNC(PyObject*) _PyBytes_DecodeEscape2(const char *, Py_ssize_t, ++ const char *, ++ int *, const char **); + + + // Substring Search. +Index: Python-3.14.0b1/Include/internal/pycore_unicodeobject.h +=================================================================== +--- Python-3.14.0b1.orig/Include/internal/pycore_unicodeobject.h 2025-05-06 15:33:52.000000000 +0000 ++++ Python-3.14.0b1/Include/internal/pycore_unicodeobject.h 2025-05-17 06:44:53.614817134 +0000 +@@ -139,14 +139,18 @@ + // Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape + // chars. + // Export for test_peg_generator. +-PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal( ++PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal2( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed, /* bytes consumed */ +- const char **first_invalid_escape); /* on return, points to first +- invalid escaped char in +- string. */ ++ int *first_invalid_escape_char, /* on return, if not -1, contain the first ++ invalid escaped char (<= 0xff) or invalid ++ octal escape (> 0xff) in string. */ ++ const char **first_invalid_escape_ptr); /* on return, if not NULL, may ++ point to the first invalid escaped ++ char in string. ++ May be NULL if errors is not NULL. */ + + /* --- Raw-Unicode-Escape Codecs ---------------------------------------------- */ + +Index: Python-3.14.0b1/Lib/test/test_codeccallbacks.py +=================================================================== +--- Python-3.14.0b1.orig/Lib/test/test_codeccallbacks.py 2025-05-17 06:44:47.673341939 +0000 ++++ Python-3.14.0b1/Lib/test/test_codeccallbacks.py 2025-05-17 06:44:53.615018793 +0000 +@@ -2,6 +2,7 @@ + import codecs + import html.entities + import itertools ++import re + import sys + import unicodedata + import unittest +@@ -1125,7 +1126,7 @@ + text = 'abcghi'*n + text.translate(charmap) + +- def test_mutatingdecodehandler(self): ++ def test_mutating_decode_handler(self): + baddata = [ + ("ascii", b"\xff"), + ("utf-7", b"++"), +@@ -1160,6 +1161,42 @@ + for (encoding, data) in baddata: + self.assertEqual(data.decode(encoding, "test.mutating"), "\u4242") + ++ def test_mutating_decode_handler_unicode_escape(self): ++ decode = codecs.unicode_escape_decode ++ def mutating(exc): ++ if isinstance(exc, UnicodeDecodeError): ++ r = data.get(exc.object[:exc.end]) ++ if r is not None: ++ exc.object = r[0] + exc.object[exc.end:] ++ return ('\u0404', r[1]) ++ raise AssertionError("don't know how to handle %r" % exc) ++ ++ codecs.register_error('test.mutating2', mutating) ++ data = { ++ br'\x0': (b'\\', 0), ++ br'\x3': (b'xxx\\', 3), ++ br'\x5': (b'x\\', 1), ++ } ++ def check(input, expected, msg): ++ with self.assertWarns(DeprecationWarning) as cm: ++ self.assertEqual(decode(input, 'test.mutating2'), (expected, len(input))) ++ self.assertIn(msg, str(cm.warning)) ++ ++ check(br'\x0n\z', '\u0404\n\\z', r'"\z" is an invalid escape sequence') ++ check(br'\x0n\501', '\u0404\n\u0141', r'"\501" is an invalid octal escape sequence') ++ check(br'\x0z', '\u0404\\z', r'"\z" is an invalid escape sequence') ++ ++ check(br'\x3n\zr', '\u0404\n\\zr', r'"\z" is an invalid escape sequence') ++ check(br'\x3zr', '\u0404\\zr', r'"\z" is an invalid escape sequence') ++ check(br'\x3z5', '\u0404\\z5', r'"\z" is an invalid escape sequence') ++ check(memoryview(br'\x3z5x')[:-1], '\u0404\\z5', r'"\z" is an invalid escape sequence') ++ check(memoryview(br'\x3z5xy')[:-2], '\u0404\\z5', r'"\z" is an invalid escape sequence') ++ ++ check(br'\x5n\z', '\u0404\n\\z', r'"\z" is an invalid escape sequence') ++ check(br'\x5n\501', '\u0404\n\u0141', r'"\501" is an invalid octal escape sequence') ++ check(br'\x5z', '\u0404\\z', r'"\z" is an invalid escape sequence') ++ check(memoryview(br'\x5zy')[:-1], '\u0404\\z', r'"\z" is an invalid escape sequence') ++ + # issue32583 + def test_crashing_decode_handler(self): + # better generating one more character to fill the extra space slot +Index: Python-3.14.0b1/Lib/test/test_codecs.py +=================================================================== +--- Python-3.14.0b1.orig/Lib/test/test_codecs.py 2025-05-17 06:44:47.696604117 +0000 ++++ Python-3.14.0b1/Lib/test/test_codecs.py 2025-05-17 06:44:53.615449954 +0000 +@@ -1196,23 +1196,39 @@ + check(br"[\1010]", b"[A0]") + check(br"[\x41]", b"[A]") + check(br"[\x410]", b"[A0]") ++ ++ def test_warnings(self): ++ decode = codecs.escape_decode ++ check = coding_checker(self, decode) + for i in range(97, 123): + b = bytes([i]) + if b not in b'abfnrtvx': +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%c" is an invalid escape sequence' % i): + check(b"\\" + b, b"\\" + b) +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%c" is an invalid escape sequence' % (i-32)): + check(b"\\" + b.upper(), b"\\" + b.upper()) +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\8" is an invalid escape sequence'): + check(br"\8", b"\\8") + with self.assertWarns(DeprecationWarning): + check(br"\9", b"\\9") +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\\xfa" is an invalid escape sequence') as cm: + check(b"\\\xfa", b"\\\xfa") + for i in range(0o400, 0o1000): +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%o" is an invalid octal escape sequence' % i): + check(rb'\%o' % i, bytes([i & 0o377])) + ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\z" is an invalid escape sequence'): ++ self.assertEqual(decode(br'\x\z', 'ignore'), (b'\\z', 4)) ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\501" is an invalid octal escape sequence'): ++ self.assertEqual(decode(br'\x\501', 'ignore'), (b'A', 6)) ++ + def test_errors(self): + decode = codecs.escape_decode + self.assertRaises(ValueError, decode, br"\x") +@@ -2661,24 +2677,40 @@ + check(br"[\x410]", "[A0]") + check(br"\u20ac", "\u20ac") + check(br"\U0001d120", "\U0001d120") ++ ++ def test_decode_warnings(self): ++ decode = codecs.unicode_escape_decode ++ check = coding_checker(self, decode) + for i in range(97, 123): + b = bytes([i]) + if b not in b'abfnrtuvx': +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%c" is an invalid escape sequence' % i): + check(b"\\" + b, "\\" + chr(i)) + if b.upper() not in b'UN': +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%c" is an invalid escape sequence' % (i-32)): + check(b"\\" + b.upper(), "\\" + chr(i-32)) +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\8" is an invalid escape sequence'): + check(br"\8", "\\8") + with self.assertWarns(DeprecationWarning): + check(br"\9", "\\9") +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\\xfa" is an invalid escape sequence') as cm: + check(b"\\\xfa", "\\\xfa") + for i in range(0o400, 0o1000): +- with self.assertWarns(DeprecationWarning): ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\%o" is an invalid octal escape sequence' % i): + check(rb'\%o' % i, chr(i)) + ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\z" is an invalid escape sequence'): ++ self.assertEqual(decode(br'\x\z', 'ignore'), ('\\z', 4)) ++ with self.assertWarnsRegex(DeprecationWarning, ++ r'"\\501" is an invalid octal escape sequence'): ++ self.assertEqual(decode(br'\x\501', 'ignore'), ('\u0141', 6)) ++ + def test_decode_errors(self): + decode = codecs.unicode_escape_decode + for c, d in (b'x', 2), (b'u', 4), (b'U', 4): +Index: Python-3.14.0b1/Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ Python-3.14.0b1/Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst 2025-05-17 06:44:53.615887918 +0000 +@@ -0,0 +1,2 @@ ++Fix use-after-free in the "unicode-escape" decoder with a non-"strict" error ++handler. +Index: Python-3.14.0b1/Objects/bytesobject.c +=================================================================== +--- Python-3.14.0b1.orig/Objects/bytesobject.c 2025-05-06 15:33:52.000000000 +0000 ++++ Python-3.14.0b1/Objects/bytesobject.c 2025-05-17 06:44:53.616354335 +0000 +@@ -1075,10 +1075,11 @@ + } + + /* Unescape a backslash-escaped string. */ +-PyObject *_PyBytes_DecodeEscape(const char *s, ++PyObject *_PyBytes_DecodeEscape2(const char *s, + Py_ssize_t len, + const char *errors, +- const char **first_invalid_escape) ++ int *first_invalid_escape_char, ++ const char **first_invalid_escape_ptr) + { + int c; + char *p; +@@ -1092,7 +1093,8 @@ + return NULL; + writer.overallocate = 1; + +- *first_invalid_escape = NULL; ++ *first_invalid_escape_char = -1; ++ *first_invalid_escape_ptr = NULL; + + end = s + len; + while (s < end) { +@@ -1130,9 +1132,10 @@ + c = (c<<3) + *s++ - '0'; + } + if (c > 0377) { +- if (*first_invalid_escape == NULL) { +- *first_invalid_escape = s-3; /* Back up 3 chars, since we've +- already incremented s. */ ++ if (*first_invalid_escape_char == -1) { ++ *first_invalid_escape_char = c; ++ /* Back up 3 chars, since we've already incremented s. */ ++ *first_invalid_escape_ptr = s - 3; + } + } + *p++ = c; +@@ -1173,9 +1176,10 @@ + break; + + default: +- if (*first_invalid_escape == NULL) { +- *first_invalid_escape = s-1; /* Back up one char, since we've +- already incremented s. */ ++ if (*first_invalid_escape_char == -1) { ++ *first_invalid_escape_char = (unsigned char)s[-1]; ++ /* Back up one char, since we've already incremented s. */ ++ *first_invalid_escape_ptr = s - 1; + } + *p++ = '\\'; + s--; +@@ -1195,18 +1199,19 @@ + Py_ssize_t Py_UNUSED(unicode), + const char *Py_UNUSED(recode_encoding)) + { +- const char* first_invalid_escape; +- PyObject *result = _PyBytes_DecodeEscape(s, len, errors, +- &first_invalid_escape); ++ int first_invalid_escape_char; ++ const char *first_invalid_escape_ptr; ++ PyObject *result = _PyBytes_DecodeEscape2(s, len, errors, ++ &first_invalid_escape_char, ++ &first_invalid_escape_ptr); + if (result == NULL) + return NULL; +- if (first_invalid_escape != NULL) { +- unsigned char c = *first_invalid_escape; +- if ('4' <= c && c <= '7') { ++ if (first_invalid_escape_char != -1) { ++ if (first_invalid_escape_char > 0xff) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, +- "b\"\\%.3s\" is an invalid octal escape sequence. " ++ "b\"\\%o\" is an invalid octal escape sequence. " + "Such sequences will not work in the future. ", +- first_invalid_escape) < 0) ++ first_invalid_escape_char) < 0) + { + Py_DECREF(result); + return NULL; +@@ -1216,7 +1221,7 @@ + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "b\"\\%c\" is an invalid escape sequence. " + "Such sequences will not work in the future. ", +- c) < 0) ++ first_invalid_escape_char) < 0) + { + Py_DECREF(result); + return NULL; +Index: Python-3.14.0b1/Objects/unicodeobject.c +=================================================================== +--- Python-3.14.0b1.orig/Objects/unicodeobject.c 2025-05-06 15:33:52.000000000 +0000 ++++ Python-3.14.0b1/Objects/unicodeobject.c 2025-05-17 06:44:53.617547540 +0000 +@@ -6621,13 +6621,15 @@ + /* --- Unicode Escape Codec ----------------------------------------------- */ + + PyObject * +-_PyUnicode_DecodeUnicodeEscapeInternal(const char *s, ++_PyUnicode_DecodeUnicodeEscapeInternal2(const char *s, + Py_ssize_t size, + const char *errors, + Py_ssize_t *consumed, +- const char **first_invalid_escape) ++ int *first_invalid_escape_char, ++ const char **first_invalid_escape_ptr) + { + const char *starts = s; ++ const char *initial_starts = starts; + _PyUnicodeWriter writer; + const char *end; + PyObject *errorHandler = NULL; +@@ -6635,7 +6637,8 @@ + _PyUnicode_Name_CAPI *ucnhash_capi; + + // so we can remember if we've seen an invalid escape char or not +- *first_invalid_escape = NULL; ++ *first_invalid_escape_char = -1; ++ *first_invalid_escape_ptr = NULL; + + if (size == 0) { + if (consumed) { +@@ -6723,9 +6726,12 @@ + } + } + if (ch > 0377) { +- if (*first_invalid_escape == NULL) { +- *first_invalid_escape = s-3; /* Back up 3 chars, since we've +- already incremented s. */ ++ if (*first_invalid_escape_char == -1) { ++ *first_invalid_escape_char = ch; ++ if (starts == initial_starts) { ++ /* Back up 3 chars, since we've already incremented s. */ ++ *first_invalid_escape_ptr = s - 3; ++ } + } + } + WRITE_CHAR(ch); +@@ -6820,9 +6826,12 @@ + goto error; + + default: +- if (*first_invalid_escape == NULL) { +- *first_invalid_escape = s-1; /* Back up one char, since we've +- already incremented s. */ ++ if (*first_invalid_escape_char == -1) { ++ *first_invalid_escape_char = c; ++ if (starts == initial_starts) { ++ /* Back up one char, since we've already incremented s. */ ++ *first_invalid_escape_ptr = s - 1; ++ } + } + WRITE_ASCII_CHAR('\\'); + WRITE_CHAR(c); +@@ -6867,19 +6876,20 @@ + const char *errors, + Py_ssize_t *consumed) + { +- const char *first_invalid_escape; +- PyObject *result = _PyUnicode_DecodeUnicodeEscapeInternal(s, size, errors, ++ int first_invalid_escape_char; ++ const char *first_invalid_escape_ptr; ++ PyObject *result = _PyUnicode_DecodeUnicodeEscapeInternal2(s, size, errors, + consumed, +- &first_invalid_escape); ++ &first_invalid_escape_char, ++ &first_invalid_escape_ptr); + if (result == NULL) + return NULL; +- if (first_invalid_escape != NULL) { +- unsigned char c = *first_invalid_escape; +- if ('4' <= c && c <= '7') { ++ if (first_invalid_escape_char != -1) { ++ if (first_invalid_escape_char > 0xff) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, +- "\"\\%.3s\" is an invalid octal escape sequence. " ++ "\"\\%o\" is an invalid octal escape sequence. " + "Such sequences will not work in the future. ", +- first_invalid_escape) < 0) ++ first_invalid_escape_char) < 0) + { + Py_DECREF(result); + return NULL; +@@ -6889,7 +6899,7 @@ + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "\"\\%c\" is an invalid escape sequence. " + "Such sequences will not work in the future. ", +- c) < 0) ++ first_invalid_escape_char) < 0) + { + Py_DECREF(result); + return NULL; +Index: Python-3.14.0b1/Parser/string_parser.c +=================================================================== +--- Python-3.14.0b1.orig/Parser/string_parser.c 2025-05-06 15:33:52.000000000 +0000 ++++ Python-3.14.0b1/Parser/string_parser.c 2025-05-17 06:44:53.618734552 +0000 +@@ -196,15 +196,18 @@ + len = (size_t)(p - buf); + s = buf; + +- const char *first_invalid_escape; +- v = _PyUnicode_DecodeUnicodeEscapeInternal(s, (Py_ssize_t)len, NULL, NULL, &first_invalid_escape); ++ int first_invalid_escape_char; ++ const char *first_invalid_escape_ptr; ++ v = _PyUnicode_DecodeUnicodeEscapeInternal2(s, (Py_ssize_t)len, NULL, NULL, ++ &first_invalid_escape_char, ++ &first_invalid_escape_ptr); + + // HACK: later we can simply pass the line no, since we don't preserve the tokens + // when we are decoding the string but we preserve the line numbers. +- if (v != NULL && first_invalid_escape != NULL && t != NULL) { +- if (warn_invalid_escape_sequence(parser, s, first_invalid_escape, t) < 0) { +- /* We have not decref u before because first_invalid_escape points +- inside u. */ ++ if (v != NULL && first_invalid_escape_ptr != NULL && t != NULL) { ++ if (warn_invalid_escape_sequence(parser, s, first_invalid_escape_ptr, t) < 0) { ++ /* We have not decref u before because first_invalid_escape_ptr ++ points inside u. */ + Py_XDECREF(u); + Py_DECREF(v); + return NULL; +@@ -217,14 +220,17 @@ + static PyObject * + decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t) + { +- const char *first_invalid_escape; +- PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape); ++ int first_invalid_escape_char; ++ const char *first_invalid_escape_ptr; ++ PyObject *result = _PyBytes_DecodeEscape2(s, len, NULL, ++ &first_invalid_escape_char, ++ &first_invalid_escape_ptr); + if (result == NULL) { + return NULL; + } + +- if (first_invalid_escape != NULL) { +- if (warn_invalid_escape_sequence(p, s, first_invalid_escape, t) < 0) { ++ if (first_invalid_escape_ptr != NULL) { ++ if (warn_invalid_escape_sequence(p, s, first_invalid_escape_ptr, t) < 0) { + Py_DECREF(result); + return NULL; + } diff --git a/CVE-2025-8194-tarfile-no-neg-offsets.patch b/CVE-2025-8194-tarfile-no-neg-offsets.patch new file mode 100644 index 0000000..d6ff6cd --- /dev/null +++ b/CVE-2025-8194-tarfile-no-neg-offsets.patch @@ -0,0 +1,212 @@ +From 28d130238bfb5604eef4b594d597f7b5ec951eba Mon Sep 17 00:00:00 2001 +From: Alexander Urieles +Date: Mon, 28 Jul 2025 17:37:26 +0200 +Subject: [PATCH] gh-130577: tarfile now validates archives to ensure member + offsets are non-negative (GH-137027) (cherry picked from commit + 7040aa54f14676938970e10c5f74ea93cd56aa38) + +Co-authored-by: Alexander Urieles +Co-authored-by: Gregory P. Smith +--- + Lib/tarfile.py | 3 + Lib/test/test_tarfile.py | 156 ++++++++++ + Misc/NEWS.d/next/Library/2025-07-23-00-35-29.gh-issue-130577.c7EITy.rst | 3 + 3 files changed, 162 insertions(+) + create mode 100644 Misc/NEWS.d/next/Library/2025-07-23-00-35-29.gh-issue-130577.c7EITy.rst + +Index: Python-3.14.0rc1/Lib/tarfile.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/tarfile.py 2025-08-01 22:10:15.833118580 +0200 ++++ Python-3.14.0rc1/Lib/tarfile.py 2025-08-01 22:10:21.970557323 +0200 +@@ -1647,6 +1647,9 @@ + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ ++ # Only non-negative offsets are allowed ++ if count < 0: ++ raise InvalidHeaderError("invalid offset") + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 +Index: Python-3.14.0rc1/Lib/test/test_tarfile.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/test/test_tarfile.py 2025-08-01 22:10:17.621793551 +0200 ++++ Python-3.14.0rc1/Lib/test/test_tarfile.py 2025-08-01 22:10:21.971238980 +0200 +@@ -55,6 +55,7 @@ + zstname = os.path.join(TEMPDIR, "testtar.tar.zst") + tmpname = os.path.join(TEMPDIR, "tmp.tar") + dotlessname = os.path.join(TEMPDIR, "testtar") ++SPACE = b" " + + sha256_regtype = ( + "e09e4bc8b3c9d9177e77256353b36c159f5f040531bbd4b024a8f9b9196c71ce" +@@ -4602,6 +4603,161 @@ + ar.extractall(self.testdir, filter='fully_trusted') + + ++class OffsetValidationTests(unittest.TestCase): ++ tarname = tmpname ++ invalid_posix_header = ( ++ # name: 100 bytes ++ tarfile.NUL * tarfile.LENGTH_NAME ++ # mode, space, null terminator: 8 bytes ++ + b"000755" + SPACE + tarfile.NUL ++ # uid, space, null terminator: 8 bytes ++ + b"000001" + SPACE + tarfile.NUL ++ # gid, space, null terminator: 8 bytes ++ + b"000001" + SPACE + tarfile.NUL ++ # size, space: 12 bytes ++ + b"\xff" * 11 + SPACE ++ # mtime, space: 12 bytes ++ + tarfile.NUL * 11 + SPACE ++ # chksum: 8 bytes ++ + b"0011407" + tarfile.NUL ++ # type: 1 byte ++ + tarfile.REGTYPE ++ # linkname: 100 bytes ++ + tarfile.NUL * tarfile.LENGTH_LINK ++ # magic: 6 bytes, version: 2 bytes ++ + tarfile.POSIX_MAGIC ++ # uname: 32 bytes ++ + tarfile.NUL * 32 ++ # gname: 32 bytes ++ + tarfile.NUL * 32 ++ # devmajor, space, null terminator: 8 bytes ++ + tarfile.NUL * 6 + SPACE + tarfile.NUL ++ # devminor, space, null terminator: 8 bytes ++ + tarfile.NUL * 6 + SPACE + tarfile.NUL ++ # prefix: 155 bytes ++ + tarfile.NUL * tarfile.LENGTH_PREFIX ++ # padding: 12 bytes ++ + tarfile.NUL * 12 ++ ) ++ invalid_gnu_header = ( ++ # name: 100 bytes ++ tarfile.NUL * tarfile.LENGTH_NAME ++ # mode, null terminator: 8 bytes ++ + b"0000755" + tarfile.NUL ++ # uid, null terminator: 8 bytes ++ + b"0000001" + tarfile.NUL ++ # gid, space, null terminator: 8 bytes ++ + b"0000001" + tarfile.NUL ++ # size, space: 12 bytes ++ + b"\xff" * 11 + SPACE ++ # mtime, space: 12 bytes ++ + tarfile.NUL * 11 + SPACE ++ # chksum: 8 bytes ++ + b"0011327" + tarfile.NUL ++ # type: 1 byte ++ + tarfile.REGTYPE ++ # linkname: 100 bytes ++ + tarfile.NUL * tarfile.LENGTH_LINK ++ # magic: 8 bytes ++ + tarfile.GNU_MAGIC ++ # uname: 32 bytes ++ + tarfile.NUL * 32 ++ # gname: 32 bytes ++ + tarfile.NUL * 32 ++ # devmajor, null terminator: 8 bytes ++ + tarfile.NUL * 8 ++ # devminor, null terminator: 8 bytes ++ + tarfile.NUL * 8 ++ # padding: 167 bytes ++ + tarfile.NUL * 167 ++ ) ++ invalid_v7_header = ( ++ # name: 100 bytes ++ tarfile.NUL * tarfile.LENGTH_NAME ++ # mode, space, null terminator: 8 bytes ++ + b"000755" + SPACE + tarfile.NUL ++ # uid, space, null terminator: 8 bytes ++ + b"000001" + SPACE + tarfile.NUL ++ # gid, space, null terminator: 8 bytes ++ + b"000001" + SPACE + tarfile.NUL ++ # size, space: 12 bytes ++ + b"\xff" * 11 + SPACE ++ # mtime, space: 12 bytes ++ + tarfile.NUL * 11 + SPACE ++ # chksum: 8 bytes ++ + b"0010070" + tarfile.NUL ++ # type: 1 byte ++ + tarfile.REGTYPE ++ # linkname: 100 bytes ++ + tarfile.NUL * tarfile.LENGTH_LINK ++ # padding: 255 bytes ++ + tarfile.NUL * 255 ++ ) ++ valid_gnu_header = tarfile.TarInfo("filename").tobuf(tarfile.GNU_FORMAT) ++ data_block = b"\xff" * tarfile.BLOCKSIZE ++ ++ def _write_buffer(self, buffer): ++ with open(self.tarname, "wb") as f: ++ f.write(buffer) ++ ++ def _get_members(self, ignore_zeros=None): ++ with open(self.tarname, "rb") as f: ++ with tarfile.open( ++ mode="r", fileobj=f, ignore_zeros=ignore_zeros ++ ) as tar: ++ return tar.getmembers() ++ ++ def _assert_raises_read_error_exception(self): ++ with self.assertRaisesRegex( ++ tarfile.ReadError, "file could not be opened successfully" ++ ): ++ self._get_members() ++ ++ def test_invalid_offset_header_validations(self): ++ for tar_format, invalid_header in ( ++ ("posix", self.invalid_posix_header), ++ ("gnu", self.invalid_gnu_header), ++ ("v7", self.invalid_v7_header), ++ ): ++ with self.subTest(format=tar_format): ++ self._write_buffer(invalid_header) ++ self._assert_raises_read_error_exception() ++ ++ def test_early_stop_at_invalid_offset_header(self): ++ buffer = self.valid_gnu_header + self.invalid_gnu_header + self.valid_gnu_header ++ self._write_buffer(buffer) ++ members = self._get_members() ++ self.assertEqual(len(members), 1) ++ self.assertEqual(members[0].name, "filename") ++ self.assertEqual(members[0].offset, 0) ++ ++ def test_ignore_invalid_archive(self): ++ # 3 invalid headers with their respective data ++ buffer = (self.invalid_gnu_header + self.data_block) * 3 ++ self._write_buffer(buffer) ++ members = self._get_members(ignore_zeros=True) ++ self.assertEqual(len(members), 0) ++ ++ def test_ignore_invalid_offset_headers(self): ++ for first_block, second_block, expected_offset in ( ++ ( ++ (self.valid_gnu_header), ++ (self.invalid_gnu_header + self.data_block), ++ 0, ++ ), ++ ( ++ (self.invalid_gnu_header + self.data_block), ++ (self.valid_gnu_header), ++ 1024, ++ ), ++ ): ++ self._write_buffer(first_block + second_block) ++ members = self._get_members(ignore_zeros=True) ++ self.assertEqual(len(members), 1) ++ self.assertEqual(members[0].name, "filename") ++ self.assertEqual(members[0].offset, expected_offset) ++ ++ + def setUpModule(): + os_helper.unlink(TEMPDIR) + os.makedirs(TEMPDIR) +Index: Python-3.14.0rc1/Misc/NEWS.d/next/Library/2025-07-23-00-35-29.gh-issue-130577.c7EITy.rst +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ Python-3.14.0rc1/Misc/NEWS.d/next/Library/2025-07-23-00-35-29.gh-issue-130577.c7EITy.rst 2025-08-01 22:10:21.971763003 +0200 +@@ -0,0 +1,3 @@ ++:mod:`tarfile` now validates archives to ensure member offsets are ++non-negative. (Contributed by Alexander Enrique Urieles Nieto in ++:gh:`130577`.) diff --git a/F00251-change-user-install-location.patch b/F00251-change-user-install-location.patch new file mode 100644 index 0000000..73eca58 --- /dev/null +++ b/F00251-change-user-install-location.patch @@ -0,0 +1,160 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= +Date: Mon, 15 Feb 2021 12:19:27 +0100 +Subject: [PATCH] 00251: Change user install location +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Set values of base and platbase in sysconfig from /usr +to /usr/local when RPM build is not detected +to make pip and similar tools install into separate location. + +Fedora Change: https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe +Downstream only. + +We've tried to rework in Fedora 36/Python 3.10 to follow https://bugs.python.org/issue43976 +but we have identified serious problems with that approach, +see https://bugzilla.redhat.com/2026979 or https://bugzilla.redhat.com/2097183 + +pypa/distutils integration: https://github.com/pypa/distutils/pull/70 + +Co-authored-by: Petr Viktorin +Co-authored-by: Miro Hrončok +Co-authored-by: Michal Cyprian +Co-authored-by: Lumír Balhar +--- + Lib/sysconfig/__init__.py | 51 ++++++++++++++++++++++++++++++++++++++++++++- + Lib/test/test_sysconfig.py | 17 +++++++++++++-- + 2 files changed, 65 insertions(+), 3 deletions(-) + +Index: Python-3.14.0b1/Lib/sysconfig/__init__.py +=================================================================== +--- Python-3.14.0b1.orig/Lib/sysconfig/__init__.py 2025-05-09 10:36:06.529281834 +0200 ++++ Python-3.14.0b1/Lib/sysconfig/__init__.py 2025-05-09 10:36:13.125444450 +0200 +@@ -106,6 +106,11 @@ + else: + _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv'] + ++# For a brief period of time in the Fedora 36 life cycle, ++# this installation scheme existed and was documented in the release notes. ++# For backwards compatibility, we keep it here (at least on 3.10 and 3.11). ++_INSTALL_SCHEMES['rpm_prefix'] = _INSTALL_SCHEMES['posix_prefix'] ++ + def _get_implementation(): + return 'Python' + +@@ -169,13 +174,28 @@ + }, + } + ++# This is used by distutils.command.install in the stdlib ++# as well as pypa/distutils (e.g. bundled in setuptools). ++# The self.prefix value is set to sys.prefix + /local/ ++# if neither RPM build nor virtual environment is ++# detected to make distutils install packages ++# into the separate location. ++# https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe ++if (not (hasattr(sys, 'real_prefix') or ++ sys.prefix != sys.base_prefix) and ++ 'RPM_BUILD_ROOT' not in os.environ): ++ _prefix_addition = '/local' ++ ++ + _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', + 'scripts', 'data') + + _PY_VERSION = sys.version.split()[0] + _PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}' + _PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}' ++_PREFIX = os.path.normpath(sys.prefix) + _BASE_PREFIX = os.path.normpath(sys.base_prefix) ++_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) + _BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) + # Mutex guarding initialization of _CONFIG_VARS. + _CONFIG_VARS_LOCK = threading.RLock() +@@ -268,11 +288,40 @@ + target_dict[key] = value + + ++_CONFIG_VARS_LOCAL = None ++ ++ ++def _config_vars_local(): ++ # This function returns the config vars with prefixes amended to /usr/local ++ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe ++ global _CONFIG_VARS_LOCAL ++ if _CONFIG_VARS_LOCAL is None: ++ _CONFIG_VARS_LOCAL = dict(get_config_vars()) ++ _CONFIG_VARS_LOCAL['base'] = '/usr/local' ++ _CONFIG_VARS_LOCAL['platbase'] = '/usr/local' ++ return _CONFIG_VARS_LOCAL ++ ++ + def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} +- _extend_dict(vars, get_config_vars()) ++ ++ # when we are not in a virtual environment or an RPM build ++ # we change '/usr' to '/usr/local' ++ # to avoid surprises, we explicitly check for the /usr/ prefix ++ # Python virtual environments have different prefixes ++ # we only do this for posix_prefix, not to mangle the venv scheme ++ # posix_prefix is used by sudo pip install ++ # we only change the defaults here, so explicit --prefix will take precedence ++ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe ++ if (scheme == 'posix_prefix' and ++ _PREFIX == '/usr' and ++ 'RPM_BUILD_ROOT' not in os.environ): ++ _extend_dict(vars, _config_vars_local()) ++ else: ++ _extend_dict(vars, get_config_vars()) ++ + if os.name == 'nt': + # On Windows we want to substitute 'lib' for schemes rather + # than the native value (without modifying vars, in case it +Index: Python-3.14.0b1/Lib/test/test_sysconfig.py +=================================================================== +--- Python-3.14.0b1.orig/Lib/test/test_sysconfig.py 2025-05-09 10:36:08.169776377 +0200 ++++ Python-3.14.0b1/Lib/test/test_sysconfig.py 2025-05-09 10:36:13.125842689 +0200 +@@ -132,8 +132,19 @@ + for scheme in _INSTALL_SCHEMES: + for name in _INSTALL_SCHEMES[scheme]: + expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars) ++ tested = get_path(name, scheme) ++ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe ++ if tested.startswith('/usr/local'): ++ # /usr/local should only be used in posix_prefix ++ self.assertEqual(scheme, 'posix_prefix') ++ # Fedora CI runs tests for venv and virtualenv that check for other prefixes ++ self.assertEqual(sys.prefix, '/usr') ++ # When building the RPM of Python, %check runs this with RPM_BUILD_ROOT set ++ # Fedora CI runs this with RPM_BUILD_ROOT unset ++ self.assertNotIn('RPM_BUILD_ROOT', os.environ) ++ tested = tested.replace('/usr/local', '/usr') + self.assertEqual( +- os.path.normpath(get_path(name, scheme)), ++ os.path.normpath(tested), + os.path.normpath(expected), + ) + +@@ -388,7 +399,7 @@ + self.assertTrue(os.path.isfile(config_h), config_h) + + def test_get_scheme_names(self): +- wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv'] ++ wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv', 'rpm_prefix'] + if HAS_USER_BASE: + wanted.extend(['nt_user', 'osx_framework_user', 'posix_user']) + self.assertEqual(get_scheme_names(), tuple(sorted(wanted))) +@@ -400,6 +411,8 @@ + cmd = "-c", "import sysconfig; print(sysconfig.get_platform())" + self.assertEqual(py.call_real(*cmd), py.call_link(*cmd)) + ++ @unittest.skipIf('RPM_BUILD_ROOT' not in os.environ, ++ "Test doesn't expect Fedora's paths") + def test_user_similar(self): + # Issue #8759: make sure the posix scheme for the users + # is similar to the global posix_prefix one diff --git a/PACKAGING-NOTES b/PACKAGING-NOTES new file mode 100644 index 0000000..e28c88c --- /dev/null +++ b/PACKAGING-NOTES @@ -0,0 +1,26 @@ +Notes for packagers of Python3 +============================== + +0. Faster build turnaround +-------------------------- + +By default, python builds with profile-guided optimization. This needs +an additional run of the test suite and it is generally slow. +PGO build takes around 50 minutes. + +For development, use "--without profileopt" option to disable PGO. This +shortens the build time to ~5 minutes including test suite. + +1. import_failed.map +---------------------- + +This is a mechanism installed as part of python3-base, that places shim modules +on python's path (through a generated zzzz-import-failed-hooks.pth file, so that +it is imported as much at the end as makes sense; and an _import_failed subdir +of /usr/lib/pythonX.Y). Then when the user tries to import a module that is part +of a subpackage, the ImportError will contain a helpful message telling them +which missing subpackage to install. + +This can sometimes cause problems on non-standard configurations, if the pth +gets included too early (for instance if you are using a script to include all +pths by hand in some strange order). Just something to look out for. diff --git a/Python-3.14.0a1.tar.xz b/Python-3.14.0a1.tar.xz new file mode 100644 index 0000000..6ee67d6 --- /dev/null +++ b/Python-3.14.0a1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e464b0cbb7535e2db34262fd19a0a393d0e62be0f43b1513ed98379b054ead4 +size 22613224 diff --git a/Python-3.14.0a1.tar.xz.sigstore b/Python-3.14.0a1.tar.xz.sigstore new file mode 100644 index 0000000..8faf344 --- /dev/null +++ b/Python-3.14.0a1.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzTCCAlOgAwIBAgIUXNqbdBZJ9fps7cdl20sumJAq9qYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjQxMDE1MjMwNDE2WhcNMjQxMDE1MjMxNDE2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcg+1tju2Qlwd/FxtfGT0xvTr74Z2Y4BSc2TvaDBBmRA/PtimxzlSdMhGDsfqHQLGi+b8OuTFW3Zox2aqHpqDCaOCAXIwggFuMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUVSMKNgZVgAfm3Hd9XuRrKl5zt40wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABkpJsy7QAAAQDAEYwRAIgfOwKhNkvL09iC5/uS5iTGmnIQbXjbUM1woNbLOSYA8sCIEb2hbK7hH+jGAxJQEG9OUlqHb9GwD7TVMxHdVMzpmoOMAoGCCqGSM49BAMDA2gAMGUCMCBvcdz/4awBy5UdMRubMhvQD3eF8sdlrEhkk1ymjVZzJW2gD1KQdzIxHNK/7F9hegIxAJ+lw+fOlGvkIB+txzmL6pg9Pcsf2x9DVpisHPW4WUUbB7VORIamogW8OSAuQsZ6tQ=="}, "tlogEntries": [{"logIndex": "140392200", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1729033456", "inclusionPromise": {"signedEntryTimestamp": "MEUCIEXI2s1U7Sve7CZ/p571004SLB9u5/ZT3Hf4tW9plQL/AiEAvvOg7se8XhZ+UNi7Qujx6bQxP0nHTrORgbP0Rg+xLGQ="}, "inclusionProof": {"logIndex": "18487938", "rootHash": "hSjsoi7BjBrhzW7Ceq8eDHavGqCXfJDqV1uLCH43rP0=", "treeSize": "18487939", "hashes": ["u79/W8pLop367cAKW1nkrasjLkk950s+chPOGd+YM7g=", "6/AN6/VWkeVC6ibK0wOaJWLDgeGYUPzGu++z5+WRpLw=", "XDRVudeM0USBGv0wfrkbUFLX5UPIMbXd7Jn+1FaHfXw=", "scHEQm8K7oRERzNSJaNlqN0E1OdiAscc4j9riGrA62g=", "/mosl9RAejdUfiMbl+lvD5kTT8EMHe3G8ceEh5ZmcAs=", "DPPCrptvLQKGtAJAKyVPBnf+K6vDmh24s1GP202TKto=", "dXjYLwyHqcxTI9MyukBet+9OyYvXCMvvLJJl9sIYKyA=", "rAAfgmPXo8TJp1LmkVDhAYrf0WzE4X4/mDuW1pwVM3Y=", "gf+9m552B3PnkWnO0o4KdVvjcT3WVHLrCbf1DoVYKFw="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n18487939\nhSjsoi7BjBrhzW7Ceq8eDHavGqCXfJDqV1uLCH43rP0=\n\n\u2014 rekor.sigstore.dev wNI9ajBGAiEAgDgD5PWqYAJ4/g3gd2iOpEzZI/0I/WH5zpJyi9r4DcECIQC+1ibcP0dHlJ6v7Jd7rq8ojgP5eTKxsEv7tTU8erfyTQ==\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzZTQ2NGIwY2JiNzUzNWUyZGIzNDI2MmZkMTlhMGEzOTNkMGU2MmJlMGY0M2IxNTEzZWQ5ODM3OWIwNTRlYWQ0In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQVRMMFNVQnVnWW5NSFZjbzYrcGtPTTkxSVd3cHQ3bis3VTdmZlNCeXU1WUFpQXU0RkxJSzJiU1puSmxranFkOUgwV3hBdnE3NmVPeFZ4L21JZytxN0N0NkE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZWRU5EUVd4UFowRjNTVUpCWjBsVldFNXhZbVJDV2tvNVpuQnpOMk5rYkRJd2MzVnRTa0Z4T1hGWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFJlRTFFUlRGTmFrMTNUa1JGTWxkb1kwNU5hbEY0VFVSRk1VMXFUWGhPUkVVeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZqWnlzeGRHcDFNbEZzZDJRdlJuaDBaa2RVTUhoMlZISTNORm95V1RSQ1UyTXlWSFlLWVVSQ1FtMVNRUzlRZEdsdGVIcHNVMlJOYUVkRWMyWnhTRkZNUjJrcllqaFBkVlJHVnpOYWIzZ3lZWEZJY0hGRVEyRlBRMEZZU1hkblowWjFUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZXVTAxTENrNW5XbFpuUVdadE0waGtPVmgxVW5KTGJEVjZkRFF3ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVZGWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpjS1FraHJRV1IzUWpGQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnJjRXB6ZVRkUlFRcEJRVkZFUVVWWmQxSkJTV2RtVDNkTGFFNXJka3d3T1dsRE5TOTFVelZwVkVkdGJrbFJZbGhxWWxWTk1YZHZUbUpNVDFOWlFUaHpRMGxGWWpKb1lrczNDbWhJSzJwSFFYaEtVVVZIT1U5VmJIRklZamxIZDBRM1ZGWk5lRWhrVmsxNmNHMXZUMDFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMURRbllLWTJSNkx6UmhkMEo1TlZWa1RWSjFZazFvZGxGRU0yVkdPSE5rYkhKRmFHdHJNWGx0YWxaYWVrcFhNbWRFTVV0UlpIcEplRWhPU3k4M1JqbG9aV2RKZUFwQlNpdHNkeXRtVDJ4SGRtdEpRaXQwZUhwdFREWndaemxRWTNObU1uZzVSRlp3YVhOSVVGYzBWMVZWWWtJM1ZrOVNTV0Z0YjJkWE9FOVRRWFZSYzFvMkNuUlJQVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "PkZLDLt1NeLbNCYv0ZoKOT0OYr4PQ7FRPtmDebBU6tQ="}, "signature": "MEQCIATL0SUBugYnMHVco6+pkOM91IWwpt7n+7U7ffSByu5YAiAu4FLIK2bSZnJlkjqd9H0WxAvq76eOxVx/mIg+q7Ct6A=="}} diff --git a/Python-3.14.0a2.tar.xz b/Python-3.14.0a2.tar.xz new file mode 100644 index 0000000..77aa85a --- /dev/null +++ b/Python-3.14.0a2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ff9e10147342b3efd69f5cd9cc06ec46250f2a046587599d18e2cac69c05920 +size 22696948 diff --git a/Python-3.14.0a2.tar.xz.sigstore b/Python-3.14.0a2.tar.xz.sigstore new file mode 100644 index 0000000..3101f64 --- /dev/null +++ b/Python-3.14.0a2.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzTCCAlSgAwIBAgIUSXL944EaMZMHwPFJgntqMRM4b2MwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjQxMTE5MjAxODM1WhcNMjQxMTE5MjAyODM1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElzSYiA2WtnhE5+Nx0yAom6lpRTHHrgyEIK19wWsxSREV9lqvO9L4nmfnGBEWfEkmdkwyZk6hvR6imyhIcvVgF6OCAXMwggFvMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUTfbHTLCDFnSe8No9sXLgh1Q+N2gwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABk0YTsMEAAAQDAEcwRQIgXAC0OIAMLqhuGlvUmp+QFXO4bPUg1aDDslDJHMCMaToCIQCVJuNByJUIKb/rnHvWuoW+dddiU1azHEVtPyjMekv89zAKBggqhkjOPQQDAwNnADBkAjA0mjG/qXEvjI9yyJCxZaN94Xy0AZI8OJi+UD7PBWG9Imi90A10D5Lb/R7uf/kN2W8CMCoR5yU48v+o5vANSt7lDeweJdAFsRPTUZDqqesBQkQ6cV9KBXkjLeSUyzIDFBKeiQ=="}, "tlogEntries": [{"logIndex": "149977023", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1732047516", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQDrs7hZIvGrYixNoDHJtgla48J+vx3C659UQdon8cz9wAIgeO1rOkrG6YLOCdG5XSHFBGIQcF3MgTrakWL25IlyO60="}, "inclusionProof": {"logIndex": "28072761", "rootHash": "hbXsypN1KAd3cWgQqOT4fPS5+F2fWNyfdJ7u5bb49To=", "treeSize": "28072762", "hashes": ["qA2mmzYD3E5ExNnASpwQReul4TdbWHUJfH9aF/JRNpw=", "HEgvFlMFbhJB+DB7nwB9vK30bLfl3GgTOusJbrDz6ss=", "gdj9EhP7EH9GQTWpelG2inz3mTORwatV9vhk1plAiQg=", "LnFYfn8KNL16odmkPyBfwE4uTd7Tfed+Rl4x+PzyXGw=", "Ta0Lefjinhbl1+KcWYIO2wiwMv2QC7RZrWEpuYfD9TI=", "bBo5ByTJoskmVjoZ8geIwQqMEwUdQtVJRn1yVRcPzVY=", "A/1Q5kZeNDto6YqYT49R5s398nwYqpssk+k9J+iyJEE=", "NCX3+gEdPO7Y3Q7DNx9dgT9KLG1Zukly/yphZ9b4PXQ=", "8qzMEkqspGl0RYFwxLb/eAf2xYrMBoZkxjq82aVY+JA=", "aPvPOUcJ3Qllkxp31FJTmCKWOFLFOoXz1UCE1t7w160=", "HdjiYX8LA9CwwDDzSy7LwCMkXLwAYQdvYIbxEn7wwOs=", "E2rLOYPJFKiizYiyu07QLqkMVTVL7i2ZgXiQywdI9KQ=", "4lUF0YOu9XkIDXKXA0wMSzd6VeDY3TZAgmoOeWmS2+Y=", "gf+9m552B3PnkWnO0o4KdVvjcT3WVHLrCbf1DoVYKFw="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n28072762\nhbXsypN1KAd3cWgQqOT4fPS5+F2fWNyfdJ7u5bb49To=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiBKhLsERtHY1eQCGNrChGIdiEjtMxSM4q6cBXdfWSwJjwIhAP0TbCYsUkbwNoAqKJuOPy4agrA0LcEW7EwmAN1uZEa1\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyZmY5ZTEwMTQ3MzQyYjNlZmQ2OWY1Y2Q5Y2MwNmVjNDYyNTBmMmEwNDY1ODc1OTlkMThlMmNhYzY5YzA1OTIwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURMRFlCdE0xTHNjcG9JMzBCMEJTcUR2a2FwZGJOT00vQlY4Z0xKSDkyREx3SWdSU2cxdXY2NFVEVUwwTGJsS3EwR3B0cTUxdjdtU09CTEhJSC9KSHZKd0t3PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZWRU5EUVd4VFowRjNTVUpCWjBsVlUxaE1PVFEwUldGTldrMUlkMUJHU21kdWRIRk5VazAwWWpKTmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFJlRTFVUlRWTmFrRjRUMFJOTVZkb1kwNU5hbEY0VFZSRk5VMXFRWGxQUkUweFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZzZWxOWmFVRXlWM1J1YUVVMUswNTRNSGxCYjIwMmJIQlNWRWhJY21kNVJVbExNVGtLZDFkemVGTlNSVlk1YkhGMlR6bE1ORzV0Wm01SFFrVlhaa1ZyYldScmQzbGFhelpvZGxJMmFXMTVhRWxqZGxablJqWlBRMEZZVFhkblowWjJUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZVWm1KSUNsUk1RMFJHYmxObE9FNXZPWE5ZVEdkb01WRXJUakpuZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVdkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpnS1FraHZRV1ZCUWpKQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnJNRmxVYzAxRlFRcEJRVkZFUVVWamQxSlJTV2RZUVVNd1QwbEJUVXh4YUhWSGJIWlZiWEFyVVVaWVR6UmlVRlZuTVdGRVJITnNSRXBJVFVOTllWUnZRMGxSUTFaS2RVNUNDbmxLVlVsTFlpOXlia2gyVjNWdlZ5dGtaR1JwVlRGaGVraEZWblJRZVdwTlpXdDJPRGw2UVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV1UVVSQ2EwRnFRVEFLYldwSEwzRllSWFpxU1RsNWVVcERlRnBoVGprMFdIa3dRVnBKT0U5S2FTdFZSRGRRUWxkSE9VbHRhVGt3UVRFd1JEVk1ZaTlTTjNWbUwydE9NbGM0UXdwTlEyOVNOWGxWTkRoMksyODFka0ZPVTNRM2JFUmxkMlZLWkVGR2MxSlFWRlZhUkhGeFpYTkNVV3RSTm1OV09VdENXR3RxVEdWVFZYbDZTVVJHUWt0bENtbFJQVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "L/nhAUc0Kz79afXNnMBuxGJQ8qBGWHWZ0Y4srGnAWSA="}, "signature": "MEUCIQDLDYBtM1LscpoI30B0BSqDvkapdbNOM/BV8gLJH92DLwIgRSg1uv64UDUL0LblKq0Gptq51v7mSOBLHIH/JHvJwKw="}} diff --git a/Python-3.14.0a3.tar.xz b/Python-3.14.0a3.tar.xz new file mode 100644 index 0000000..91a9897 --- /dev/null +++ b/Python-3.14.0a3.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94349df207456a575a8867c20b4ca434f870e1920dcdcc8fdf797e1af49abe90 +size 22749680 diff --git a/Python-3.14.0a3.tar.xz.sigstore b/Python-3.14.0a3.tar.xz.sigstore new file mode 100644 index 0000000..a1bc159 --- /dev/null +++ b/Python-3.14.0a3.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlWgAwIBAgIUDuq8kxtpL3by1SpAOIOeKKlsrjYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjQxMjE3MTYwNzI2WhcNMjQxMjE3MTYxNzI2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbmMPLFZSDjmfOKJGlOu6KqXbfARpxcurVugL1gOpPciVb/cVrPk9lP7V6B8zpnMK5ax2CbG3otAfweTtDWrnjqOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUDct7Hl3MxAxfP1dhgpDF6PSlUuMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABk9Vfz7QAAAQDAEgwRgIhALGA/GkNojAPK5EODrVG03RxOEr/0bFyv5wxxxx9otO0AiEAt8SElgsdc7QW/vevYc0lQ6aA1BmxAsjG6O333PTx2hwwCgYIKoZIzj0EAwMDZwAwZAIwd8VqF3+Jxkb1Un90vEsxZAHErNq4ed7BStBPTL+z9ngwBpNcR2NySohOZxgBZuP0AjA5hXuw9WbV15D9do4x4gSiOpCe5AMpgoU/ld0YZfbwN0v/h2rIF64Cp2J04V1RYkw="}, "tlogEntries": [{"logIndex": "156043087", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1734451646", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQD1bn+1BlbnvdMGTX8cRvOVMdhE9Imcz9FMgKSDo4q3yAIgJT+Nibv1h0auGmm6in89ane7DKqcH1e6JxT4sXHO1bQ="}, "inclusionProof": {"logIndex": "34138825", "rootHash": "7Qt+3ioEkHd/WQ+ZF4zkdbZ1JExMNGx/pF6U2cmtM/Q=", "treeSize": "34138826", "hashes": ["460W3n1CZaOKfLd1/YSC0H5L84wbbSFUNol1ZwDndoM=", "y7NhKWl4yggGf0GhUE9xHzlnejEw3Hip+npVOBmV31I=", "dV++dwKBz/zC/+rg8FF5eQt3qeYLLCBeALXUFzUUDvk=", "Fxn6iOFXoaUrdLXwrSYOGfimcHgNjfjb9TnhpIjuaCc=", "BkTein2wmT1o/gL3lyKvg06L/h4CKSyJUadCatxLBTI=", "M1nIbSb6tTZeslPr6Qyo3LT16Jr+lJ+fgJD3il4tqkc=", "dvMxr6G8Mnh7ppC7ZlLdoid1OKb+1L5aNmhT6oEy3og=", "NTLDQYFQUNEJKfKO4iPdERTA3qiw5W+1lj7tBj6ucO0=", "KSSbh1+IusMZKVSTJMSjnahGEacBezafZFvtTDmdcng=", "oj35HyCM3EqQ5Lil2RUr9boiRWZlouxLnqNA7z28Glc=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n34138826\n7Qt+3ioEkHd/WQ+ZF4zkdbZ1JExMNGx/pF6U2cmtM/Q=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAk3Vso0Awrs2GLdUg8Ol1Ck4ChMQGcLf/nLMpOmTHQ3AIgIGkpE6mkns2HjIewM4H4D+BPv0UWGBaEYuDx9NXJ5Tg=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5NDM0OWRmMjA3NDU2YTU3NWE4ODY3YzIwYjRjYTQzNGY4NzBlMTkyMGRjZGNjOGZkZjc5N2UxYWY0OWFiZTkwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRGRodWh6cmtJOHZrZjVVSlNiOGRIT0w5OEtpWXIvd1NwWjFVK3JNd2tQbEFpQTVCbXZjamNNaTNPMlMyak56bDVzd20zVXpXTysxSGk1VnpqTGM5bVlKcFE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4WFowRjNTVUpCWjBsVlJIVnhPR3Q0ZEhCTU0ySjVNVk53UVU5SlQyVkxTMnh6Y21wWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFJlRTFxUlROTlZGbDNUbnBKTWxkb1kwNU5hbEY0VFdwRk0wMVVXWGhPZWtreVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZpYlUxUVRFWmFVMFJxYldaUFMwcEhiRTkxTmt0eFdHSm1RVkp3ZUdOMWNsWjFaMHdLTVdkUGNGQmphVlppTDJOV2NsQnJPV3hRTjFZMlFqaDZjRzVOU3pWaGVESkRZa2N6YjNSQlpuZGxWSFJFVjNKdWFuRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZFWTNRM0NraHNNMDE0UVhobVVERmthR2R3UkVZMlVGTnNWWFZOZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnJPVlptZWpkUlFRcEJRVkZFUVVWbmQxSm5TV2hCVEVkQkwwZHJUbTlxUVZCTE5VVlBSSEpXUnpBelVuaFBSWEl2TUdKR2VYWTFkM2g0ZUhnNWIzUlBNRUZwUlVGME9GTkZDbXhuYzJSak4xRlhMM1psZGxsak1HeFJObUZCTVVKdGVFRnpha2MyVHpNek0xQlVlREpvZDNkRFoxbEpTMjlhU1hwcU1FVkJkMDFFV25kQmQxcEJTWGNLWkRoV2NVWXpLMHA0YTJJeFZXNDVNSFpGYzNoYVFVaEZjazV4TkdWa04wSlRkRUpRVkV3cmVqbHVaM2RDY0U1alVqSk9lVk52YUU5YWVHZENXblZRTUFwQmFrRTFhRmgxZHpsWFlsWXhOVVE1Wkc4MGVEUm5VMmxQY0VObE5VRk5jR2R2VlM5c1pEQlpXbVppZDA0d2RpOW9NbkpKUmpZMFEzQXlTakEwVmpGU0NsbHJkejBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "lDSd8gdFaldaiGfCC0ykNPhw4ZINzcyP33l+GvSavpA="}, "signature": "MEQCIDdhuhzrkI8vkf5UJSb8dHOL98KiYr/wSpZ1U+rMwkPlAiA5BmvcjcMi3O2S2jNzl5swm3UzWO+1Hi5VzjLc9mYJpQ=="}} diff --git a/Python-3.14.0a4.tar.xz b/Python-3.14.0a4.tar.xz new file mode 100644 index 0000000..366505a --- /dev/null +++ b/Python-3.14.0a4.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c24f07881873c1d460228795ca6ca8c99130e30c773c91463d30d7ea8ff0e70b +size 22798932 diff --git a/Python-3.14.0a4.tar.xz.sigstore b/Python-3.14.0a4.tar.xz.sigstore new file mode 100644 index 0000000..7746a47 --- /dev/null +++ b/Python-3.14.0a4.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzzCCAlWgAwIBAgIUTNqrmr/M2mihtEwN8O2FyM2q1q4wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMTE0MTYwMTUwWhcNMjUwMTE0MTYxMTUwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXFyDvDOdj/YAUw6VwCbccPuaGXVlONd/+yU2w6pjOucN7XNrKQzRc2p0B87e6fBJNtrvoQskKm5g5RZRNIaTraOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU+FemmqqSGkLeHpehmVT+O/2VD1MwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlGWMvxkAAAQDAEgwRgIhAMdC5GErGZYgWadLhCcmCxR3wAZ8jSVhTikA8HyIMUjKAiEAjZQMpnwoXgxNEXGAs8J/Myxxp5Lky719397l9nhdPk8wCgYIKoZIzj0EAwMDaAAwZQIxAMcST1Hx0VxHs8dH4fVNnJHRqHV70g4gWXOUahXOh86pLbvOOsGqM3w8o3kUhjO7oAIwRCZiVhDjDq59iDX6/IO7mG/gwNXBVqKSPdcYRS6l/SxM3JRORz8QCQK3HtM5TPvm"}, "tlogEntries": [{"logIndex": "162324179", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1736870510", "inclusionPromise": {"signedEntryTimestamp": "MEQCIAXgFU1gThdT0mhc6q0AXzD3bBXTiacgiLtvj81gdZF4AiBN9qUrwxowhsD9xRkTFuRk/l7pkEkkF84mJouMltHlqw=="}, "inclusionProof": {"logIndex": "40419917", "rootHash": "sQcmJqkpVAfxguDGAn46H0Jx7wI/seLoX5hw8YAhpzE=", "treeSize": "40419918", "hashes": ["qjl0o9LTqPs1qAydDqJeuEjAe7m0r28edbu6YhwigVs=", "ld8TM/ZFyvOEsuFo6tzdkPMu1WXFFF7FkLeePNxTZgQ=", "msMDMUPWOxenW8+fKcA9KtYwJh+qOm8eJ6hD6qMLxgo=", "HB3n8ruKgQ4/hsnPPqqgZqgqrIY+bil6MZEN48iQf5o=", "s4485wmLHDIJ3Uz0cZtlQJMaGl/NcoVYyRSxf8iaGF0=", "ipeSaii1joKqXMjR8vQt0JqN3F2T64mYFe55cZTSE7k=", "Zh8tfYPsaKKLrwZBF7ddhto+2SATy+XV9dtLPctNAlU=", "GVSyTNVOEKppJTUqz+nM5IM0FJ34fKBEIv5VAyJ7Dv4=", "tlaG/ckV5gypfBxP4OGlhhoLQ/VcEe+s4IdoNM+5CJk=", "LxTVSFPuriQ2RUI8Dbu2hz4wzAG1G271/Jivqrd1etw=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n40419918\nsQcmJqkpVAfxguDGAn46H0Jx7wI/seLoX5hw8YAhpzE=\n\n\u2014 rekor.sigstore.dev wNI9ajBGAiEAv+PVAciPszI4zlpSunN4bfTvMqVTy5p62XGhyX7jQwACIQCNHJdBqkgiBk7OICiGqlcnklnK9wf4okEYP4iC2UpSUQ==\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjMjRmMDc4ODE4NzNjMWQ0NjAyMjg3OTVjYTZjYThjOTkxMzBlMzBjNzczYzkxNDYzZDMwZDdlYThmZjBlNzBiIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUROejA2OHVmUE1tRUNZL3JldUdNSGRBbUhoazc1MHNaNHdTKytsY1g1Z0xRSWdLdzN1S1oydm9Jd2FMSWk1dFl3d2JBOUZUaFVHK05NUDViYmwyS0xSYXZjPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZla05EUVd4WFowRjNTVUpCWjBsVlZFNXhjbTF5TDAweWJXbG9kRVYzVGpoUE1rWjVUVEp4TVhFMGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDFVUlRCTlZGbDNUVlJWZDFkb1kwNU5hbFYzVFZSRk1FMVVXWGhOVkZWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZZUm5sRWRrUlBaR292V1VGVmR6WldkME5pWTJOUWRXRkhXRlpzVDA1a0x5dDVWVElLZHpad2FrOTFZMDQzV0U1eVMxRjZVbU15Y0RCQ09EZGxObVpDU2s1MGNuWnZVWE5yUzIwMVp6VlNXbEpPU1dGVWNtRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlVyUm1WdENtMXhjVk5IYTB4bFNIQmxhRzFXVkN0UEx6SldSREZOZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNSMWROZG5oclFRcEJRVkZFUVVWbmQxSm5TV2hCVFdSRE5VZEZja2RhV1dkWFlXUk1hRU5qYlVONFVqTjNRVm80YWxOV2FGUnBhMEU0U0hsSlRWVnFTMEZwUlVGcVdsRk5DbkJ1ZDI5WVozaE9SVmhIUVhNNFNpOU5lWGg0Y0RWTWEzazNNVGt6T1Rkc09XNW9aRkJyT0hkRFoxbEpTMjlhU1hwcU1FVkJkMDFFWVVGQmQxcFJTWGdLUVUxalUxUXhTSGd3Vm5oSWN6aGtTRFJtVms1dVNraFNjVWhXTnpCbk5HZFhXRTlWWVdoWVQyZzRObkJNWW5aUFQzTkhjVTB6ZHpodk0ydFZhR3BQTndwdlFVbDNVa05hYVZab1JHcEVjVFU1YVVSWU5pOUpUemR0Unk5bmQwNVlRbFp4UzFOUVpHTlpVbE0yYkM5VGVFMHpTbEpQVW5vNFVVTlJTek5JZEUwMUNsUlFkbTBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "wk8HiBhzwdRgIoeVymyoyZEw4wx3PJFGPTDX6o/w5ws="}, "signature": "MEUCIQDNz068ufPMmECY/reuGMHdAmHhk750sZ4wS++lcX5gLQIgKw3uKZ2voIwaLIi5tYwwbA9FThUG+NMP5bbl2KLRavc="}} diff --git a/Python-3.14.0a7.tar.xz b/Python-3.14.0a7.tar.xz new file mode 100644 index 0000000..cd37618 --- /dev/null +++ b/Python-3.14.0a7.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d +size 23015952 diff --git a/Python-3.14.0a7.tar.xz.sigstore b/Python-3.14.0a7.tar.xz.sigstore new file mode 100644 index 0000000..db0b133 --- /dev/null +++ b/Python-3.14.0a7.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlSgAwIBAgIUDwqRiJH4afgF7PkW1Qo6rr2v0lkwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNDA4MTQxMDA1WhcNMjUwNDA4MTQyMDA1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZMgeduxSbRvf4+rxh9JLHe0ESc4Xexly0NaNWHeiTHLmdg+PRLNa5wLOEMZnjbZejU7znxttN65MnOzV5cOcoKOCAXMwggFvMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUJQXlBvRXJEBKte20LxybMfGrT6YwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlhW8oHwAAAQDAEcwRQIhALZwxAQ5nnFRozZP8YRDJAl6S1kWfYD5oV7AEPrj0s5CAiA5CY5C5cBFEcjroS+wQAWg1LW4HqvRZ0KVR99kcb4a/TAKBggqhkjOPQQDAwNoADBlAjAHbpNPV8nJ2q37EdYR8NElF7p7qVBSdT9VzBLh0X0WL0Df0ub0LiBPYPNELQ/n0rQCMQDd2OPfzn42qBrwT/TUP2yR0/0h9nsqGOsinLhLH/euLXXJ+xK0iHMRLfk4cABvoFs="}, "tlogEntries": [{"logIndex": "193881744", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1744121405", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQDZCZJVW+h+35nY12Z9y9tOkwStyIEVZmXSPx7mQUy0DwIgYWnL18yNoypHlLRSb2WIkcRxcD589pZdPORUS442MhU="}, "inclusionProof": {"logIndex": "71977482", "rootHash": "5SzvaU4/6U0MtwYjXGh0z1gIbnBbXfoMCLyL7PyEzE8=", "treeSize": "71977483", "hashes": ["+kSGTHFAaROPxw/+007Kwz3MXdUvY3V+rrY6sn3rTWc=", "gArlaOWkPW1lG6zUi9fwcxm6cyXspC+A2q3O5EzUI28=", "9TNwbV6fOnLuQ0CrvdKWO4n2fooZCvdCTwrFZCo6a8E=", "phHq2powa3InqGTI+IN0To1CKFgq/QLjjjUOmMz73pU=", "3tDvwrpMz/XYloigErVZuQZphUjJ7mX16wnR7tq2tMY=", "QReFEOB9XSZtDKsjRtA0fGnYGMYD2Z7qn50auG1YlWo=", "K26LG80DXyb+bC58c4Nw00WigG52v0PCsZGY3ExGsts=", "WEm5OgPzJpYROv+4CcrieexCYyQKrLUH3hbxmcQQ+DM=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n71977483\n5SzvaU4/6U0MtwYjXGh0z1gIbnBbXfoMCLyL7PyEzE8=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEAxksfGmVyE0Zi4wa9fM67aL5JUeJSsJUyWeU2jqqH/yoCIHfCdL/guuSIxD8tEK6/qQoRdbugANBBjI6gG96bkluH\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3MWFkYmNlYzNhYzllZGY5MzMwOGU1NWNmYjQxODRmMmViNGIxNmZkYTJiYjBhNWEzODI5MjllZDI5YzgzODZkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUR3U3lCQ2swa2t3NytBNDlSL0UxVmdrRUtORXhKYUt4ejU3SjYzUWdTSlhBSWdMdUVpNGNqMnMvTFZ1VEdaaThGMkxZZVhzOUJtYXA0cnVyU3NWWHI5L21VPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4VFowRjNTVUpCWjBsVlJIZHhVbWxLU0RSaFptZEdOMUJyVnpGUmJ6WnljakoyTUd4cmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVFUVRSTlZGRjRUVVJCTVZkb1kwNU5hbFYzVGtSQk5FMVVVWGxOUkVFeFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZhVFdkbFpIVjRVMkpTZG1ZMEszSjRhRGxLVEVobE1FVlRZelJZWlhoc2VUQk9ZVTRLVjBobGFWUklURzFrWnl0UVVreE9ZVFYzVEU5RlRWcHVhbUphWldwVk4zcHVlSFIwVGpZMVRXNVBlbFkxWTA5amIwdFBRMEZZVFhkblowWjJUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZLVVZoc0NrSjJVbGhLUlVKTGRHVXlNRXg0ZVdKTlprZHlWRFpaZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVdkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpnS1FraHZRV1ZCUWpKQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNhRmM0YjBoM1FRcEJRVkZFUVVWamQxSlJTV2hCVEZwM2VFRlJOVzV1UmxKdmVscFFPRmxTUkVwQmJEWlRNV3RYWmxsRU5XOVdOMEZGVUhKcU1ITTFRMEZwUVRWRFdUVkRDalZqUWtaRlkycHliMU1yZDFGQlYyY3hURmMwU0hGMlVsb3dTMVpTT1RsclkySTBZUzlVUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV2UVVSQ2JFRnFRVWdLWW5CT1VGWTRia295Y1RNM1JXUlpVamhPUld4R04zQTNjVlpDVTJSVU9WWjZRa3hvTUZnd1Ywd3dSR1l3ZFdJd1RHbENVRmxRVGtWTVVTOXVNSEpSUXdwTlVVUmtNazlRWm5wdU5ESnhRbkozVkM5VVZWQXllVkl3THpCb09XNXpjVWRQYzJsdVRHaE1TQzlsZFV4WVdFb3JlRXN3YVVoTlVreG1helJqUVVKMkNtOUdjejBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "ca287DrJ7fkzCOVc+0GE8utLFv2iuwpaOCkp7SnIOG0="}, "signature": "MEUCIQDwSyBCk0kkw7+A49R/E1VgkEKNExJaKxz57J63QgSJXAIgLuEi4cj2s/LVuTGZi8F2LYeXs9Bmap4rurSsVXr9/mU="}} diff --git a/Python-3.14.0b1.tar.xz b/Python-3.14.0b1.tar.xz new file mode 100644 index 0000000..06eecfa --- /dev/null +++ b/Python-3.14.0b1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ddd30a77c9f62e065ce648664a254b9b0c011bcdaa8c1c2787087e644cbeb39 +size 23358200 diff --git a/Python-3.14.0b1.tar.xz.sigstore b/Python-3.14.0b1.tar.xz.sigstore new file mode 100644 index 0000000..980ba6b --- /dev/null +++ b/Python-3.14.0b1.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzTCCAlSgAwIBAgIULIy4li9CnyoD5VMYqVRBX2xhl6YwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNTA3MTYwMzMzWhcNMjUwNTA3MTYxMzMzWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0JmJhID7cDpz+w6ZeMYNR449Q09ObTq/rJoA8ZEElRyZ3PMOtxR2ddPssyVyssw08b+petEPGdB0JJPO3WEnlKOCAXMwggFvMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUGQo//6O9UwWERnXDGRKGEoQUbu0wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlqt88AUAAAQDAEcwRQIhAInVh3hc5tWxnOQJ5h7UJrc5APbRKH8LJqAxkOV+WKm0AiBGJm7a5cYa/zbL5Luuv9tjz8KHnWbROq6oKklEHKGvZjAKBggqhkjOPQQDAwNnADBkAjBtvTe9/f6rAve+EkBvvIop4WNK5iMcokC8IgzjxL6wriEBnFYdWYSwK7VBR2cH/ZECMAyKRlLPH9eUprwyKQUdRlTo0Yy8vrHwvnPCYDSy3haOb6o63L6aBc3a3+ZFL3JN8w=="}, "tlogEntries": [{"logIndex": "207983201", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1746633814", "inclusionPromise": {"signedEntryTimestamp": "MEYCIQDJuNzTYOUa0MGipv/REIMeMqMDDKZD7kC7VFMz9Ti4MQIhAI80PJYQgmc4IVvjyaOuoII3FWAcpXMAFxDwWIuK9cCW"}, "inclusionProof": {"logIndex": "86078939", "rootHash": "w3YK957NYJEEdmCkJePI4YPkL/m/o3MzbbnwWWhs7GA=", "treeSize": "86078940", "hashes": ["CBhgCT1rFez/Jf74ZwQ61/iJi+GdFNlGCXP8UBJxoB4=", "DpoDp5RYO3Q9T5lacpgLmaHF2bn+FkquEGFozf+sp1Q=", "2TglKxclAzNtphRi2WpqJF5uopsc4Iuu9Z71MpI9v4o=", "RPllLfj9XtJJgiVxHlAL6ebrSaxG+KeQXTLR4Cm8XQo=", "pf8d3Uj/L5VdDspWOfvrpwpDewiwud0CgEhkiG5MKkQ=", "kxK8IY0R+juQTVgVA5V+1SBt2dxu46s7J69sMRfNyn4=", "cjIv9wp+qUQ2SskcyJj01uOcSf/AthrVrFWD3YRhRFA=", "JOXEdAzR1hHM95VAQqRSOvJ7fA/w50P0X9a/WzIuhdc=", "YkX6Zh7rNaOAk3CNse8gzKpbsS+KDU79Fw1cGoFJILE=", "tvDDknRU/Rmet2xJVgoUiHqZA5/dG20d2t0zsoSIpRw=", "1SRCIie0eK46oBmaYPSw8Zuo3poDMoEhwGV+1UGlkGo=", "fZPSgZk/M4toaT6mV3CvNCRz647SBlRiOzrdRNQw70A=", "ZFYJDX8rdSh0CP8oZVy/Ik2B+hMkbZEF46EgoAFxDZ4=", "++1LMuz3tIdW1/pfEfhPfXC4ot1AwDAXDcPyfibzGyc=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n86078940\nw3YK957NYJEEdmCkJePI4YPkL/m/o3MzbbnwWWhs7GA=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiBFm3XirGA9d16WEyelP3qBi1diHR2aD6H/1qfpU/GKjQIhAMuUjS7iJZNNLMp1Aj8gzrI8IfIGPzpzjW5wdOsYQuPY\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyZGRkMzBhNzdjOWY2MmUwNjVjZTY0ODY2NGEyNTRiOWIwYzAxMWJjZGFhOGMxYzI3ODcwODdlNjQ0Y2JlYjM5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUMyV2hQWE9HY2FkVmk5a0lYUWIyMVBJYTJDcWIvOVJvVzhTRHNBUnA2cGhBSWhBUDJNeGxoNERBY0gyalRBRXYvK0dmM3dySkRWZXBBZlJuSytTSmxyU21DbyIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZWRU5EUVd4VFowRjNTVUpCWjBsVlRFbDVOR3hwT1VOdWVXOUVOVlpOV1hGV1VrSllNbmhvYkRaWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVVUVROTlZGbDNUWHBOZWxkb1kwNU5hbFYzVGxSQk0wMVVXWGhOZWsxNlYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV3U20xS2FFbEVOMk5FY0hvcmR6WmFaVTFaVGxJME5EbFJNRGxQWWxSeEwzSktiMEVLT0ZwRlJXeFNlVm96VUUxUGRIaFNNbVJrVUhOemVWWjVjM04zTURoaUszQmxkRVZRUjJSQ01FcEtVRTh6VjBWdWJFdFBRMEZZVFhkblowWjJUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZIVVc4dkNpODJUemxWZDFkRlVtNVlSRWRTUzBkRmIxRlZZblV3ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVdkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpnS1FraHZRV1ZCUWpKQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNjWFE0T0VGVlFRcEJRVkZFUVVWamQxSlJTV2hCU1c1V2FETm9ZelYwVjNodVQxRktOV2czVlVweVl6VkJVR0pTUzBnNFRFcHhRWGhyVDFZclYwdHRNRUZwUWtkS2JUZGhDalZqV1dFdmVtSk1OVXgxZFhZNWRHcDZPRXRJYmxkaVVrOXhObTlMYTJ4RlNFdEhkbHBxUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV1UVVSQ2EwRnFRblFLZGxSbE9TOW1ObkpCZG1VclJXdENkblpKYjNBMFYwNUxOV2xOWTI5clF6aEpaM3BxZUV3MmQzSnBSVUp1Umxsa1YxbFRkMHMzVmtKU01tTklMMXBGUXdwTlFYbExVbXhNVUVnNVpWVndjbmQ1UzFGVlpGSnNWRzh3V1hrNGRuSklkM1p1VUVOWlJGTjVNMmhoVDJJMmJ6WXpURFpoUW1NellUTXJXa1pNTTBwT0NqaDNQVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "Ld0wp3yfYuBlzmSGZKJUubDAEbzaqMHCeHCH5kTL6zk="}, "signature": "MEYCIQC2WhPXOGcadVi9kIXQb21PIa2Cqb/9RoW8SDsARp6phAIhAP2Mxlh4DAcH2jTAEv/+Gf3wrJDVepAfRnK+SJlrSmCo"}} diff --git a/Python-3.14.0b2.tar.xz b/Python-3.14.0b2.tar.xz new file mode 100644 index 0000000..3dffd23 --- /dev/null +++ b/Python-3.14.0b2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ac9e84844bbc0a5a8f1f79a37a68b3b8caf2a58b4aa5999c49227cb36e70ea6 +size 23579860 diff --git a/Python-3.14.0b2.tar.xz.sigstore b/Python-3.14.0b2.tar.xz.sigstore new file mode 100644 index 0000000..8048698 --- /dev/null +++ b/Python-3.14.0b2.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzzCCAlWgAwIBAgIUChCDgQHRA1Igh/Ojbrpft+lgXo0wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNTI2MTg1MjQ2WhcNMjUwNTI2MTkwMjQ2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECYjq5SRuvoZAvtJJ46ssKwhHC3HccF4i89/Q+yVu7kRlvttqzyjIgGeGI9WktRWOg78H0sIyvrEPScz7oHDVoaOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUkCdI16aHO1xp5qoJifJvbKtEQKkwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlw3wr2IAAAQDAEgwRgIhAJdMsBp/pjt043ZGHTzWw0gKmESRde7hNMQAb01FgjLIAiEA1T1YubIaj37yqL2pr/U12BLz9AraMLX2kSq9hw/Qg3swCgYIKoZIzj0EAwMDaAAwZQIxAIJo6hW9immJWSAGq0HPgKR+1b6KlIyJFosJp0ZocowP6VRr/OwQiuEXSRLwSLdI6gIwPP9ftNP5ikQCEhH6HDonHHb9HnHr/oAlYM+ivbRH+0x6HkYz8K1SH60Emy3sHBxT"}, "tlogEntries": [{"logIndex": "220085169", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1748285567", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQCyGbx3XopZRmq6mmrCkhoQJvuRqR62giVmWtPvosANigIger0MkeXASzno5NKaUJwaTXlh4abtGBPsBsCDDmTV/38="}, "inclusionProof": {"logIndex": "98180907", "rootHash": "llBJk8Br31u8BNoIfOK++L8lwcRZXa0BM5VW7xu6HCE=", "treeSize": "98180908", "hashes": ["42WGfIQDj3m2U/fVjB7Kyjv8Yf1A1/k7HgcVf667qN8=", "cFUMpcTRO5yJiqUSGH0W+rx8e6FmwwwQMYk9HXcMF50=", "5cl6PeGOxk8ylkXyrKi8eGCyPTUAl8vlR0mhpWokrSY=", "3pI6V71WkxutIHjM0WkuBRhQdfcH4rIgtz/Eg3NETUo=", "VO/ynlJFyNcbFD02zmJvM2Mm5UzEqpS9xgM8dZx4JF0=", "r2VV9zsLHKN1LyQmhqsyIMIF3MZsuxC3Geh/oidHzjk=", "qFks5wqXYAN2/6NiWw9BmDqOK85OYWocXHq2CabxWUg=", "1CSYp0Uxm7lUrq9j7DuYJ9ShY9P8tJVIf9mb9ubOsBs=", "lCWSLVZukVJwp1i7tSNta774H8uCYwvFZoiU+IG48HA=", "TN3oG+6KnCkr9fBEaBUHHyghBPa5AYM2QmDIhyd7PP8=", "yeJj3pYQkMFCH/OfTlCSZvGxI+sDQOuuH20/lxLt7gs=", "tp5gt2QgBd2gmRM5Vhz5vhEC//9CyS41WCVQRpJm/dk=", "+jKVBl9RI6O7U6XYJ+AwciNKMCW+hkgk3R4JtuB+FJA=", "h5VTNNCORtYrwvf9h5wlAx+k3+9SY5/VIETuNnly6Xk=", "++1LMuz3tIdW1/pfEfhPfXC4ot1AwDAXDcPyfibzGyc=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n98180908\nllBJk8Br31u8BNoIfOK++L8lwcRZXa0BM5VW7xu6HCE=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEA2i4Ql6CVpt7gnMTP5tWrN6p+mx3YIs8VZCuZ9nAr2csCIBGzsWrMsQCjhbOwLP6ZgHRCkv/eHf1lzgG/B8EmO6ck\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3YWM5ZTg0ODQ0YmJjMGE1YThmMWY3OWEzN2E2OGIzYjhjYWYyYTU4YjRhYTU5OTljNDkyMjdjYjM2ZTcwZWE2In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURzVmF2REhzWnRkc3cyRk9jZGVvS2g0QWdxSlBkVHVaKy9WdjNBdWdIQ3dnSWdPT3dQK3B3dzFoaHlwUkE5QlYrS1c5bHJIeHNhWWJmbEhjZGgyTUd0ODZzPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZla05EUVd4WFowRjNTVUpCWjBsVlEyaERSR2RSU0ZKQk1VbG5hQzlQYW1KeWNHWjBLMnhuV0c4d2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVVU1RKTlZHY3hUV3BSTWxkb1kwNU5hbFYzVGxSSk1rMVVhM2ROYWxFeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZEV1dweE5WTlNkWFp2V2tGMmRFcEtORFp6YzB0M2FFaERNMGhqWTBZMGFUZzVMMUVLSzNsV2RUZHJVbXgyZEhSeGVubHFTV2RIWlVkSk9WZHJkRkpYVDJjM09FZ3djMGw1ZG5KRlVGTmplamR2U0VSV2IyRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZyUTJSSkNqRTJZVWhQTVhod05YRnZTbWxtU25aaVMzUkZVVXRyZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNkek4zY2pKSlFRcEJRVkZFUVVWbmQxSm5TV2hCU21STmMwSndMM0JxZERBME0xcEhTRlI2VjNjd1owdHRSVk5TWkdVM2FFNU5VVUZpTURGR1oycE1TVUZwUlVFeFZERlpDblZpU1dGcU16ZDVjVXd5Y0hJdlZURXlRa3g2T1VGeVlVMU1XREpyVTNFNWFIY3ZVV2N6YzNkRFoxbEpTMjlhU1hwcU1FVkJkMDFFWVVGQmQxcFJTWGdLUVVsS2J6Wm9WemxwYlcxS1YxTkJSM0V3U0ZCblMxSXJNV0kyUzJ4SmVVcEdiM05LY0RCYWIyTnZkMUEyVmxKeUwwOTNVV2wxUlZoVFVreDNVMHhrU1FvMlowbDNVRkE1Wm5ST1VEVnBhMUZEUldoSU5raEViMjVJU0dJNVNHNUljaTl2UVd4WlRTdHBkbUpTU0Nzd2VEWklhMWw2T0VzeFUwZzJNRVZ0ZVROekNraENlRlFLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "esnoSES7wKWo8feaN6aLO4yvKli0qlmZxJInyzbnDqY="}, "signature": "MEUCIQDsVavDHsZtdsw2FOcdeoKh4AgqJPdTuZ+/Vv3AugHCwgIgOOwP+pww1hhypRA9BV+KW9lrHxsaYbflHcdh2MGt86s="}} diff --git a/Python-3.14.0b3.tar.xz b/Python-3.14.0b3.tar.xz new file mode 100644 index 0000000..7fa5a1d --- /dev/null +++ b/Python-3.14.0b3.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6f48bf51f01f50d87007a445dd7afe4a4c7a87ab482570be924c1ddfd0d3682 +size 23626928 diff --git a/Python-3.14.0b3.tar.xz.sigstore b/Python-3.14.0b3.tar.xz.sigstore new file mode 100644 index 0000000..24411d1 --- /dev/null +++ b/Python-3.14.0b3.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzzCCAlWgAwIBAgIUByJGQuqs91nWmaSz3zDw8u9QrXkwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNjE3MTgzMjM0WhcNMjUwNjE3MTg0MjM0WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQKkvjy/DW6XBsNL4KGhn7Cbq002FEsNX5ib1Iwi1WbfolR8yyD2I0olxG7HmG3bcB7ULI6b41QEgUJNoBG18c6OCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUE5DKgIP1/0qYhsOJ2K9A0QLz34EwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABl38qFpEAAAQDAEgwRgIhAPrfzRQy69XLVERM/SGXe90jKTPdKG+8RCDk3lbQDNsiAiEAwhy9MnhJ3/rTJ3kdFjLNj/1vAf0Svp6LEizf9ZmvbCowCgYIKoZIzj0EAwMDaAAwZQIxAOF+hxPqGCi20YU2FgjlzNc1GzsfasUIUZA4+BUd7sbALI8h6p/bm3EzLCerAawdggIwCLSzarb3Pn0LZrZln9a7Vagbme5MoUQ35VU8yDn10p9ayGwXhHiLgzxxkWU4p14z"}, "tlogEntries": [{"logIndex": "242091651", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1750185154", "inclusionPromise": {"signedEntryTimestamp": "MEUCIEgCIEakIe/cVyoSmGmQGH5sRE+ZAKq+bSXjJR3mBB+2AiEAolJax6DoqlLLSMOqeu3qSJvPtx2DtgAm1V6SQvniZ9c="}, "inclusionProof": {"logIndex": "120187389", "rootHash": "CBZhzRNuYSMIkvqy0+VtKfvWaRrldFCQvLROqwpICJ8=", "treeSize": "120187397", "hashes": ["ZoSBJN7hwnnK+AwaHbj98vodiu0iqsh8l0KBMKa6fnE=", "nwvLeMO7z+S2qyu4wfIQPFR7FPMSZlXwZPCnHFWjh+w=", "CO8xe1g5Ldm4l5MUcIn2pmfgifnYfWiE41S9AhluDaA=", "fwnnvZ/rcmNlH9G74uFshxfK5qeuy4q0w03ecv2A7s8=", "lAzaEU6k8f/W3+t/uhgSqMI78Xb2k9p3SZNxTnIGGNU=", "S/H7ELYDVa/9BZtfi8TmhZSXqQhQlHE2lP7c0FTbzUg=", "c2ZZea0xgwt/gVtpXsIKw6/dMmhBHf2QE4+cGR8Hzxc=", "R1FyFnqsxFAatxvySZLbafflRRbv9Oe5FUwRs70eJTA=", "Dzdf3VUntY5OjGUWVOdNuSvBOlT3oFQ9cEB5XuBItyQ=", "6iXN20rIe5WDiGSbP978s/x+mrYskcF/co21+gqmcrE=", "MXZlUSu/Nk7JpWtrdLdZirJdEm6r3KeotdNfHkWFyM0=", "Xanu/6JDW+tIz/8FFY8TJPCZiE6sjMezuSP4ZfaLcZ4=", "JdwKuHIKaaHCnH9lvllhnLwhBLTmddg+MU5yF4JyNzM=", "kGVUE6qTDBZjmi+ni1oCZ/vG1EIHaX70wibrOLr/kaE=", "K4ASfjQwnhSONRPPue7LdN9Bo2+tUa4Qg8L15TBPj9w=", "hUheZicPpMZOVzj8LjHwP6aJKl9Qi7zGSbQdh4BJHY0=", "ISIUCBBJSSuzXkkGRbwU0pJSpWliMh4Zvol1m+9gd/U=", "63G35ZWA2JgOE3bXu0oKhro3tiR4IDPH1IgMp21/pjk=", "mta5fH/gFwxJ/0fT8yGpn3sFCY0G1RY555Iflm0LInM=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n120187397\nCBZhzRNuYSMIkvqy0+VtKfvWaRrldFCQvLROqwpICJ8=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEAoo5Vm+/1ZUilU42jf+ObfVMSQO5Rll721LfKDwUuyCYCIG8vPw6Z1iAzXj/pNZZjx0pfdfdiLyOJJ9aTWWJE7uIz\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNmY0OGJmNTFmMDFmNTBkODcwMDdhNDQ1ZGQ3YWZlNGE0YzdhODdhYjQ4MjU3MGJlOTI0YzFkZGZkMGQzNjgyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURSVDVjSHBmK21XNHlXUXRtMXluU1hpQzN2bWZjcXlPYWI5S1hpcmVGYVV3SWhBSTBqY1pkczRLUUxVeE4rWGpTcEMxaVhXRDVCRkNvV0JSbGUwNmt5Qk4zWSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZla05EUVd4WFowRjNTVUpCWjBsVlFubEtSMUYxY1hNNU1XNVhiV0ZUZWpONlJIYzRkVGxSY2xocmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVxUlROTlZHZDZUV3BOTUZkb1kwNU5hbFYzVG1wRk0wMVVaekJOYWswd1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZSUzJ0MmFua3ZSRmMyV0VKelRrdzBTMGRvYmpkRFluRXdNREpHUlhOT1dEVnBZakVLU1hkcE1WZGlabTlzVWpoNWVVUXlTVEJ2YkhoSE4waHRSek5pWTBJM1ZVeEpObUkwTVZGRloxVktUbTlDUnpFNFl6WlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZGTlVSTENtZEpVREV2TUhGWmFITlBTakpMT1VFd1VVeDZNelJGZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNNemh4Um5CRlFRcEJRVkZFUVVWbmQxSm5TV2hCVUhKbWVsSlJlVFk1V0V4V1JWSk5MMU5IV0dVNU1HcExWRkJrUzBjck9GSkRSR3N6YkdKUlJFNXphVUZwUlVGM2FIazVDazF1YUVvekwzSlVTak5yWkVacVRFNXFMekYyUVdZd1UzWndOa3hGYVhwbU9WcHRkbUpEYjNkRFoxbEpTMjlhU1hwcU1FVkJkMDFFWVVGQmQxcFJTWGdLUVU5R0syaDRVSEZIUTJreU1GbFZNa1puYW14NlRtTXhSM3B6Wm1GelZVbFZXa0UwSzBKVlpEZHpZa0ZNU1Rob05uQXZZbTB6UlhwTVEyVnlRV0YzWkFwblowbDNRMHhUZW1GeVlqTlFiakJNV25KYWJHNDVZVGRXWVdkaWJXVTFUVzlWVVRNMVZsVTRlVVJ1TVRCd09XRjVSM2RZYUVocFRHZDZlSGhyVjFVMENuQXhOSG9LTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "xvSL9R8B9Q2HAHpEXdev5KTHqHq0glcL6STB3f0NNoI="}, "signature": "MEYCIQDRT5cHpf+mW4yWQtm1ynSXiC3vmfcqyOab9KXireFaUwIhAI0jcZds4KQLUxN+XjSpC1iXWD5BFCoWBRle06kyBN3Y"}} diff --git a/Python-3.14.0b4.tar.xz b/Python-3.14.0b4.tar.xz new file mode 100644 index 0000000..97dd738 --- /dev/null +++ b/Python-3.14.0b4.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15e123e056abebba6de5e73cfa304459a8c82cafa85d4fc7fc6de80e6a3e1b39 +size 23641472 diff --git a/Python-3.14.0b4.tar.xz.sigstore b/Python-3.14.0b4.tar.xz.sigstore new file mode 100644 index 0000000..0f60224 --- /dev/null +++ b/Python-3.14.0b4.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlWgAwIBAgIUT48RF6npcck0rRmxkqTaG9Or3qUwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNzA4MTQzNjQyWhcNMjUwNzA4MTQ0NjQyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEebAuMrXCnwY+hsb1BDZPCK3A857oEvPZjevT5RLw8UPnZjRDXSl1Fp08UAoxVo/Qu11FfI5mCBIfc6r2Bj068aOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUfy2PHyIW/wU6MTtSRQIzVH0FKuQwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABl+p3tB8AAAQDAEgwRgIhAJuuLIOE/o/NAiYOHyS9d2LjMDr8DO/KEZC0kFzP8+izAiEA1EY04vs/PFmoka6tAYTTJG5gPEDZR9hyqx/KeEY/IxEwCgYIKoZIzj0EAwMDZwAwZAIwUI/drqwZevX8EYxWiFcAL0j4tdqpXVCe6Q0TPh4HDYk2ijDraD62SCPJ46155ldyAjAmelWuovAngtvJbreutLlYYKyN9/igss10cHFnCuacv0HnYn6pywjw3rScmE1ZBOM="}, "tlogEntries": [{"logIndex": "267629319", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1751985403", "inclusionPromise": {"signedEntryTimestamp": "MEUCIHbaXZ1i3oqO72l+0yflNPt3MNAmoWHOrOYcr4amnfXPAiEA21G4Y7P1zMGxHYRrWe0pWa1aNS7JUNTLdgilJm8U9t4="}, "inclusionProof": {"logIndex": "145725057", "rootHash": "VBWKwFeWo524I5tIT3Q03TTxvObEBuPldP+XMmfpOJc=", "treeSize": "145725060", "hashes": ["lJQvHmDpH0QcWfxNpvH6OIXT8dbwQObiiTkcxU7D9e8=", "IkSIJdHonH4ThZfDX8DuMgtGUt3lftTUTdVPj3Y1G5Q=", "/9uINvH+F7vJ1lvXo9HU3sX5HyYBjYJY9IM9UDmYnbM=", "VNGopQ0M3y/LPw7jffS64v+aUUkRh9bGBPDgG8Qau+Q=", "hG9rk8tTcwrsSdhKU7PuC/sHFgTE32yvQeW9npwaqWM=", "JLqqKsHm5b2b6Y7UZuqFcNW/n3FMsNjpWjivf335VQA=", "l4RGx+OiSYvZTpYtgcrkyrOUDpAMhyyvXn32gXUx27E=", "LN7hUuDukSLLCkX5jaLItZYjW4e5WXDEg8giXPsQpg8=", "WtcOz5e7TRSF0NwzMg//1vAB4hRCE4NYrw2n2YLYVoM=", "D+uGvzTUBj/AQJxDnQNeah4TzAebQ8+9OBZLgKjnRng=", "3RuoGJ+2PhEDRSX8TWc7dnrrFpo5fjk/oIVgELBriwY=", "/Jfk3uSydzbLPA4WSDlYb9Z/cgqYxtKJ45yl7itQ+ic=", "Wub6kzKW/gB6+wr8jLx/QtmTfd3P5D512xkwNUoOSRk=", "wLANT0NMxIRh/p5rRcam4MppSIbUXIfT1Ht9FQA2XnI="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n145725060\nVBWKwFeWo524I5tIT3Q03TTxvObEBuPldP+XMmfpOJc=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAQcdqF0pF87IU9G14wOvcpke2asUszClPPSdQl8t6v/wIgUZEEf1z+uXD2TqKP4K1ZmJVTWDk3jumagQRRtbRyxAs=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIxNWUxMjNlMDU2YWJlYmJhNmRlNWU3M2NmYTMwNDQ1OWE4YzgyY2FmYTg1ZDRmYzdmYzZkZTgwZTZhM2UxYjM5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQlNVQjhPVjlqTy9nTzhucFI3VGxETFJCTlhXaCttc1RldHE3dzNQbkR1UUFpRUErMTlzYjFhUW1CM0Z5SmkycEFRMFM0S3ZXNUR6RXFYOXp3dWNla2VsQUw0PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4WFowRjNTVUpCWjBsVlZEUTRVa1kyYm5Calkyc3djbEp0ZUd0eFZHRkhPVTl5TTNGVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDU2UVRSTlZGRjZUbXBSZVZkb1kwNU5hbFYzVG5wQk5FMVVVVEJPYWxGNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZsWWtGMVRYSllRMjUzV1N0b2MySXhRa1JhVUVOTE0wRTROVGR2UlhaUVdtcGxkbFFLTlZKTWR6aFZVRzVhYWxKRVdGTnNNVVp3TURoVlFXOTRWbTh2VVhVeE1VWm1TVFZ0UTBKSlptTTJjakpDYWpBMk9HRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZtZVRKUUNraDVTVmN2ZDFVMlRWUjBVMUpSU1hwV1NEQkdTM1ZSZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNLM0F6ZEVJNFFRcEJRVkZFUVVWbmQxSm5TV2hCU25WMVRFbFBSUzl2TDA1QmFWbFBTSGxUT1dReVRHcE5SSEk0UkU4dlMwVmFRekJyUm5wUU9DdHBla0ZwUlVFeFJWa3dDalIyY3k5UVJtMXZhMkUyZEVGWlZGUktSelZuVUVWRVdsSTVhSGx4ZUM5TFpVVlpMMGw0UlhkRFoxbEpTMjlhU1hwcU1FVkJkMDFFV25kQmQxcEJTWGNLVlVrdlpISnhkMXBsZGxnNFJWbDRWMmxHWTBGTU1HbzBkR1J4Y0ZoV1EyVTJVVEJVVUdnMFNFUlphekpwYWtSeVlVUTJNbE5EVUVvME5qRTFOV3hrZVFwQmFrRnRaV3hYZFc5MlFXNW5kSFpLWW5KbGRYUk1iRmxaUzNsT09TOXBaM056TVRCalNFWnVRM1ZoWTNZd1NHNVpialp3ZVhkcWR6TnlVMk50UlRGYUNrSlBUVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "FeEj4Far67pt5ec8+jBEWajILK+oXU/H/G3oDmo+Gzk="}, "signature": "MEUCIBSUB8OV9jO/gO8npR7TlDLRBNXWh+msTetq7w3PnDuQAiEA+19sb1aQmB3FyJi2pAQ0S4KvW5DzEqX9zwucekelAL4="}} diff --git a/Python-3.14.0rc1.tar.xz b/Python-3.14.0rc1.tar.xz new file mode 100644 index 0000000..79d6716 --- /dev/null +++ b/Python-3.14.0rc1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8707780ae9f19c5bf5b9f27827181ba11cdad7bb292ea49cad5424331e40ee8b +size 23661916 diff --git a/Python-3.14.0rc1.tar.xz.sigstore b/Python-3.14.0rc1.tar.xz.sigstore new file mode 100644 index 0000000..a018dee --- /dev/null +++ b/Python-3.14.0rc1.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlOgAwIBAgIUdd8Nx/fQW+uFwmE/iUr4kZfPhYAwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNzIyMTg1ODAyWhcNMjUwNzIyMTkwODAyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfsWgKoIKVbY0hNXKG8Zj2NxMgIzBIBkiPUHMxv07NxzE/XxK88SKPh3h12yIH6JUjxbOHbT0ssdy++5hJKXp2qOCAXIwggFuMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUoI7k3LZWDSJYSZc0N3Hv2r0AmXUwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABmDN/+94AAAQDAEYwRAIgTWnzXuzYUkeZC3JqfGd3Oly1wUFVpL8WLDbAVY8X1cICIEa/Oa16EIjIY72RbdpVBnJZzkP+KSEmv8FAZXniZK9/MAoGCCqGSM49BAMDA2kAMGYCMQC3APqICLinna3xOyQgpaQBzhuVnqxhlcEXgPMNJSzVd9zBKPATEIg5omaAryLZnRYCMQCz0crFmeNQpCFqTD4CPQyPciWKnp59irTy6DyLxAAucY8zka8mpkUozq5B19rqynQ="}, "tlogEntries": [{"logIndex": "302609759", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1753210682", "inclusionPromise": {"signedEntryTimestamp": "MEQCIDm0AZXn9C5yMWTEaBUVvO8Y6Xk/YBTtB+OPrl2fzdZrAiBYCmISH8sx8G5+HkYoGzgqZQRHSsbJBowWzZgvr//yVQ=="}, "inclusionProof": {"logIndex": "180705497", "rootHash": "EvMBuCgM4SESVaa95s8M/1bCdGKsWUzG4TsyMWZBtZc=", "treeSize": "180705504", "hashes": ["usmhE+uQ6Xgu9KJntJljw1FnnK3kRsexzQ+P7NIj2o0=", "c/qDV+bvaEgbBXtU1oUBbhLLdWedEud3CxhgsAt0cpc=", "PIkWaNlCl7teBondUwN7+xzWSmlX7EKC1viOefX0WQg=", "k46hbMh2nnDRaBUo81gBlFOScHPrTEXM0eYO4wd4We0=", "JltBeOV/z1XKpcvkfKsKEzifRaavT9DioO8vhkBHaNo=", "tkZqbm7tJo5HXychVpFLhR6H8FUaGhs4n7y2oKw2AnE=", "6/DlAJpt7oJU7PDKiNosXtLiJcLT2bIxagp/GbXbIX0=", "mPlI7tl4EiMHvUqKga7G9mEAMnAtCSKpD4hSbKSkBmw=", "TYFYy4quP+zFCLjdVj6xMsYgFjihtGK9XPdJ+YEX/m0=", "3m7vEGcH91GfZrtO8pTLAsvbxCChxcYUpM3zcC4aTBY=", "eXthxH/NJrHSD0Ii37odpnwTNQPBumMo1q0nK6TxImk=", "iogV552ADppSjZcABXSLxhclXNJzQsAWcMc9y/Vs9vk=", "aiJG7xq94AFTfW/qXktvWGzxHfWHz+XR/VuefwZbciE=", "iR2mIeu/7jQ4TXDRGbULJSgzFAWIyMmQiPrz7EjqFcg=", "HouMZeE2XjlPmxVnP7fw6rUjyw+RRQ8qbLEEKlq2uOA=", "wLANT0NMxIRh/p5rRcam4MppSIbUXIfT1Ht9FQA2XnI="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n180705504\nEvMBuCgM4SESVaa95s8M/1bCdGKsWUzG4TsyMWZBtZc=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiAWXPgGSmMzZbxdHMffj0TSXmYgLMNM1ZtScQ0gtUg/9AIhALFQzvFSpPF4P+n6FCCaeXeUqpJMUuDJ6egOmMLnEKKV\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI4NzA3NzgwYWU5ZjE5YzViZjViOWYyNzgyNzE4MWJhMTFjZGFkN2JiMjkyZWE0OWNhZDU0MjQzMzFlNDBlZThiIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURId3FqWEZyUGlpSEM5dkoycXlPNEhyRmFYWUF2WUgrS3BaZjdhRm8xOVVBSWhBSXc1ZzJRY1oya1hWd2szN3EzdEc0V1NqRkx1TzF1ay9TdDhjYi9oMnUyVSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4UFowRjNTVUpCWjBsVlpHUTRUbmd2WmxGWEszVkdkMjFGTDJsVmNqUnJXbVpRYUZsQmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDU2U1hsTlZHY3hUMFJCZVZkb1kwNU5hbFYzVG5wSmVVMVVhM2RQUkVGNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZtYzFkblMyOUpTMVppV1RCb1RsaExSemhhYWpKT2VFMW5TWHBDU1VKcmFWQlZTRTBLZUhZd04wNTRla1V2V0hoTE9EaFRTMUJvTTJneE1ubEpTRFpLVldwNFlrOUlZbFF3YzNOa2VTc3JOV2hLUzFod01uRlBRMEZZU1hkblowWjFUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZ2U1RkckNqTk1XbGRFVTBwWlUxcGpNRTR6U0hZeWNqQkJiVmhWZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVZGWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpjS1FraHJRV1IzUWpGQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnRSRTR2S3prMFFRcEJRVkZFUVVWWmQxSkJTV2RVVjI1NldIVjZXVlZyWlZwRE0wcHhaa2RrTTA5c2VURjNWVVpXY0V3NFYweEVZa0ZXV1RoWU1XTkpRMGxGWVM5UFlURTJDa1ZKYWtsWk56SlNZbVJ3VmtKdVNscDZhMUFyUzFORmJYWTRSa0ZhV0c1cFdrczVMMDFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbXRCVFVkWlEwMVJRek1LUVZCeFNVTk1hVzV1WVRONFQzbFJaM0JoVVVKNmFIVldibkY0YUd4alJWaG5VRTFPU2xONlZtUTVla0pMVUVGVVJVbG5OVzl0WVVGeWVVeGFibEpaUXdwTlVVTjZNR055Um0xbFRsRndRMFp4VkVRMFExQlJlVkJqYVZkTGJuQTFPV2x5VkhrMlJIbE1lRUZCZFdOWk9IcHJZVGh0Y0d0VmIzcHhOVUl4T1hKeENubHVVVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "hwd4CunxnFv1ufJ4JxgboRza17spLqScrVQkMx5A7os="}, "signature": "MEYCIQDHwqjXFrPiiHC9vJ2qyO4HrFaXYAvYH+KpZf7aFo19UAIhAIw5g2QcZ2kXVwk37q3tG4WSjFLuO1uk/St8cb/h2u2U"}} diff --git a/Python-3.14.0rc2.tar.xz b/Python-3.14.0rc2.tar.xz new file mode 100644 index 0000000..bdef8ce --- /dev/null +++ b/Python-3.14.0rc2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc62854cf232345bd22c9091a68464e01e056c6473a3fffa84572c8a342da656 +size 23566140 diff --git a/Python-3.14.0rc2.tar.xz.sigstore b/Python-3.14.0rc2.tar.xz.sigstore new file mode 100644 index 0000000..f82b630 --- /dev/null +++ b/Python-3.14.0rc2.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzzCCAlWgAwIBAgIUQEKlmQNoiRh225QSksqkOM8IenYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwODE0MTYxMzQ5WhcNMjUwODE0MTYyMzQ5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzLzYWrCTywpp57eT75o3g3u6mOfvUPEMby52aGbaPWs6j4uhVv7mk94AHJ749z2LBWt2TKEEjBsH9JQcSt7+6qOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUIX8DXq8+NzGXp255fluKplNtcZowHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABmKlb6QAAAAQDAEgwRgIhAOpd5jpOMj0+E4zoUZknrn/0le429dCWtvrHqIkUcM3pAiEAyznt+7Rvlhx3bP0EcJe0LCtLO1KW2akdk1VoE2Lb+g4wCgYIKoZIzj0EAwMDaAAwZQIxAOaIcKm8k3VYCA/RFC6KO5i4yoxZLFFhjcydtPYyKetokpzUC5yZKkIRl3hySNaf5QIwKfloit/Poo4P3JOYhjSWK7qIJKF1r/5ZZWnvBpKhURIiFxQx7s9kL01MPCgRUeoa"}, "tlogEntries": [{"logIndex": "394682202", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1755188030", "inclusionPromise": {"signedEntryTimestamp": "MEUCIAavOG9MuKTYRE4q0Fns77HsUjPrRZ1bISheGxlDgbNZAiEA89315EfGt+C+C5GkBDLYMSr6bXkxXzT9PWgE56yVYYk="}, "inclusionProof": {"logIndex": "272777940", "rootHash": "94fZD9GTMc7ctVFYACd2ZmRetfuK9mpq5+VMWJJwmak=", "treeSize": "272777950", "hashes": ["izf5arJPLLyctcMaEwaxxYH8VGWnw9xsgWX3S2WpEV0=", "jARpwTi7gTCzrOOaEjEoCS/kS2bSHKmaNlWm6yut4Yo=", "6sOUCbaiDMXdWNdb4hzsJHyMl1sT3ib1ZC9ztLiug34=", "PNNoFA8l82Dr10vRBqmpGmJ4NBff8yyEzZceO2roeMA=", "xDogK8v4jzKZw6K+weJL+I415z4YGKlaNYbpu4pIHJw=", "RhKVrhK6HuUb1JRqZW25xWciggk7FUc5UKgfyA1w2cI=", "diHzb0EkmL9xXR57YrJSHiTf0lPiHRm1YiCBvr6u+Yk=", "VFCarORkpugC03FeEE1qleQGuDOGuNw1cHLdsQRQNOc=", "SQrQA1o0sqMm1AvDow2P8FTn8h2ANcuz3QfFE1PJuk0=", "TlYW0zjr+tiOJcOsfXER0SPRMMqX0hniotB3gsI+t5o=", "W+k28CiT95aBszrjZFbfyGpEsCOH+n3gc9sBqBw5vqs=", "vS7O4ozHIQZJWBiov+mkpI27GE8zAmVCEkRcP3NDyNE="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n272777950\n94fZD9GTMc7ctVFYACd2ZmRetfuK9mpq5+VMWJJwmak=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAPQipm3l7c4F/4rKjw7KOGX//0IM93z657ckzFBHd5TgIgJQscKWLcVlFhrZO7/8E8ywgLhOeDZeu0ltQlEaFFv8g=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJiYzYyODU0Y2YyMzIzNDViZDIyYzkwOTFhNjg0NjRlMDFlMDU2YzY0NzNhM2ZmZmE4NDU3MmM4YTM0MmRhNjU2In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQlgvR2hwOG45TUhNTHdCc3lOR2RSZUwwNjFGVFIzb3A2ZmhXTWw2YXQ3L0FpQURtWEtaWXBFNDZqUk1UMTJjYk92cTVHcEZBLzQ1Tzh6MUV2VDRiK3hGRlE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZla05EUVd4WFowRjNTVUpCWjBsVlVVVkxiRzFSVG05cFVtZ3lNalZSVTJ0emNXdFBUVGhKWlc1WmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDlFUlRCTlZGbDRUWHBSTlZkb1kwNU5hbFYzVDBSRk1FMVVXWGxOZWxFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVY2VEhwWlYzSkRWSGwzY0hBMU4yVlVOelZ2TTJjemRUWnRUMloyVlZCRlRXSjVOVElLWVVkaVlWQlhjelpxTkhWb1ZuWTNiV3M1TkVGSVNqYzBPWG95VEVKWGRESlVTMFZGYWtKelNEbEtVV05UZERjck5uRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZKV0RoRUNsaHhPQ3RPZWtkWWNESTFOV1pzZFV0d2JFNTBZMXB2ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnRTMnhpTmxGQlFRcEJRVkZFUVVWbmQxSm5TV2hCVDNCa05XcHdUMDFxTUN0Rk5IcHZWVnByYm5KdUx6QnNaVFF5T1dSRFYzUjJja2h4U1d0VlkwMHpjRUZwUlVGNWVtNTBDaXMzVW5ac2FIZ3pZbEF3UldOS1pUQk1RM1JNVHpGTFZ6SmhhMlJyTVZadlJUSk1ZaXRuTkhkRFoxbEpTMjlhU1hwcU1FVkJkMDFFWVVGQmQxcFJTWGdLUVU5aFNXTkxiVGhyTTFaWlEwRXZVa1pETmt0UE5XazBlVzk0V2t4R1JtaHFZM2xrZEZCWmVVdGxkRzlyY0hwVlF6VjVXa3RyU1ZKc00yaDVVMDVoWmdvMVVVbDNTMlpzYjJsMEwxQnZielJRTTBwUFdXaHFVMWRMTjNGSlNrdEdNWEl2TlZwYVYyNTJRbkJMYUZWU1NXbEdlRkY0TjNNNWEwd3dNVTFRUTJkU0NsVmxiMkVLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "vGKFTPIyNFvSLJCRpoRk4B4FbGRzo//6hFcsijQtplY="}, "signature": "MEQCIBX/Ghp8n9MHMLwBsyNGdReL061FTR3op6fhWMl6at7/AiADmXKZYpE46jRMT12cbOvq5GpFA/45O8z1EvT4b+xFFQ=="}} diff --git a/README.SUSE b/README.SUSE new file mode 100644 index 0000000..0053bcf --- /dev/null +++ b/README.SUSE @@ -0,0 +1,43 @@ +Python 3 in SUSE +============== + +* Subpackages * + +Python 3 is split into several subpackages, based on external dependencies. +The main package 'python3' has soft dependencies on all subpackages needed to +assemble the standard library; however, these might not all be installed by default. + +If you attempt to import a module that is currently not installed, an ImportError is thrown, +with instructions to install the missing subpackage. Installing the subpackage might result +in installing libraries that the subpackage requires to function. + + +* ensurepip * + +The 'ensurepip' module from Python 3 standard library (PEP 453) is supposed to deploy +a bundled copy of the pip installer. This makes no sense in a managed distribution like SUSE. +Instead, you need to install package 'python3-pip'. Usually this will be installed automatically +with 'python3'. + +Using 'ensurepip' when pip is not installed will result in an ImportError with instructions +to install 'python3-pip'. + + +* Documentation * + +You can find documentation in seprarate packages: python3-doc and +python3-doc-pdf. These contan following documents: + + Tutorial, What's New in Python, Global Module Index, Library Reference, + Macintosh Module Reference, Installing Python Modules, Distributing Python + Modules, Language Reference, Extending and Embedding, Python/C API, + Documenting Python + +The python3-doc package constains many text files from source tarball. + + +* Interactive mode * + +Interactive mode is by default enhanced with of history and command completion. +If you don't like these features, you can unset the PYTHONSTARTUP variable +in your .profile or disable it system wide in /etc/profile.d/python.sh. diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..6fef3f5 --- /dev/null +++ b/_multibuild @@ -0,0 +1,6 @@ + + base + doc + nogil + nogil-base + diff --git a/baselibs.conf b/baselibs.conf new file mode 100644 index 0000000..d43116d --- /dev/null +++ b/baselibs.conf @@ -0,0 +1,3 @@ +python314-base +python314 +libpython3_14-1_0 diff --git a/bluez-devel-vendor.tar.xz b/bluez-devel-vendor.tar.xz new file mode 100644 index 0000000..bb4fd89 --- /dev/null +++ b/bluez-devel-vendor.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4624c6ab6543ec4875bdd5c6c58c874d487128e44e54c8ef1924ec1d48e35928 +size 25328 diff --git a/bpo-31046_ensurepip_honours_prefix.patch b/bpo-31046_ensurepip_honours_prefix.patch new file mode 100644 index 0000000..a962e30 --- /dev/null +++ b/bpo-31046_ensurepip_honours_prefix.patch @@ -0,0 +1,175 @@ +From 5754521af1d51aa8e445cba07a093bbc0c88596d Mon Sep 17 00:00:00 2001 +From: Zackery Spytz +Date: Mon, 16 Dec 2019 18:24:08 -0700 +Subject: [PATCH] bpo-31046: ensurepip does not honour the value of $(prefix) + +Co-Authored-By: Xavier de Gaye +--- + Doc/library/ensurepip.rst | 12 +++++- + Lib/ensurepip/__init__.py | 18 +++++++--- + Lib/test/test_ensurepip.py | 11 ++++++ + Makefile.pre.in | 4 +- + Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst | 1 + 5 files changed, 37 insertions(+), 9 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst + +Index: Python-3.14.0rc1/Doc/library/ensurepip.rst +=================================================================== +--- Python-3.14.0rc1.orig/Doc/library/ensurepip.rst 2025-07-22 18:42:44.000000000 +0200 ++++ Python-3.14.0rc1/Doc/library/ensurepip.rst 2025-07-23 10:10:31.690342385 +0200 +@@ -61,7 +61,11 @@ + By default, ``pip`` is installed into the current virtual environment + (if one is active) or into the system site packages (if there is no + active virtual environment). The installation location can be controlled +-through two additional command line options: ++through some additional command line options: ++ ++.. option:: --prefix ++ ++ Installs ``pip`` using the given directory prefix. + + .. option:: --root + +@@ -102,7 +106,7 @@ + Returns a string specifying the available version of pip that will be + installed when bootstrapping an environment. + +-.. function:: bootstrap(root=None, upgrade=False, user=False, \ ++.. function:: bootstrap(root=None, prefix=None, upgrade=False, user=False, \ + altinstall=False, default_pip=False, \ + verbosity=0) + +@@ -112,6 +116,8 @@ + If *root* is ``None``, then installation uses the default install location + for the current environment. + ++ *prefix* specifies the directory prefix to use when installing. ++ + *upgrade* indicates whether or not to upgrade an existing installation + of an earlier version of ``pip`` to the available version. + +@@ -132,6 +138,8 @@ + *verbosity* controls the level of output to :data:`sys.stdout` from the + bootstrapping operation. + ++ .. versionchanged:: 3.9 the *prefix* parameter was added. ++ + .. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap + + .. note:: +Index: Python-3.14.0rc1/Lib/ensurepip/__init__.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/ensurepip/__init__.py 2025-07-23 10:10:18.541751619 +0200 ++++ Python-3.14.0rc1/Lib/ensurepip/__init__.py 2025-07-23 10:10:31.690818287 +0200 +@@ -106,27 +106,27 @@ + os.environ['PIP_CONFIG_FILE'] = os.devnull + + +-def bootstrap(*, root=None, upgrade=False, user=False, ++def bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). ++ and directory prefix). + + Note that calling this function will alter both sys.path and os.environ. + """ + # Discard the return value +- _bootstrap(root=root, upgrade=upgrade, user=user, ++ _bootstrap(root=root, prefix=prefix, upgrade=upgrade, user=user, + altinstall=altinstall, default_pip=default_pip, + verbosity=verbosity) + + +-def _bootstrap(*, root=None, upgrade=False, user=False, ++def _bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). Returns pip command status code. ++ and directory prefix). Returns pip command status code. + + Note that calling this function will alter both sys.path and os.environ. + """ +@@ -162,6 +162,8 @@ + args = ["install", "--no-cache-dir", "--no-index", "--find-links", tmpdir] + if root: + args += ["--root", root] ++ if prefix: ++ args += ["--prefix", prefix] + if upgrade: + args += ["--upgrade"] + if user: +@@ -238,6 +240,11 @@ + help="Install everything relative to this alternate root directory.", + ) + parser.add_argument( ++ "--prefix", ++ default=None, ++ help="Install everything using this prefix.", ++ ) ++ parser.add_argument( + "--altinstall", + action="store_true", + default=False, +@@ -256,6 +263,7 @@ + + return _bootstrap( + root=args.root, ++ prefix=args.prefix, + upgrade=args.upgrade, + user=args.user, + verbosity=args.verbosity, +Index: Python-3.14.0rc1/Lib/test/test_ensurepip.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/test/test_ensurepip.py 2025-07-23 10:10:19.969641992 +0200 ++++ Python-3.14.0rc1/Lib/test/test_ensurepip.py 2025-07-23 10:10:31.691217643 +0200 +@@ -100,6 +100,17 @@ + unittest.mock.ANY, + ) + ++ def test_bootstrapping_with_prefix(self): ++ ensurepip.bootstrap(prefix="/foo/bar/") ++ self.run_pip.assert_called_once_with( ++ [ ++ "install", "--no-cache-dir", "--no-index", "--find-links", ++ unittest.mock.ANY, "--prefix", "/foo/bar/", ++ "pip", ++ ], ++ unittest.mock.ANY, ++ ) ++ + def test_bootstrapping_with_user(self): + ensurepip.bootstrap(user=True) + +Index: Python-3.14.0rc1/Makefile.pre.in +=================================================================== +--- Python-3.14.0rc1.orig/Makefile.pre.in 2025-07-23 10:10:27.325708066 +0200 ++++ Python-3.14.0rc1/Makefile.pre.in 2025-07-23 10:10:31.691716104 +0200 +@@ -2371,7 +2371,7 @@ + install|*) ensurepip="" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + .PHONY: altinstall +@@ -2382,7 +2382,7 @@ + install|*) ensurepip="--altinstall" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + .PHONY: commoninstall +Index: Python-3.14.0rc1/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ Python-3.14.0rc1/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst 2025-07-23 10:10:31.692253536 +0200 +@@ -0,0 +1 @@ ++A directory prefix can now be specified when using :mod:`ensurepip`. diff --git a/bsc1243155-sphinx-non-determinism.patch b/bsc1243155-sphinx-non-determinism.patch new file mode 100644 index 0000000..6dc78a0 --- /dev/null +++ b/bsc1243155-sphinx-non-determinism.patch @@ -0,0 +1,45 @@ +From 906a590df191f66f4f0c4a70e3edb6fd82c156ef Mon Sep 17 00:00:00 2001 +From: Daniel Garcia Moreno +Date: Tue, 1 Jul 2025 12:13:28 +0200 +Subject: [PATCH] Doc: Generate ids for audit_events using docname + +This patch generates ids for audit_events using the docname so the id is +not global but depend on the source file. This make the doc build +reproducible with multiple cores because it doesn't which file is parsed +first, the id for audit_events will always be consistent independently +of what file is parsed first. + +https://github.com/python/cpython/issues/130979 +--- + Doc/tools/extensions/audit_events.py | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +Index: Python-3.14.0b3/Doc/tools/extensions/audit_events.py +=================================================================== +--- Python-3.14.0b3.orig/Doc/tools/extensions/audit_events.py 2025-06-17 17:40:54.000000000 +0200 ++++ Python-3.14.0b3/Doc/tools/extensions/audit_events.py 2025-07-02 15:06:57.802539821 +0200 +@@ -68,8 +68,13 @@ + logger.warning(msg) + return + +- def id_for(self, name) -> str: +- source_count = len(self.sources.get(name, set())) ++ def _source_count(self, name, docname) -> int: ++ """Count the event name in the same source""" ++ sources = self.sources.get(name, set()) ++ return len([s for s, t in sources if s == docname]) ++ ++ def id_for(self, name, docname) -> str: ++ source_count = self._source_count(name, docname) + name_clean = re.sub(r"\W", "_", name) + return f"audit_event_{name_clean}_{source_count}" + +@@ -142,7 +147,7 @@ + except (IndexError, TypeError): + target = None + if not target: +- target = self.env.audit_events.id_for(name) ++ target = self.env.audit_events.id_for(name, self.env.docname) + ids.append(target) + self.env.audit_events.add_event(name, args, (self.env.docname, target)) + diff --git a/externally_managed.in b/externally_managed.in new file mode 100644 index 0000000..54606b6 --- /dev/null +++ b/externally_managed.in @@ -0,0 +1,12 @@ +[externally-managed] +Error=To install Python packages system-wide, try + zypper install __PYTHONPREFIX__-xyz, where xyz is the package + you are trying to install. + + If you wish to install a non-rpm packaged Python package, + create a virtual environment using __PYTHON__ -m venv path/to/venv. + Then use path/to/venv/bin/python and path/to/venv/bin/pip. + + If you wish to install a non-rpm packaged Python application, + it may be easiest to use `pipx install xyz`, which will manage a + virtual environment for you. Install pipx via `zypper install __PYTHONPREFIX__-pipx` . diff --git a/fix-test-recursion-limit-15.6.patch b/fix-test-recursion-limit-15.6.patch new file mode 100644 index 0000000..59d2d51 --- /dev/null +++ b/fix-test-recursion-limit-15.6.patch @@ -0,0 +1,34 @@ +--- + Lib/test/test_compile.py | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: Python-3.14.0b3/Lib/test/test_compile.py +=================================================================== +--- Python-3.14.0b3.orig/Lib/test/test_compile.py 2025-06-22 00:32:01.975698954 +0200 ++++ Python-3.14.0b3/Lib/test/test_compile.py 2025-06-22 00:32:07.740981155 +0200 +@@ -24,6 +24,9 @@ + from test.support.bytecode_helper import instructions_with_positions + from test.support.os_helper import FakePath + ++IS_SLE_15_6 = os.environ.get("SLE_VERSION", "") == "0150700" ++IS_32bit = hasattr(os, "uname") and os.uname().machine in ["i386", "i486", "i586", "i686"] ++ + class TestSpecifics(unittest.TestCase): + + def compile_single(self, source): +@@ -120,6 +123,7 @@ + self.assertEqual(d['z'], 12) + + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") ++ @unittest.skipIf(IS_SLE_15_6 and IS_32bit, "fails on 15.6 i586") + @support.skip_emscripten_stack_overflow() + def test_extended_arg(self): + repeat = 100 +@@ -709,6 +713,7 @@ + + @support.cpython_only + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") ++ @unittest.skipIf(IS_SLE_15_6 and IS_32bit, "fails on 15.6 i586") + @support.skip_emscripten_stack_overflow() + def test_compiler_recursion_limit(self): + # Compiler frames are small diff --git a/fix_test_ftp_error.patch b/fix_test_ftp_error.patch new file mode 100644 index 0000000..721f118 --- /dev/null +++ b/fix_test_ftp_error.patch @@ -0,0 +1,40 @@ +--- + Lib/test/test_urllib2.py | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/Lib/test/test_urllib2.py ++++ b/Lib/test/test_urllib2.py +@@ -1,3 +1,4 @@ ++import logging + import unittest + from test import support + from test.support import os_helper +@@ -29,6 +30,10 @@ import http.client + + support.requires_working_socket(module=True) + ++logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', ++ level=logging.DEBUG) ++log = logging.getLogger() ++ + # XXX + # Request + # CacheFTPHandler (hard to write) +@@ -731,6 +736,9 @@ def sanepathname2url(path): + + class HandlerTests(unittest.TestCase): + ++ def setUp(self): ++ log.debug('Is network available: {}'.format(support.is_resource_enabled('network'))) ++ + def test_ftp(self): + class MockFTPWrapper: + def __init__(self, data): +@@ -794,6 +802,7 @@ class HandlerTests(unittest.TestCase): + self.assertEqual(headers.get("Content-type"), mimetype) + self.assertEqual(int(headers["Content-length"]), len(data)) + ++ @support.requires_resource('network') + def test_ftp_error(self): + class ErrorFTPHandler(urllib.request.FTPHandler): + def __init__(self, exception): diff --git a/fix_test_generated_data.patch b/fix_test_generated_data.patch new file mode 100644 index 0000000..0cb8569 --- /dev/null +++ b/fix_test_generated_data.patch @@ -0,0 +1,34 @@ +--- + Lib/test/test_ctypes/test_generated_structs.py | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/Lib/test/test_ctypes/test_generated_structs.py ++++ b/Lib/test/test_ctypes/test_generated_structs.py +@@ -12,6 +12,7 @@ Run this module to regenerate the files: + import unittest + from test.support import import_helper + import re ++import sys + from dataclasses import dataclass + from functools import cached_property + +@@ -21,6 +22,11 @@ from ctypes import sizeof, alignment, po + _ctypes_test = import_helper.import_module("_ctypes_test") + + ++def is_32bit(): ++ # or alternatively (slightly slower) ++ # (struct.calcsize("P") * 8) == 32 ++ return not (sys.maxsize > 2**32) ++ + # ctypes erases the difference between `c_int` and e.g.`c_int16`. + # To keep it, we'll use custom subclasses with the C name stashed in `_c_name`: + class c_bool(ctypes.c_bool): +@@ -415,6 +421,7 @@ class AnonBitfields(Structure): + + + class GeneratedTest(unittest.TestCase): ++ @unittest.skipIf(is_32bit(), 'fails on 32bit platform (gh#python/cpython#121938)') + def test_generated_data(self): + """Check that a ctypes struct/union matches its C equivalent. + diff --git a/gh125535-Lib_IntVector_Intrinsics_vec128.patch b/gh125535-Lib_IntVector_Intrinsics_vec128.patch new file mode 100644 index 0000000..40ba90e --- /dev/null +++ b/gh125535-Lib_IntVector_Intrinsics_vec128.patch @@ -0,0 +1,37 @@ +From 091fd6240c6b263d848e8a5d20da042258f648b5 Mon Sep 17 00:00:00 2001 +From: Jonathan Protzenko +Date: Thu, 10 Oct 2024 11:59:06 +0200 +Subject: [PATCH 1/2] Try for Debian x86 + +--- + Misc/sbom.spdx.json | 4 ++-- + Modules/_hacl/libintvector.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- a/Misc/sbom.spdx.json ++++ b/Misc/sbom.spdx.json +@@ -804,11 +804,11 @@ + "checksums": [ + { + "algorithm": "SHA1", +- "checksumValue": "d5d85ee8f0bd52781fe470d0bf73ec388ddb3999" ++ "checksumValue": "f4a33ad535768b860362ab0bd033a70da0b524b7" + }, + { + "algorithm": "SHA256", +- "checksumValue": "9a421b998add98fe366374641c4edb27617ff539a59f0963879f345065d3d39d" ++ "checksumValue": "433cdf4ba80bc72e0cea5d4b420ff18676baeafdb5ba19adf5b7fb33e90b424b" + } + ], + "fileName": "Modules/_hacl/libintvector.h" +--- a/Modules/_hacl/libintvector.h ++++ b/Modules/_hacl/libintvector.h +@@ -19,7 +19,7 @@ + + #define Lib_IntVector_Intrinsics_bit_mask64(x) -((x) & 1) + +-#if defined(__x86_64__) || defined(_M_X64) ++#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) + + #if defined(HACL_CAN_COMPILE_VEC128) + diff --git a/idle3.appdata.xml b/idle3.appdata.xml new file mode 100644 index 0000000..554b7c4 --- /dev/null +++ b/idle3.appdata.xml @@ -0,0 +1,35 @@ + + + + + idle3.desktop + IDLE3 + CC0 + Python-2.0 + Python 3 Integrated Development and Learning Environment + +

+ IDLE is Python’s Integrated Development and Learning Environment. + The GUI is uniform between Windows, Unix, and Mac OS X. + IDLE provides an easy way to start writing, running, and debugging + Python code. +

+

+ IDLE is written in pure Python, and uses the tkinter GUI toolkit. + It provides: +

+
    +
  • a Python shell window (interactive interpreter) with colorizing of code input, output, and error messages,
  • +
  • a multi-window text editor with multiple undo, Python colorizing, smart indent, call tips, auto completion, and other features,
  • +
  • search within any window, replace within editor windows, and search through multiple files (grep),
  • +
  • a debugger with persistent breakpoints, stepping, and viewing of global and local namespaces.
  • +
+
+ https://docs.python.org/3/library/idle.html + + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-main-window.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-class-browser.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-code-viewer.png + + zbyszek@in.waw.pl +
diff --git a/idle3.desktop b/idle3.desktop new file mode 100644 index 0000000..43f5a4c --- /dev/null +++ b/idle3.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=IDLE 3 +GenericName=Python 3 IDE +Comment=Python 3 Integrated Development and Learning Environment +Exec=idle3 %F +TryExec=idle3 +Terminal=false +Type=Application +Icon=idle3 +Categories=Development;IDE; +MimeType=text/x-python; diff --git a/import_failed.map b/import_failed.map new file mode 100644 index 0000000..2a0bf85 --- /dev/null +++ b/import_failed.map @@ -0,0 +1,7 @@ +python313-curses: curses _curses _curses_panel +python313-dbm: dbm _dbm _gdbm +python313-idle: idlelib +python313-testsuite: test _ctypes_test _testbuffer _testcapi _testinternalcapi _testimportmultiple _testmultiphase xxlimited +python313-tk: tkinter _tkinter +python313-tools: turtledemo +python313: sqlite3 readline _sqlite3 nis diff --git a/import_failed.py b/import_failed.py new file mode 100644 index 0000000..258b5a5 --- /dev/null +++ b/import_failed.py @@ -0,0 +1,23 @@ +import sys, os +from sysconfig import get_path + +failed_map_path = os.path.join(get_path('stdlib'), '_import_failed', 'import_failed.map') + +if __spec__: + failed_name = __spec__.name +else: + failed_name = __name__ + +with open(failed_map_path) as fd: + for line in fd: + package = line.split(':')[0] + imports = line.split(':')[1] + if failed_name in imports: + raise ImportError(f"""Module '{failed_name}' is not installed. +Use: + sudo zypper install {package} +to install it.""") + +raise ImportError(f"""Module '{failed_name}' is not installed. +It is supposed to be part of python3 distribution, but missing from failed import map. +Please file a bug on the SUSE Bugzilla.""") diff --git a/macros.python3 b/macros.python3 new file mode 100644 index 0000000..2bd193b --- /dev/null +++ b/macros.python3 @@ -0,0 +1,28 @@ +%have_python3 1 + +# commented out legacy macro definitions +#py3_prefix /usr +#py3_incdir /usr/include/python3.5m +#py3_ver 3.5 + +# these should now be provided by macros.python_all +#python3_sitearch /usr/lib64/python3.5/site-packages +#python3_sitelib /usr/lib/python3.5/site-packages +#python3_version 3.5 + +# hard to say if anyone ever used these? +#py3_soflags cpython-35m-x86_64-linux-gnu +#py3_abiflags m +%cpython3_soabi %(python3 -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))") +%py3_soflags %cpython3_soabi + +# compilation macros that might be in use somewhere +%py3_compile(O) \ +find %1 -name '*.pyc' -exec rm -f {} ";"\ +python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +%{-O:\ +find %1 -name '*.pyo' -exec rm -f {} ";"\ +python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +} + + diff --git a/pre_checkin.sh b/pre_checkin.sh new file mode 100644 index 0000000..a2cf992 --- /dev/null +++ b/pre_checkin.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +export LC_ALL=C + +master=python*.spec + +# create import_failed.map from package definitions +pkgname=$(grep python_pkg_name $master |grep define |awk -F' ' '{print $3}') +MAPFILE=import_failed.map +function new_map_line () { + package=$1 + package=$(echo $1 |sed -e "s:%{python_pkg_name}:$pkgname:") + modules=$2 + if [ -z "$package" -o -z "$modules" ]; then + return + fi + if [[ "$package" =~ "-base" ]]; then + return + fi + echo "$package:$modules" >> $MAPFILE.tmp +} + +for spec in *.spec; do + basename=${spec%.spec} + package= + modules= + while read line; do + case $line in + "%files -n "*) + new_map_line $package "$modules" + package=${line#"%files -n "} + modules= + ;; + "%files "*) + new_map_line $package "$modules" + package=$basename-${line#"%files "} + modules= + ;; + "%files") + new_map_line $package "$modules" + package=$basename + modules= + ;; + "%{sitedir}/config-"*) + # ignore + ;; + "%{sitedir}/"*) + word=${line#"%{sitedir}/"} + if ! echo $word | grep -q /; then + modules="$modules $word" + fi + ;; + "%{dynlib "*"}") + word=${line#"%{dynlib "} + word=${word%"}"} + modules="$modules $word" + ;; + esac + done < $spec + new_map_line $package "$modules" +done + +cat $MAPFILE.tmp |sort -u > $MAPFILE +rm $MAPFILE.tmp + +# run test inclusion check +tar xJf Python-*.xz +python3 skipped_tests.py + +# generate baselibs.conf +VERSION=$(grep ^Version $master|awk -F':' '{print $2}' |sed -e 's/ //g') +python_version=${VERSION:0:3} # 3.3 +python_version_abitag=${python_version//./} # 33 +python_version_soname=${python_version//./_} # 3_3 +echo "$pkgname-base" > baselibs.conf +echo "$pkgname" >> baselibs.conf +echo "libpython$python_version_soname-1_0" >> baselibs.conf + diff --git a/python-3.3.0b1-fix_date_time_compiler.patch b/python-3.3.0b1-fix_date_time_compiler.patch new file mode 100644 index 0000000..6f21f15 --- /dev/null +++ b/python-3.3.0b1-fix_date_time_compiler.patch @@ -0,0 +1,20 @@ +--- + Makefile.pre.in | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: Python-3.14.0rc1/Makefile.pre.in +=================================================================== +--- Python-3.14.0rc1.orig/Makefile.pre.in 2025-07-22 18:42:44.000000000 +0200 ++++ Python-3.14.0rc1/Makefile.pre.in 2025-07-23 10:10:27.325708066 +0200 +@@ -1910,6 +1910,11 @@ + -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ + -o $@ $(srcdir)/Modules/getbuildinfo.c + ++Python/getcompiler.o: $(srcdir)/Python/getcompiler.c Makefile ++ $(CC) -c $(PY_CORE_CFLAGS) \ ++ -DCOMPILER='"[GCC]"' \ ++ -o $@ $(srcdir)/Python/getcompiler.c ++ + Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS) + $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ + -DPREFIX='"$(host_prefix)"' \ diff --git a/python-3.3.0b1-localpath.patch b/python-3.3.0b1-localpath.patch new file mode 100644 index 0000000..3dffb30 --- /dev/null +++ b/python-3.3.0b1-localpath.patch @@ -0,0 +1,15 @@ +--- + Lib/site.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -78,7 +78,7 @@ import stat + import errno + + # Prefixes for site-packages; add additional prefixes like /usr/local here +-PREFIXES = [sys.prefix, sys.exec_prefix] ++PREFIXES = [sys.prefix, sys.exec_prefix, '/usr/local'] + # Enable per user site-packages directory + # set it to False to disable the feature or True to force the feature + ENABLE_USER_SITE = None diff --git a/python314-rpmlintrc b/python314-rpmlintrc new file mode 100644 index 0000000..5b35f34 --- /dev/null +++ b/python314-rpmlintrc @@ -0,0 +1,3 @@ +addFilter("pem-certificate.*/usr/lib.*/python.*/test/*.pem") +addFilter("devel-file-in-non-devel-package.*/usr/lib.*/python.*/tests/*.c") +addFilter("devel-file-in-non-devel-package.*/usr/lib.*/python.*/test/*.cpp") diff --git a/python314.changes b/python314.changes new file mode 100644 index 0000000..8177f2e --- /dev/null +++ b/python314.changes @@ -0,0 +1,11856 @@ +------------------------------------------------------------------- +Fri Aug 15 14:12:35 UTC 2025 - Matej Cepl + +- Update to 3.14.0~rc2: + - Library + - gh-137426: Remove the code deprecation of + importlib.abc.ResourceLoader. It is documented as + deprecated, but left for backwards compatibility with other + classes in importlib.abc. + - gh-137282: Fix tab completion and dir() on + concurrent.futures. + - gh-137257: Bump the version of pip bundled in ensurepip to + version 25.2 + - gh-137226: Fix behavior of + annotationlib.ForwardRef.evaluate() when the type_params + parameter is passed and the name of a type param is also + present in an enclosing scope. + - gh-130522: Fix unraisable TypeError raised during + interpreter shutdown in the threading module. + - gh-137059: Fix handling of file URLs with a + Windows drive letter in the URL authority by + urllib.request.url2pathname(). This fixes a regression in + earlier pre-releases of Python 3.14. + - gh-130577: tarfile now validates archives to ensure member + offsets are non-negative. (Contributed by Alexander Enrique + Urieles Nieto in gh-130577; CVE-2025-8194, bsc#1247249). + - gh-135228: When dataclasses replaces a class with a slotted + dataclass, the original class can now be garbage collected + again. Earlier changes in Python 3.14 caused this class to + always remain in existence together with the replacement + class synthesized by dataclasses. + - Documentation + - gh-136155: We are now checking for fatal errors in EPUB + builds in CI. + - Core and Builtins + - gh-137400: Fix a crash in the free threading + build when disabling profiling or tracing across + all threads with PyEval_SetProfileAllThreads() + or PyEval_SetTraceAllThreads() or their Python + equivalents threading.settrace_all_threads() and + threading.setprofile_all_threads(). + - gh-137314: Fixed a regression where raw f-strings + incorrectly interpreted escape sequences in format + specifications. Raw f-strings now properly preserve literal + backslashes in format specs, matching the behavior from + Python 3.11. For example, rf"{obj:\xFF}" now correctly + produces '\\xFF' instead of 'ÿ'. Patch by Pablo Galindo. + - gh-137308: A standalone docstring in a node body is + optimized as a pass statement to ensure that the node’s + body is never empty. There was a ValueError in compile() + otherwise. + - gh-137288: Fix bug where some bytecode instructions of a + boolean expression are not associated with the correct + exception handler. + - gh-134291: Remove some newer macOS API usage from the JIT + compiler in order to restore compatibility with older OSX + 10.15 deployment targets. + - gh-131338: Disable computed stack limit checks on non-glibc + linux platforms to fix crashes on deep recursion. + - gh-136870: Fix data races while de-instrumenting bytecode + of code objects running concurrently in threads. + - C API + - gh-137573: Mark _PyOptimizer_Optimize as Py_NO_INLINE to + prevent stack overflow crashes on macOS. + - Build + - gh-132339: Add support for OpenSSL 3.5. +- Replaces upstreamed patches: + - CVE-2025-8194-tarfile-no-neg-offsets.patch + +------------------------------------------------------------------- +Fri Aug 1 20:09:24 UTC 2025 - Matej Cepl + +- Add CVE-2025-8194-tarfile-no-neg-offsets.patch which now + validates archives to ensure member offsets are non-negative + (gh#python/cpython#130577, CVE-2025-8194, bsc#1247249). + +------------------------------------------------------------------- +Wed Jul 23 08:05:20 UTC 2025 - Matej Cepl + +- Update to 3.14.0~rc1: + - Tools/Demos + - gh-136251: Fixes and usability improvements for + Tools/wasm/emscripten/web_example + - Security + - gh-135661: Fix parsing attributes with whitespaces around + the = separator in html.parser.HTMLParser according to the + HTML5 standard. + - gh-118350: Fix support of escapable raw text mode (elements + “textarea” and “title”) in html.parser.HTMLParser. + - Library + - gh-136170: Removed the unreleased + zipfile.ZipFile.data_offset property added in 3.14.0a7 as + it wasn’t fully clear which behavior it should have in some + situations so the result was not always what a user might + expect. + - gh-124621: pyrepl now works in Emscripten. + - gh-136874: Discard URL query and fragment in + urllib.request.url2pathname(). + - gh-130645: Enable color help by default in argparse. + - gh-136549: Fix signature of threading.excepthook(). + - gh-136523: Fix wave.Wave_write emitting an unraisable when + open raises. + - gh-52876: Add missing keepends (default True) + parameter to codecs.StreamReaderWriter.readline() and + codecs.StreamReaderWriter.readlines(). + - gh-136470: Correct + concurrent.futures.InterpreterPoolExecutor’s default thread + name. + - gh-136476: Fix a bug that was causing the + get_async_stack_trace function to miss some frames in the + stack trace. + - gh-136434: Fix docs generation of UnboundItem in + concurrent.interpreters when running with -OO. + - gh-136380: Raises AttributeError when accessing + concurrent.futures.InterpreterPoolExecutor and + subinterpreters are not available. + - gh-134759: Fix UnboundLocalError in + email.message.Message.get_payload() when the payload to + decode is a bytes object. Patch by Kliment Lamonov. + - gh-134657: asyncio: Remove some private names from + asyncio.__all__. + - Core and Builtins + - gh-136801: Fix PyREPL syntax highlighting on match cases + after multi-line case. Contributed by Olga Matoula. + - gh-136421: Fix crash when initializing datetime + concurrently. + - gh-136541: Fix some issues with the perf trampolines + on x86-64 and aarch64. The trampolines were not being + generated correctly for some cases, which could lead to + the perf integration not working correctly. Patch by Pablo + Galindo. + - gh-136517: Fixed a typo that prevented printing of + uncollectable objects when the gc.DEBUG_UNCOLLECTABLE mode + was set. + - gh-136525: Fix issue where per-thread bytecode was not + instrumented for newly created threads. + - gh-132661: Interpolation.expression now has a default, the + empty string. + - gh-132661: Reflect recent PEP 750 change. + - Disallow concatenation of string.templatelib.Template and + str. Also, disallow implicit concatenation of t-string + literals with string or f-string literals. + - gh-116738: Make functions in grp thread-safe on the free + threaded build. + - gh-135148: Fixed a bug where f-string debug expressions + (using =) would incorrectly strip out parts of strings + containing escaped quotes and # characters. Patch by Pablo + Galindo. + - gh-133136: Limit excess memory usage in the free threading + build when a large dictionary or list is resized and + accessed by multiple threads. + - gh-91153: Fix a crash when a bytearray is concurrently + mutated during item assignment. + - gh-127971: Fix off-by-one read beyond the end of a string + in string search. + - C API + - gh-112068: Revert support of nullable arguments in + PyArg_Parse(). + - gh-133296: New variants for the critical section API that + accept one or two PyMutex pointers rather than PyObject + instances are now public in the non-limited C API. + - gh-134009: Expose PyMutex_IsLocked() as part of the public + C API. + - Build + - gh-135621: PyREPL no longer depends on the curses standard + library. Contributed by Łukasz Langa. + +------------------------------------------------------------------- +Thu Jul 10 10:17:47 UTC 2025 - Daniel Garcia + +- Fix gil/nogil package description, bsc#1246229 + +------------------------------------------------------------------- +Wed Jul 9 05:50:32 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b4: + - Tools/Demos + - gh-135968: Stubs for strip are now provided as part of an + iOS install. + - gh-133600: Backport file reorganization for Tools/wasm/wasi + This should make backporting future code changes easier. It + also simplifies instructions around how to do WASI builds + in the devguide. + - Tests + - gh-135966: The iOS testbed now handles the app_packages + folder as a site directory. + - gh-135494: Fix regrtest to support excluding tests from + --pgo tests. Patch by Victor Stinner. + - Security + - gh-136053: marshal: fix a possible crash when deserializing + slice objects. + - gh-135661: Fix parsing start and end tags in + html.parser.HTMLParser according to the HTML5 standard. + - Whitespaces no longer accepted between does not end the script section. + - Vertical tabulation (\v) and non-ASCII whitespaces no + longer recognized as whitespaces. The only whitespaces + are \t\n\r\f and space. + - Null character (U+0000) no longer ends the tag name. + - Attributes and slashes after the tag name in end tags are + now ignored, instead of terminating after the first > in + quoted attribute value. E.g. . + - Multiple slashes and whitespaces between the last + attribute and closing > are now ignored in both start and + end tags. E.g. . + - Multiple = between attribute name and value are no longer + collapsed. E.g. produces attribute “foo” + with value “=bar”. + - Whitespaces between the = separator and attribute name or + value are no longer ignored. E.g. produces + two attributes “foo” and “=bar”, both with value None; produces two attributes: “foo” with value “” + and “bar” with value None. + - gh-102555: Fix comment parsing in html.parser.HTMLParser + according to the HTML5 standard. --!> now ends the comment. + -- > no longer ends the comment. Support abnormally ended + empty comments <--> and <--->. + - Library + - gh-136286: Fix pickling failures for protocols 0 and 1 for + many objects realted to subinterpreters. + - gh-136316: Improve support for evaluating nested forward + references in typing.evaluate_forward_ref(). + - gh-85702: If zoneinfo._common.load_tzdata is given a + package without a resource a zoneinfo.ZoneInfoNotFoundError + is raised rather than a PermissionError. Patch by Victor + Stinner. + - gh-136028: Fix parsing month names containing “İ” + (U+0130, LATIN CAPITAL LETTER I WITH DOT ABOVE) in + time.strptime(). This affects locales az_AZ, ber_DZ, ber_MA + and crh_UA. + - gh-135995: In the palmos encoding, make byte 0x9b decode to + › (U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK). + - gh-53203: Fix time.strptime() for %c and %x formats on + locales byn_ER, wal_ET and lzh_TW, and for %X format on + locales ar_SA, bg_BG and lzh_TW. + - gh-91555: An earlier change, which was introduced in + 3.14.0b2, has been reverted. It disabled logging for + a logger during handling of log messages for that + logger. Since the reversion, the behaviour should be as it + was before 3.14.0b2. + - gh-135878: Fixes a crash of types.SimpleNamespace on free + threading builds, when several threads were calling its + __repr__() method at the same time. + - gh-135836: Fix IndexError in + asyncio.loop.create_connection() that could occur when + non-OSError exception is raised during connection and + socket’s close() raises OSError. + - gh-135836: Fix IndexError in + asyncio.loop.create_connection() that could occur when the + Happy Eyeballs algorithm resulted in an empty exceptions + list during connection attempts. + - gh-135855: Raise TypeError instead of SystemError when + _interpreters.set___main___attrs() is passed a non-dict + object. Patch by Brian Schubert. + - gh-135815: netrc: skip security checks if os.getuid() is + missing. Patch by Bénédikt Tran. + - gh-135640: Address bug where it was possible to call + xml.etree.ElementTree.ElementTree.write() on an ElementTree + object with an invalid root element. This behavior blanked + the file passed to write if it already existed. + - gh-135645: Added supports_isolated_interpreters field to + sys.implementation. + - gh-135646: Raise consistent NameError exceptions in + annotationlib.ForwardRef.evaluate() + - gh-135557: Fix races on heapq updates and list reads on the + free threaded build. + - gh-119180: Only fetch globals and locals if necessary in + annotationlib.get_annotations() + - gh-135561: Fix a crash on DEBUG builds when an HACL* HMAC + routine fails. Patch by Bénédikt Tran. + - gh-135487: Fix reprlib.Repr.repr_int() when given integers + with more than sys.get_int_max_str_digits() digits. Patch + by Bénédikt Tran. + - gh-135335: multiprocessing: Flush stdout and stderr after + preloading modules in the forkserver. + - gh-135069: Fix the “Invalid error handling” exception in + encodings.idna.IncrementalDecoder to correctly replace the + ‘errors’ parameter. + - gh-130662: +Accept leading zeros in precision and width + fields for +:class:Decimal formatting, for example + format(Decimal(1.25), '.016f'). + - gh-130662: Accept leading zeros in precision and + width fields for Fraction formatting, for example + format(Fraction(1, 3), '.016f'). + - gh-87790: Support underscore and comma as thousands + separators in the fractional part for Fraction’s + formatting. Patch by Sergey B Kirpichev. + - gh-87790: Support underscore and comma as thousands + separators in the fractional part for Decimal’s + formatting. Patch by Sergey B Kirpichev. + - gh-130664: Handle corner-case for Fraction’s formatting: + treat zero-padding (preceding the width field by a zero + ('0') character) as an equivalent to a fill character of + '0' with an alignment type of '=', just as in case of + float’s. + - Documentation + - gh-136155: EPUB builds are fixed by excluding + non-XHTML-compatible tags. + - Core and Builtins + - gh-109700: Fix memory error handling in + PyDict_SetDefault(). + - gh-78465: Fix error message for cls.__new__(cls, ...) where + cls is not instantiable builtin or extension type (with + tp_new set to NULL). + - gh-129958: Differentiate between t-strings and f-strings + in syntax error for newlines in format specifiers of + single-quoted interpolated strings. + - gh-135871: Non-blocking mutex lock attempts now return + immediately when the lock is busy instead of briefly + spinning in the free threading build. + - gh-135106: Restrict the trashcan mechanism to GC’ed objects + and untrack them while in the trashcan to prevent the GC + and trashcan mechanisms conflicting. + - gh-135607: Fix potential weakref races in an object’s + destructor on the free threaded build. + - gh-135608: Fix a crash in the JIT involving attributes of + modules. + - gh-135543: Emit sys.remote_exec audit event + when sys.remote_exec() is called and migrate + remote_debugger_script to cpython.remote_debugger_script. + - gh-134280: Disable constant folding for ~ with a boolean + argument. This moves the deprecation warning from compile + time to runtime. + - C API + - gh-135906: Fix compilation errors when compiling the + internal headers with a C++ compiler. + - Build + - gh-134273: Add support for configuring compiler flags for + the JIT with CFLAGS_JIT + +------------------------------------------------------------------- +Wed Jul 2 13:14:28 UTC 2025 - Matej Cepl + +- Add bsc1243155-sphinx-non-determinism.patch (bsc#1243155) to + generate ids for audit_events using docname (reproducible + builds). + +------------------------------------------------------------------- +Tue Jul 1 08:24:53 UTC 2025 - Daniel Garcia + +- Use one core to build doc. This will make sphinx doc build + reproducible. + bsc#1243155 + +------------------------------------------------------------------- +Sat Jun 21 22:30:08 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b3: + - Tests + - gh-132815: Fix test__opcode: add JUMP_BACKWARD to + specialization stats. + - gh-135489: Show verbose output for failing tests during PGO + profiling step with –enable-optimizations. + - gh-135120: Add test.support.subTests(). + - Security + - gh-135462: Fix quadratic complexity in processing specially + crafted input in html.parser.HTMLParser. End-of-file errors + are now handled according to the HTML5 specs – comments and + declarations are automatically closed, tags are ignored + (bsc#1244705, CVE-2025-6069). + - gh-135034: Fixes multiple issues that allowed tarfile + extraction filters (filter="data" and filter="tar") to be + bypassed using crafted symlinks and hard links. Addresses + CVE 2024-12718, CVE 2025-4138, CVE 2025-4330, and CVE + 2025-4517. Also addresses CVE-2025-4435 (gh#135034, + bsc#1244061). + - Library + - gh-65697: configparser’s error message when attempting to + write an invalid key is now more helpful. + - gh-135497: Fix os.getlogin() failing for longer usernames + on BSD-based platforms. + - gh-135429: Fix the argument mismatch in _lsprof for + PY_THROW event. + - gh-135368: Fix unittest.mock.Mock generation on + dataclasses.dataclass() objects. Now all special attributes + are set as it was before gh-124429. + - gh-133967: Do not normalize locale name ‘C.UTF-8’ to + ‘en_US.UTF-8’. + - gh-135321: Raise a correct exception for values greater + than 0x7fffffff for the BINSTRING opcode in the C + implementation of pickle. + - gh-135276: Backported bugfixes in zipfile.Path from + zipp 3.23. Fixed .name, .stem and other basename-based + properties on Windows when working with a zipfile on disk. + - gh-135244: uuid: when the MAC address cannot be + determined, the 48-bit node ID is now generated with a + cryptographically-secure pseudo-random number generator + (CSPRNG) as per RFC 9562, §6.10.3. This affects uuid1() and + uuid6(). + - gh-134970: Fix the “unknown action” exception in + argparse.ArgumentParser.add_argument_group() to correctly + replace the action class. + - gh-134718: ast.dump() now only omits None and [] values if + they are default values. + - gh-134939: Add the concurrent.interpreters module. See PEP + 734. + - gh-134885: Fix possible crash in the compression.zstd + module related to setting parameter types. Patch by Jelle + Zijlstra. + - gh-134857: Improve error report for doctests run with + unittest. Remove doctest module frames from tracebacks and + redundant newline character from a failure message. + - gh-128840: Fix parsing long IPv6 addresses with embedded + IPv4 address. + - gh-134637: Fix performance regression in calling a ctypes + function pointer in free threading. + - gh-134696: Built-in HACL* and OpenSSL implementations of + hash function constructors now correctly accept the same + documented named arguments. For instance, md5() could be + previously invoked as md5(data=data) or md5(string=string) + depending on the underlying implementation but these calls + were not compatible. Patch by Bénédikt Tran. + - gh-134151: email: Fix TypeError in + email.utils.decode_params() when sorting RFC 2231 + continuations that contain an unnumbered section. + - gh-134210: curses.window.getch() now correctly handles + signals. Patch by Bénédikt Tran. + - gh-134152: email: Fix parsing of email message ID with + invalid domain. + - gh-133489: random.getrandbits() can now generate more that + 231 bits. random.randbytes() can now generate more that 256 + MiB. + - gh-132813: Improve error messages for incorrect types and + values of csv.Dialect attributes. + - gh-132969: Prevent the ProcessPoolExecutor executor thread, + which remains running when shutdown(wait=False), from + attempting to adjust the pool’s worker processes after the + object state has already been reset during shutdown. A + combination of conditions, including a worker process + having terminated abormally, resulted in an exception and + a potential hang when the still-running executor thread + attempted to replace dead workers within the pool. + - gh-127081: Fix libc thread safety issues with os by + replacing getlogin with getlogin_r re-entrant version. + - gh-131884: Fix formatting issues in json.dump() when both + indent and skipkeys are used. + - gh-130999: Avoid exiting the new REPL and offer suggestions + even if there are non-string candidates when errors occur. + - Documentation + - gh-135171: Document that the iterator for the leftmost for + clause in the generator expression is created immediately. + - bpo-45210: Document that error indicator may be set in + tp_dealloc, and how to avoid clobbering it. + - Core and Builtins + - gh-135496: Fix typo in the f-string conversion type error + (“exclamanation” -> “exclamation”). + - gh-135371: Fixed asyncio debugging tools to properly + display internal coroutine call stacks alongside external + task dependencies. The python -m asyncio ps and python + -m asyncio pstree commands now show complete execution + context. Patch by Pablo Galindo. + - gh-127319: Set the allow_reuse_port class variable to False + on the XMLRPC, logging, and HTTP servers. This matches the + behavior in prior Python releases, which is to not allow + port reuse. + - gh-135171: Reverts the behavior of async generator + expressions when created with object w/o __aiter__ method + to the pre-3.13 behavior of raising a TypeError. + - gh-130077: Properly raise custom syntax errors when + incorrect syntax containing names that are prefixes of soft + keywords is encountered. Patch by Pablo Galindo. + - gh-135171: Reverts the behavior of generator expressions + when created with a non-iterable to the pre-3.13 behavior + of raising a TypeError. It is no longer possible to + cause a crash in the debugger by altering the generator + expression’s local variables. This is achieved by moving + the GET_ITER instruction back to the creation of the + generator expression and adding an additional check to + FOR_ITER. + - gh-116738: Make methods in heapq thread-safe on the free + threaded build. + - gh-134876: Add support to PEP 768 remote debugging for + Linux kernels which don’t have CONFIG_CROSS_MEMORY_ATTACH + configured. + - gh-134889: Fix handling of a few opcodes that leave + operands on the stack when optimizing LOAD_FAST. + - gh-134908: Fix crash when iterating over lines in a text + file on the free threaded build. + - gh-132617: Fix dict.update() modification check that could + incorrectly raise a “dict mutated during update” error when + a different dictionary was modified that happens to share + the same underlying keys object. + - gh-134679: Fix crash in the free threading build’s QSBR + code that could occur when changing an object’s __dict__ + attribute. + - gh-127682: No longer call __iter__ twice in list + comprehensions. This brings the behavior of list + comprehensions in line with other forms of iteration + - gh-133912: Fix the C API function PyObject_GenericSetDict + to handle extension classes with inline values. + - C API + - gh-134989: Fix Py_RETURN_NONE, Py_RETURN_TRUE and + Py_RETURN_FALSE macros in the limited C API 3.11 and + older: don’t treat Py_None, Py_True and Py_False as + immortal. Patch by Victor Stinner. + - gh-134989: Implement PyObject_DelAttr() and + PyObject_DelAttrString() as macros in the limited C API + 3.12 and older. Patch by Victor Stinner. + - gh-133968: Add PyUnicodeWriter_WriteASCII() function to + write an ASCII string into a PyUnicodeWriter. The function + is faster than PyUnicodeWriter_WriteUTF8(), but has an + undefined behavior if the input string contains non-ASCII + characters. Patch by Victor Stinner. + - Build + - gh-119132: Remove “experimental” tag from the CPython + free-threading build. + - gh-135497: Fix the detection of MAXLOGNAME in the + configure.ac script. + - gh-134923: Windows builds with profile-guided optimization + enabled now use /GENPROFILE and /USEPROFILE instead of + deprecated /LTCG: options. + - gh-134774: Fix Py_DEBUG macro redefinition warnings on + Windows debug builds. Patch by Chris Eibl. + - gh-134632: Fixed build-details.json generation to use + INCLUDEPY, in order to reference the pythonX.Y subdirectory + of the include directory, as required in PEP 739, instead + of the top-level include directory. + +------------------------------------------------------------------- +Thu May 29 11:42:15 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b2: + - Tools/Demos + - gh-134215: REPL import autocomplete only suggests private + modules when explicitly specified. + - Tests + - gh-133744: Fix multiprocessing interrupt test. Add an event + to synchronize the parent process with the child process: + wait until the child process starts sleeping. Patch by + Victor Stinner. + - gh-133682: Fixed test case + test.test_annotationlib.TestStringFormat.test_displays + which ensures proper handling of complex data structures + (lists, sets, dictionaries, and tuples) in string + annotations. + - gh-133639: Fix + TestPyReplAutoindent.test_auto_indent_default() doesn’t run + input_code. + - Security + - gh-133767: Fix use-after-free in the “unicode-escape” + decoder with a non-“strict” error handler (CVE-2025-4516 + bsc#1243273). + - gh-128840: Short-circuit the processing of long IPv6 + addresses early in ipaddress to prevent excessive memory + consumption and a minor denial-of-service. + - Library + - gh-132710: If possible, ensure that uuid.getnode() + returns the same result even across different + processes. Previously, the result was constant only within + the same process. Patch by Bénédikt Tran. + - gh-80334: multiprocessing.freeze_support() now checks for + work on any “spawn” start method platform rather than only + on Windows. + - gh-134582: Fix tokenize.untokenize() round-trip errors + related to t-strings braces escaping + - gh-134546: Ensure pdb remote debugging script is readable + by remote Python process. + - gh-134451: Converted asyncio.tools.CycleFoundException from + dataclass to a regular exception type. + - gh-114177: Fix asyncio to not close subprocess pipes which + would otherwise error out when the event loop is already + closed. + - gh-90871: Fixed an off by one error concerning the backlog + parameter in create_unix_server(). Contributed by Christian + Harries. + - gh-134323: Fix the threading.RLock.locked() method. + - gh-86802: Fixed asyncio memory leak in cancelled + shield tasks. For shielded tasks where the shield was + cancelled, log potential exceptions through the exception + handler. Contributed by Christian Harries. + - gh-134209: curses: The curses.window.instr() and + curses.window.getstr() methods now allocate their internal + buffer on the heap instead of the stack; in addition, the + max buffer size is increased from 1023 to 2047. + - gh-134235: Updated tab completion on REPL to include + builtin modules. Contributed by Tom Wang, Hunter Young + - gh-134152: Fixed UnboundLocalError that could occur during + email header parsing if an expected trailing delimiter is + missing in some contexts. + - gh-134168: http.server: Fix IPv6 address binding and + --directory handling when using HTTPS. + - gh-62184: Remove import of C implementation of io.FileIO + from Python implementation which has its own implementation + - gh-133982: Emit RuntimeWarning in the Python implementation + of io when the file-like object is not closed explicitly in + the presence of multiple I/O layers. + - gh-133890: The tarfile module now handles + UnicodeEncodeError in the same way as OSError when cannot + extract a member. + - gh-134097: Fix interaction of the new REPL and -X + showrefcount command line option. + - gh-133889: The generated directory listing page in + http.server.SimpleHTTPRequestHandler now only shows the + decoded path component of the requested URL, and not the + query and fragment. + - gh-134098: Fix handling paths that end with + a percent-encoded slash (%2f or %2F) in + http.server.SimpleHTTPRequestHandler. + - gh-132124: On POSIX-compliant systems, + multiprocessing.util.get_temp_dir() now ignores TMPDIR + (and similar environment variables) if the path length of + AF_UNIX socket files exceeds the platform-specific maximum + length when using the forkserver start method. Patch by + Bénédikt Tran. + - gh-134062: ipaddress: fix collisions in __hash__() for + IPv4Network and IPv6Network objects. + - gh-133970: Make string.templatelib.Template and + string.templatelib.Interpolation generic. + - gh-71253: Raise ValueError in open() if opener returns a + negative file-descriptor in the Python implementation of io + to match the C implementation. + - gh-133960: Simplify and improve + typing.evaluate_forward_ref(). It now no longer raises + errors on certain invalid types. In several situations, + it is now able to evaluate forward references that were + previously unsupported. + - gh-133925: Make the private class typing._UnionGenericAlias + hashable. + - gh-133653: Fix argparse.ArgumentParser with the + formatter_class argument. Fix TypeError when + formatter_class is a custom subclass of HelpFormatter. Fix + TypeError when formatter_class is not a subclass of + HelpFormatter and non-standard prefix_char is used. Fix + support of colorizing when formatter_class is not a + subclass of HelpFormatter. + - gh-132641: Fixed a race in functools.lru_cache() under + free-threading. + - gh-133783: Fix bug with applying copy.replace() to ast + objects. Attributes that default to None were incorrectly + treated as required for manually created AST nodes. + - gh-133684: Fix bug where annotationlib.get_annotations() + would return the wrong result for certain classes that are + part of a class hierarchy where from __future__ import + annotations is used. + - gh-77057: Fix handling of invalid markup declarations in + html.parser.HTMLParser. + - gh-130328: Speedup pasting in PyREPL on Windows in a legacy + console. Patch by Chris Eibl. + - gh-133701: Fix bug where typing.TypedDict classes defined + under from __future__ import annotations and inheriting + from another TypedDict had an incorrect __annotations__ + attribute. + - gh-133581: Improve unparsing of t-strings in ast.unparse() + and from __future__ import annotations. Empty t-strings now + round-trip correctly and formatting in interpolations is + preserved. Patch by Jelle Zijlstra. + - gh-133551: Support t-strings (PEP 750) in + annotationlib. Patch by Jelle Zijlstra. + - gh-133439: Fix dot commands with trailing spaces are + mistaken for multi-line SQL statements in the sqlite3 + command-line interface. + - gh-132493: Avoid accessing __annotations__ unnecessarily in + inspect.signature(). + - gh-132876: ldexp() on Windows doesn’t round subnormal + results before Windows 11, but should. Python’s + math.ldexp() wrapper now does round them, so results may + change slightly, in rare cases of very small results, on + Windows versions before 11. + - gh-133009: xml.etree.ElementTree: Fix a crash in + Element.__deepcopy__ when the element is concurrently + mutated. Patch by Bénédikt Tran. + - gh-91555: Ignore log messages generated during handling of + log messages, to avoid deadlock or infinite recursion. + - gh-125028: functools.Placeholder cannot be passed to + functools.partial() as a keyword argument. + - gh-62824: Fix aliases for iso8859_8 encoding. Patch by Dave + Goncalves. + - gh-86155: html.parser.HTMLParser.close() no longer loses + data when the