macOS
bpo-38117 [https://bugs.python.org/issue?@action=redirect&bpo=38117]: Updated OpenSSL to 1.1.1d in macOS installer.
bpo-38089 [https://bugs.python.org/issue?@action=redirect&bpo=38089]: Move Azure Pipelines to latest VM versions and make macOS tests optional
bpo-18049 [https://bugs.python.org/issue?@action=redirect&bpo=18049]: Increase the default stack size of threads from 5MB to 16MB on macOS, to match the stack size of the main thread. This avoids crashes on deep recursion in threads.
bpo-34602 [https://bugs.python.org/issue?@action=redirect&bpo=34602]: Avoid test suite failures on macOS by no longer calling resource.setrlimit to increase the process stack size limit at runtime. The runtime change is no longer needed since the interpreter is being built with a larger default stack size.
bpo-35360 [https://bugs.python.org/issue?@action=redirect&bpo=35360]: Update macOS installer to use SQLite 3.28.0.
bpo-34631 [https://bugs.python.org/issue?@action=redirect&bpo=34631]: Updated OpenSSL to 1.1.1c in macOS installer.
IDLE
bpo-26353 [https://bugs.python.org/issue?@action=redirect&bpo=26353]: Stop adding newline when saving an IDLE shell window.
bpo-4630 [https://bugs.python.org/issue?@action=redirect&bpo=4630]: Add an option to toggle IDLE's cursor blink for shell, editor, and output windows. See Settings, General, Window Preferences, Cursor Blink. Patch by Zackery Spytz.
bpo-38598 [https://bugs.python.org/issue?@action=redirect&bpo=38598]: Do not try to compile IDLE shell or output windows
bpo-36698 [https://bugs.python.org/issue?@action=redirect&bpo=36698]: IDLE no longer fails when write non-encodable characters to stderr. It now escapes them with a backslash, as the regular Python interpreter. Added the
errors
field to the standard streams.bpo-35379 [https://bugs.python.org/issue?@action=redirect&bpo=35379]: When exiting IDLE, catch any AttributeError. One happens when EditorWindow.close is called twice. Printing a traceback, when IDLE is run from a terminal, is useless and annoying.
bpo-38183 [https://bugs.python.org/issue?@action=redirect&bpo=38183]: To avoid problems, test_idle ignores the user config directory. It no longer tries to create or access .idlerc or any files within. Users must run IDLE to discover problems with saving settings.
bpo-38077 [https://bugs.python.org/issue?@action=redirect&bpo=38077]: IDLE no longer adds 'argv' to the user namespace when initializing it. This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4.
bpo-38041 [https://bugs.python.org/issue?@action=redirect&bpo=38041]: Shell restart lines now fill the window width, always start with '=', and avoid wrapping unnecessarily. The line will still wrap if the included file name is long relative to the width.
bpo-35771 [https://bugs.python.org/issue?@action=redirect&bpo=35771]: To avoid occasional spurious test_idle failures on slower machines, increase the
hover_delay
in test_tooltip.bpo-37824 [https://bugs.python.org/issue?@action=redirect&bpo=37824]: Properly handle user input warnings in IDLE shell. Cease turning SyntaxWarnings into SyntaxErrors.
bpo-37929 [https://bugs.python.org/issue?@action=redirect&bpo=37929]: IDLE Settings dialog now closes properly when there is no shell window.
bpo-37902 [https://bugs.python.org/issue?@action=redirect&bpo=37902]: Add mousewheel scrolling for IDLE module, path, and stack browsers. Patch by George Zhang.
bpo-37849 [https://bugs.python.org/issue?@action=redirect&bpo=37849]: Fixed completions list appearing too high or low when shown above the current line.
bpo-36419 [https://bugs.python.org/issue?@action=redirect&bpo=36419]: Refactor IDLE autocomplete and improve testing.
bpo-37748 [https://bugs.python.org/issue?@action=redirect&bpo=37748]: Reorder the Run menu. Put the most common choice, Run Module, at the top.
bpo-37692 [https://bugs.python.org/issue?@action=redirect&bpo=37692]: Improve highlight config sample with example shell interaction and better labels for shell elements.
bpo-37628 [https://bugs.python.org/issue?@action=redirect&bpo=37628]: Settings dialog no longer expands with font size.
bpo-37627 [https://bugs.python.org/issue?@action=redirect&bpo=37627]: Initialize the Customize Run dialog with the command line arguments most recently entered before. The user can optionally edit before submitting them.
bpo-33610 [https://bugs.python.org/issue?@action=redirect&bpo=33610]: Fix code context not showing the correct context when first toggled on.
bpo-37530 [https://bugs.python.org/issue?@action=redirect&bpo=37530]: Optimize code context to reduce unneeded background activity. Font and highlight changes now occur along with text changes instead of after a random delay.
bpo-27452 [https://bugs.python.org/issue?@action=redirect&bpo=27452]: Cleanup
config.py
by inliningRemoveFile
and simplifying the handling offile
inCreateConfigHandlers
.bpo-37325 [https://bugs.python.org/issue?@action=redirect&bpo=37325]: Fix tab focus traversal order for help source and custom run dialogs.
bpo-37321 [https://bugs.python.org/issue?@action=redirect&bpo=37321]: Both subprocess connection error messages now refer to the 'Startup failure' section of the IDLE doc.
bpo-17535 [https://bugs.python.org/issue?@action=redirect&bpo=17535]: Add optional line numbers for IDLE editor windows. Windows open without line numbers unless set otherwise in the General tab of the configuration dialog.
bpo-26806 [https://bugs.python.org/issue?@action=redirect&bpo=26806]: To compensate for stack frames added by IDLE and avoid possible problems with low recursion limits, add 30 to limits in the user code execution process. Subtract 30 when reporting recursion limits to make this addition mostly transparent.
bpo-37177 [https://bugs.python.org/issue?@action=redirect&bpo=37177]: Properly 'attach' search dialogs to their main window so that they behave like other dialogs and do not get hidden behind their main window.
bpo-37039 [https://bugs.python.org/issue?@action=redirect&bpo=37039]: Adjust "Zoom Height" to individual screens by momentarily maximizing the window on first use with a particular screen. Changing screen settings may invalidate the saved height. While a window is maximized, "Zoom Height" has no effect.
bpo-35763 [https://bugs.python.org/issue?@action=redirect&bpo=35763]: Make calltip reminder about '/' meaning positional-only less obtrusive by only adding it when there is room on the first line.
bpo-5680 [https://bugs.python.org/issue?@action=redirect&bpo=5680]: Add 'Run… Customized' to the Run menu to run a module with customized settings. Any 'command line arguments' entered are added to sys.argv. One can suppress the normal Shell main module restart.
bpo-36390 [https://bugs.python.org/issue?@action=redirect&bpo=36390]: Gather Format menu functions into format.py. Combine paragraph.py, rstrip.py, and format methods from editor.py.
工具/示例
bpo-38118 [https://bugs.python.org/issue?@action=redirect&bpo=38118]: Update Valgrind suppression file to ignore a false alarm in
PyUnicode_Decode()
when using GCC builtin strcmp().bpo-38347 [https://bugs.python.org/issue?@action=redirect&bpo=38347]: pathfix.py: Assume all files that end on '.py' are Python scripts when working recursively.
bpo-37803 [https://bugs.python.org/issue?@action=redirect&bpo=37803]: pdb's
--help
and--version
long options now work.bpo-37942 [https://bugs.python.org/issue?@action=redirect&bpo=37942]: Improve ArgumentClinic converter for floats.
bpo-37704 [https://bugs.python.org/issue?@action=redirect&bpo=37704]: Remove
Tools/scripts/h2py.py
: use cffi to access a C API in Python.bpo-37675 [https://bugs.python.org/issue?@action=redirect&bpo=37675]: 2to3 now works when run from a zipped standard library.
bpo-37034 [https://bugs.python.org/issue?@action=redirect&bpo=37034]: Argument Clinic now uses the argument name on errors with keyword-only argument instead of their position. Patch contributed by Rémi Lapeyre.
bpo-37064 [https://bugs.python.org/issue?@action=redirect&bpo=37064]: Add option -k to pathscript.py script: preserve shebang flags. Add option -a to pathscript.py script: add flags.
C API
bpo-37633 [https://bugs.python.org/issue?@action=redirect&bpo=37633]: Reexport some function compatibility wrappers for macros in
pythonrun.h
.bpo-38644 [https://bugs.python.org/issue?@action=redirect&bpo=38644]: Provide
Py_EnterRecursiveCall()
andPy_LeaveRecursiveCall()
as regular functions for the limited API. Previously, there were defined as macros, but these macros didn't work with the limited API which cannot accessPyThreadState.recursion_depth
field. RemovePyCheckRecursionLimit
from the stable ABI.bpo-38650 [https://bugs.python.org/issue?@action=redirect&bpo=38650]: The global variable
PyStructSequence_UnnamedField
is now a constant and refers to a constant string.bpo-38540 [https://bugs.python.org/issue?@action=redirect&bpo=38540]: Fixed possible leak in
PyArg_Parse()
and similar functions for format units"es#"
and"et#"
when the macroPY_SSIZE_T_CLEAN
is not defined.bpo-38395 [https://bugs.python.org/issue?@action=redirect&bpo=38395]: Fix a crash in
weakref.proxy
objects due to incorrect lifetime management when calling some associated methods that may delete the last reference to object being referenced by the proxy. Patch by Pablo Galindo.bpo-36389 [https://bugs.python.org/issue?@action=redirect&bpo=36389]: The
PyObjectCheckConsistency()
function is now also available in release mode. For example, it can be used to debug a crash in thevisit_decref()
function of the GC.bpo-38266 [https://bugs.python.org/issue?@action=redirect&bpo=38266]: Revert the removal of PyThreadState_DeleteCurrent() with documentation.
bpo-38303 [https://bugs.python.org/issue?@action=redirect&bpo=38303]: Update audioop extension module to use the stable ABI (PEP-384). Patch by Tyler Kieft.
bpo-38234 [https://bugs.python.org/issue?@action=redirect&bpo=38234]:
Py_SetPath()
now setssys.executable
to the program full path (Py_GetProgramFullPath()
) rather than to the program name (Py_GetProgramName()
).bpo-38234 [https://bugs.python.org/issue?@action=redirect&bpo=38234]: Python ignored arguments passed to
Py_SetPath()
,Py_SetPythonHome()
andPy_SetProgramName()
: fix Python initialization to use specified arguments.bpo-38205 [https://bugs.python.org/issue?@action=redirect&bpo=38205]: The
Py_UNREACHABLE()
macro now callsPy_FatalError()
.bpo-38140 [https://bugs.python.org/issue?@action=redirect&bpo=38140]: Make dict and weakref offsets opaque for C heap types by passing the offsets through PyMemberDef
bpo-15088 [https://bugs.python.org/issue?@action=redirect&bpo=15088]: The C function
PyGen_NeedsFinalizing
has been removed. It was not documented, tested or used anywhere within CPython after the implementation of PEP 442 [https://peps.python.org/pep-0442/]. Patch by Joannah Nanjekye. (Patch by Joannah Nanjekye)bpo-36763 [https://bugs.python.org/issue?@action=redirect&bpo=36763]: Options added by
PySys_AddXOption()
are now handled the same way thanPyConfig.xoptions
and command line-X
options.bpo-37926 [https://bugs.python.org/issue?@action=redirect&bpo=37926]: Fix a crash in
PySys_SetArgvEx(0, NULL, 0)
.bpo-37879 [https://bugs.python.org/issue?@action=redirect&bpo=37879]: Fix subtype_dealloc to suppress the type decref when the base type is a C heap type
bpo-37645 [https://bugs.python.org/issue?@action=redirect&bpo=37645]: Add
PyObjectFunctionStr()
to get a user-friendly string representation of a function-like object. Patch by Jeroen Demeyer.bpo-29548 [https://bugs.python.org/issue?@action=redirect&bpo=29548]: The functions
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
andPyEval_CallObjectWithKeywords
are deprecated. UsePyObject_Call()
and its variants instead.bpo-37151 [https://bugs.python.org/issue?@action=redirect&bpo=37151]:
PyCFunction_Call
is now a deprecated alias ofPyObject_Call()
.bpo-37540 [https://bugs.python.org/issue?@action=redirect&bpo=37540]: The vectorcall protocol now requires that the caller passes only strings as keyword names.
bpo-37207 [https://bugs.python.org/issue?@action=redirect&bpo=37207]: The vectorcall protocol is now enabled for
type
objects: settp_vectorcall
to a vectorcall function to be used instead oftp_new
andtp_init
when calling the class itself.bpo-21120 [https://bugs.python.org/issue?@action=redirect&bpo=21120]: Exclude Python-ast.h, ast.h and asdl.h from the limited API.
bpo-37483 [https://bugs.python.org/issue?@action=redirect&bpo=37483]: Add new function
PyObjectCallOneArg
for calling an object with one positional argument.bpo-36763 [https://bugs.python.org/issue?@action=redirect&bpo=36763]: Add
PyConfig_SetWideStringList()
function.bpo-37337 [https://bugs.python.org/issue?@action=redirect&bpo=37337]: Add fast functions for calling methods:
PyObjectVectorcallMethod()
,PyObjectCallMethodNoArgs()
andPyObjectCallMethodOneArg()
.bpo-28805 [https://bugs.python.org/issue?@action=redirect&bpo=28805]: The
METH_FASTCALL
calling convention has been documented.bpo-37221 [https://bugs.python.org/issue?@action=redirect&bpo=37221]: The new function
PyCode_NewWithPosOnlyArgs()
allows to create code objects likePyCode_New()
, but with an extra posonlyargcount parameter for indicating the number of positonal-only arguments.bpo-37215 [https://bugs.python.org/issue?@action=redirect&bpo=37215]: Fix dtrace issue introduce by bpo-36842 [https://bugs.python.org/issue?@action=redirect&bpo=36842]
bpo-37194 [https://bugs.python.org/issue?@action=redirect&bpo=37194]: Add a new public
PyObject_CallNoArgs()
function to the C API: call a callable Python object without any arguments. It is the most efficient way to call a callback without any argument. On x86-64, for example,PyObject_CallFunctionObjArgs(func, NULL)
allocates 960 bytes on the stack per call, whereasPyObject_CallNoArgs(func)
only allocates 624 bytes per call.bpo-37170 [https://bugs.python.org/issue?@action=redirect&bpo=37170]: Fix the cast on error in
PyLong_AsUnsignedLongLongMask()
.bpo-35381 [https://bugs.python.org/issue?@action=redirect&bpo=35381]: Convert posixmodule.c statically allocated types
DirEntryType
andScandirIteratorType
to heap-allocated types.bpo-34331 [https://bugs.python.org/issue?@action=redirect&bpo=34331]: Use singular/plural noun in error message when instantiating an abstract class with non-overridden abstract method(s).
Python 3.8.0 beta 1
发布日期: 2019-06-04
安全性
bpo-35907 [https://bugs.python.org/issue?@action=redirect&bpo=35907]: CVE 2019-9948 [https://www.cve.org/CVERecord?id=CVE-2019-9948]: Avoid file reading by disallowing
local-file://
andlocal_file://
URL schemes inURLopener().open()
andURLopener().retrieve()
ofurllib.request
.bpo-33529 [https://bugs.python.org/issue?@action=redirect&bpo=33529]: Prevent fold function used in email header encoding from entering infinite loop when there are too many nonASCII characters in a header.
bpo-33164 [https://bugs.python.org/issue?@action=redirect&bpo=33164]: Updated blake2 implementation which uses secure memset implementation provided by platform.
核心与内置函数
bpo-35814 [https://bugs.python.org/issue?@action=redirect&bpo=35814]: Allow unpacking in the right hand side of annotated assignments. In particular,
t: Tuple[int, …] = x, y, *z
is now allowed.bpo-37126 [https://bugs.python.org/issue?@action=redirect&bpo=37126]: All structseq objects are now tracked by the garbage collector. Patch by Pablo Galindo.
bpo-37122 [https://bugs.python.org/issue?@action=redirect&bpo=37122]: Make the co_argcount attribute of code objects represent the total number of positional arguments (including positional-only arguments). The value of co_posonlyargcount can be used to distinguish which arguments are positional only, and the difference (co_argcount - co_posonlyargcount) is the number of positional-or-keyword arguments. Patch by Pablo Galindo.
bpo-20092 [https://bugs.python.org/issue?@action=redirect&bpo=20092]: Constructors of
int
,float
andcomplex
will now use the__index__()
special method, if available and the corresponding method__int__()
,__float__()
or__complex__()
is not available.bpo-37087 [https://bugs.python.org/issue?@action=redirect&bpo=37087]: Add native thread ID (TID) support to OpenBSD.
bpo-26219 [https://bugs.python.org/issue?@action=redirect&bpo=26219]: Implemented per opcode cache mechanism and
LOAD_GLOBAL
instruction use it.LOAD_GLOBAL
is now about 40% faster. Contributed by Yury Selivanov, and Inada Naoki.bpo-37072 [https://bugs.python.org/issue?@action=redirect&bpo=37072]: Fix crash in PyAST_FromNodeObject() when flags is NULL.
bpo-37029 [https://bugs.python.org/issue?@action=redirect&bpo=37029]: Freeing a great many small objects could take time quadratic in the number of arenas, due to using linear search to keep
obmalloc.c
's list of usable arenas sorted by order of number of free memory pools. This is accomplished without search now, leaving the worst-case time linear in the number of arenas. For programs where this quite visibly matters (typically with more than 100 thousand small objects alive simultaneously), this can greatly reduce the time needed to release their memory.bpo-26423 [https://bugs.python.org/issue?@action=redirect&bpo=26423]: Fix possible overflow in
wrap_lenfunc()
whensizeof(long) < sizeof(Py_ssize_t)
(e.g., 64-bit Windows).bpo-37050 [https://bugs.python.org/issue?@action=redirect&bpo=37050]: Improve the AST for "debug" fstrings, which use '=' to print out the source of the expression being evaluated. Delete expr_text from the FormattedValue node, and instead use a Constant string node (possibly merged with adjacent constant expressions inside the fstring).
bpo-22385 [https://bugs.python.org/issue?@action=redirect&bpo=22385]: The
bytes.hex
,bytearray.hex
, andmemoryview.hex
methods as well as thebinascii.hexlify
andb2a_hex
functions now have the ability to include an optional separator between hex bytes. This functionality was inspired by MicroPython's hexlify implementation.bpo-26836 [https://bugs.python.org/issue?@action=redirect&bpo=26836]: Add
os.memfd_create()
.bpo-37032 [https://bugs.python.org/issue?@action=redirect&bpo=37032]: Added new
replace()
method to the code type (types.CodeType
).bpo-37007 [https://bugs.python.org/issue?@action=redirect&bpo=37007]: Implement
socket.if_nameindex()
,socket.if_nametoindex()
, andsocket.if_indextoname()
on Windows.bpo-36829 [https://bugs.python.org/issue?@action=redirect&bpo=36829]:
PyErr_WriteUnraisable()
now creates a traceback object if there is no current traceback. Moreover, callPyErr_NormalizeException()
andPyException_SetTraceback()
to normalize the exception value. Ignore any error.bpo-36878 [https://bugs.python.org/issue?@action=redirect&bpo=36878]: Only accept text after
# type: ignore
if the first character is ASCII. This is to disallow things like# type: ignoreé
.bpo-36878 [https://bugs.python.org/issue?@action=redirect&bpo=36878]: Store text appearing after a
# type: ignore
comment in the AST. For example a type ignore like# type: ignore[E1000]
will have the string"[E1000]"
stored in its AST node.bpo-2180 [https://bugs.python.org/issue?@action=redirect&bpo=2180]: Treat line continuation at EOF as a
SyntaxError
by Anthony Sottile.bpo-36907 [https://bugs.python.org/issue?@action=redirect&bpo=36907]: Fix a crash when calling a C function with a keyword dict (
f(**kwargs)
) and changing the dictkwargs
while that function is running.bpo-36946 [https://bugs.python.org/issue?@action=redirect&bpo=36946]: Fix possible signed integer overflow when handling slices.
bpo-36826 [https://bugs.python.org/issue?@action=redirect&bpo=36826]: Add NamedExpression kind support to ast_unparse.c
bpo-1875 [https://bugs.python.org/issue?@action=redirect&bpo=1875]: A
SyntaxError
is now raised if a code blocks that will be optimized away (e.g. if conditions that are always false) contains syntax errors. Patch by Pablo Galindo.bpo-36027 [https://bugs.python.org/issue?@action=redirect&bpo=36027]: Allow computation of modular inverses via three-argument
pow
: the second argument is now permitted to be negative in the case where the first and third arguments are relatively prime.bpo-36861 [https://bugs.python.org/issue?@action=redirect&bpo=36861]: Update the Unicode database to version 12.1.0.
bpo-28866 [https://bugs.python.org/issue?@action=redirect&bpo=28866]: Avoid caching attributes of classes which type defines mro() to avoid a hard cache invalidation problem.
bpo-36851 [https://bugs.python.org/issue?@action=redirect&bpo=36851]: The
FrameType
stack is now correctly cleaned up if the execution ends with a return and the stack is not empty.bpo-34616 [https://bugs.python.org/issue?@action=redirect&bpo=34616]: The
compile()
builtin functions now support theast.PyCF_ALLOW_TOP_LEVEL_AWAIT
flag, which allow to compile sources that contains toplevelawait
,async with
orasync for
. This is useful to evaluate async-code from with an already async functions; for example in a custom REPL.bpo-36842 [https://bugs.python.org/issue?@action=redirect&bpo=36842]: Implement PEP 578, adding sys.audit, io.open_code and related APIs.
bpo-27639 [https://bugs.python.org/issue?@action=redirect&bpo=27639]: Correct return type for UserList slicing operations. Patch by Michael Blahay, Erick Cervantes, and vaultah
bpo-36737 [https://bugs.python.org/issue?@action=redirect&bpo=36737]: Move PyRuntimeState.warnings into per-interpreter state (via "module state").
bpo-36793 [https://bugs.python.org/issue?@action=redirect&bpo=36793]: Removed
__str__
implementations from builtin typesbool
,int
,float
,complex
and few classes from the standard library. They now inherit__str__()
fromobject
.bpo-36817 [https://bugs.python.org/issue?@action=redirect&bpo=36817]: Add a
=
feature fstrings for debugging. This can precede!s
,!r
, or!a
. It produces the text of the expression, followed by an equal sign, followed by the repr of the value of the expression. Sof'{3*9+15=}'
would be equal to the string'3*9+15=42'
. If=
is specified, the default conversion is set to!r
, unless a format spec is given, in which case the formatting behavior is unchanged, and format will be used.bpo-24048 [https://bugs.python.org/issue?@action=redirect&bpo=24048]: Save the live exception during import.c's
remove_module()
.bpo-27987 [https://bugs.python.org/issue?@action=redirect&bpo=27987]: pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on 64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment more often. Patch by Inada Naoki.
bpo-36601 [https://bugs.python.org/issue?@action=redirect&bpo=36601]: A long-since-meaningless check for
getpid() == main_pid
was removed from Python's internal C signal handler.bpo-36594 [https://bugs.python.org/issue?@action=redirect&bpo=36594]: Fix incorrect use of
%p
in format strings. Patch by Zackery Spytz.bpo-36045 [https://bugs.python.org/issue?@action=redirect&bpo=36045]:
builtins.help()
now prefixesasync
for async functions.bpo-36084 [https://bugs.python.org/issue?@action=redirect&bpo=36084]: Add native thread ID (TID) to threading.Thread objects (supported platforms: Windows, FreeBSD, Linux, macOS)
bpo-36035 [https://bugs.python.org/issue?@action=redirect&bpo=36035]: Added fix for broken symlinks in combination with pathlib
bpo-35983 [https://bugs.python.org/issue?@action=redirect&bpo=35983]: Added new trashcan macros to deal with a double deallocation that could occur when the
tp_dealloc
of a subclass calls thetp_dealloc
of a base class and that base class uses the trashcan mechanism. Patch by Jeroen Demeyer.bpo-20602 [https://bugs.python.org/issue?@action=redirect&bpo=20602]: Do not clear
sys.flags
andsys.float_info
during shutdown. Patch by Zackery Spytz.bpo-26826 [https://bugs.python.org/issue?@action=redirect&bpo=26826]: Expose
copy_file_range()
as a low level API in theos
module.bpo-32388 [https://bugs.python.org/issue?@action=redirect&bpo=32388]: Remove cross-version binary compatibility requirement in tp_flags.
bpo-31862 [https://bugs.python.org/issue?@action=redirect&bpo=31862]: Port binascii to PEP 489 multiphase initialization. Patch by Marcel Plch.