]> granicus.if.org Git - python/commitdiff
co_lnotab supports negative line number delta
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 20 Jan 2016 11:16:21 +0000 (12:16 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 20 Jan 2016 11:16:21 +0000 (12:16 +0100)
Issue #26107: The format of the co_lnotab attribute of code objects changes to
support negative line number delta.

Changes:

* assemble_lnotab(): if line number delta is less than -128 or greater than
  127, emit multiple (offset_delta, lineno_delta) in co_lnotab
* update functions decoding co_lnotab to use signed 8-bit integers

  - dis.findlinestarts()
  - PyCode_Addr2Line()
  - _PyCode_CheckLineNumber()
  - frame_setlineno()

* update lnotab_notes.txt
* increase importlib MAGIC_NUMBER to 3361
* document the change in What's New in Python 3.6
* cleanup also PyCode_Optimize() to use better variable names

Doc/whatsnew/3.6.rst
Include/code.h
Lib/dis.py
Lib/importlib/_bootstrap_external.py
Misc/NEWS
Objects/codeobject.c
Objects/frameobject.c
Objects/lnotab_notes.txt
Python/compile.c
Python/importlib_external.h
Python/peephole.c

index 0e15edacc805326a24dcf014a277880ac04e4721..80645377d24af79f93cca41b74f67a0b6e047d2b 100644 (file)
@@ -244,6 +244,16 @@ that may require changes to your code.
 Changes in the Python API
 -------------------------
 
+* The format of the ``co_lnotab`` attribute of code objects changed to support
+  negative line number delta. By default, Python does not emit bytecode with
+  negative line number delta. Functions using ``frame.f_lineno``,
+  ``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected.
+  Functions decoding directly ``co_lnotab`` should be updated to use a signed
+  8-bit integer type for the line number delta, but it's only required to
+  support applications using negative line number delta. See
+  ``Objects/lnotab_notes.txt`` for the ``co_lnotab`` format and how to decode
+  it, and see the :pep:`511` for the rationale.
+
 * The functions in the :mod:`compileall` module now return booleans instead
   of ``1`` or ``0`` to represent success or failure, respectively. Thanks to
   booleans being a subclass of integers, this should only be an issue if you
index 56e6ec18afea2696063392354b446c520ce01c85..3ce2084bfa143a1738f40f636a828a2bf9376d1a 100644 (file)
@@ -117,7 +117,7 @@ PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,
 #endif
 
 PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
-                                      PyObject *names, PyObject *lineno_obj);
+                                      PyObject *names, PyObject *lnotab);
 
 #ifdef __cplusplus
 }
index 3540b4714d9af477b7e49cc185f529e66e608df1..2e80e178f05112ec788b97e50926b8eb1ea6e85c 100644 (file)
@@ -397,8 +397,8 @@ def findlinestarts(code):
     Generate pairs (offset, lineno) as described in Python/compile.c.
 
     """
-    byte_increments = list(code.co_lnotab[0::2])
-    line_increments = list(code.co_lnotab[1::2])
+    byte_increments = code.co_lnotab[0::2]
+    line_increments = code.co_lnotab[1::2]
 
     lastlineno = None
     lineno = code.co_firstlineno
@@ -409,6 +409,9 @@ def findlinestarts(code):
                 yield (addr, lineno)
                 lastlineno = lineno
             addr += byte_incr
+        if line_incr >= 0x80:
+            # line_increments is an array of 8-bit signed integers
+            line_incr -= 0x100
         lineno += line_incr
     if lineno != lastlineno:
         yield (addr, lineno)
index f27450153e4b8ce2137ffed101811d29845f57ba..71098f10856a87364015c89d3389c33dc48b0740 100644 (file)
@@ -223,13 +223,14 @@ _code_type = type(_write_atomic.__code__)
 #     Python 3.5b1  3330 (PEP 448: Additional Unpacking Generalizations)
 #     Python 3.5b2  3340 (fix dictionary display evaluation order #11205)
 #     Python 3.5b2  3350 (add GET_YIELD_FROM_ITER opcode #24400)
-#     Python 3.6a0  3360 (add FORMAT_VALUE opcode #25483)
+#     Python 3.6a0  3360 (add FORMAT_VALUE opcode #25483
+#     Python 3.6a0  3361 (lineno delta of code.co_lnotab becomes signed)
 #
 # MAGIC must change whenever the bytecode emitted by the compiler may no
 # longer be understood by older implementations of the eval loop (usually
 # due to the addition of new opcodes).
 
-MAGIC_NUMBER = (3360).to_bytes(2, 'little') + b'\r\n'
+MAGIC_NUMBER = (3361).to_bytes(2, 'little') + b'\r\n'
 _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little')  # For import.c
 
 _PYCACHE = '__pycache__'
index 46464def85f38c05f75c6c904e095562a910a218..8c6864c123e37d98d0cba83aabbb0e2dfec37931 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: tba
 Core and Builtins
 -----------------
 
+- Issue #26107: The format of the ``co_lnotab`` attribute of code objects
+  changes to support negative line number delta.
+
 - Issue #26154: Add a new private _PyThreadState_UncheckedGet() function to get
   the current Python thread state, but don't issue a fatal error if it is NULL.
   This new function must be used instead of accessing directly the
index b0e34468a7e7aa1fec1584d9e510fe459eae3583..0f03dfe4b3e994c8b10f61497c164ff8e7a76581 100644 (file)
@@ -557,7 +557,8 @@ PyCode_Addr2Line(PyCodeObject *co, int addrq)
         addr += *p++;
         if (addr > addrq)
             break;
-        line += *p++;
+        line += (signed char)*p;
+        p++;
     }
     return line;
 }
@@ -592,17 +593,19 @@ _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds)
         if (addr + *p > lasti)
             break;
         addr += *p++;
-        if (*p)
+        if ((signed char)*p)
             bounds->ap_lower = addr;
-        line += *p++;
+        line += (signed char)*p;
+        p++;
         --size;
     }
 
     if (size > 0) {
         while (--size >= 0) {
             addr += *p++;
-            if (*p++)
+            if ((signed char)*p)
                 break;
+            p++;
         }
         bounds->ap_upper = addr;
     }
index 425a9ee0f1d3d2d48e920f1ee1af1bdbfb6cbff1..da2d2ed2154d95a8212a079075fb8179684f085f 100644 (file)
@@ -137,7 +137,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
         new_lasti = -1;
         for (offset = 0; offset < lnotab_len; offset += 2) {
             addr += lnotab[offset];
-            line += lnotab[offset+1];
+            line += (signed char)lnotab[offset+1];
             if (line >= new_lineno) {
                 new_lasti = addr;
                 new_lineno = line;
index d247eddd6f0ed5e6dd0b73e392de9d6a20e9a762..8af10db12e720c725781af18137bf0845f4b14bc 100644 (file)
@@ -12,42 +12,47 @@ pairs.  The details are important and delicate, best illustrated by example:
         0                  1
         6                  2
        50                  7
-      350                 307
-      361                 308
+      350                 207
+      361                 208
 
 Instead of storing these numbers literally, we compress the list by storing only
-the increments from one row to the next.  Conceptually, the stored list might
+the difference from one row to the next.  Conceptually, the stored list might
 look like:
 
-    0, 1,  6, 1,  44, 5,  300, 300,  11, 1
+    0, 1,  6, 1,  44, 5,  300, 200,  11, 1
 
-The above doesn't really work, but it's a start. Note that an unsigned byte
-can't hold negative values, or values larger than 255, and the above example
-contains two such values. So we make two tweaks:
+The above doesn't really work, but it's a start. An unsigned byte (byte code
+offset)) can't hold negative values, or values larger than 255, a signed byte
+(line number) can't hold values larger than 127 or less than -128, and the
+above example contains two such values. So we make two tweaks:
 
- (a) there's a deep assumption that byte code offsets and their corresponding
- line #s both increase monotonically, and
- (b) if at least one column jumps by more than 255 from one row to the next,
- more than one pair is written to the table. In case #b, there's no way to know
- from looking at the table later how many were written.  That's the delicate
- part.  A user of co_lnotab desiring to find the source line number
- corresponding to a bytecode address A should do something like this
+ (a) there's a deep assumption that byte code offsets increase monotonically,
+ and
+ (b) if byte code offset jumps by more than 255 from one row to the next, or if
+ source code line number jumps by more than 127 or less than -128 from one row
+ to the next, more than one pair is written to the table. In case #b,
+ there's no way to know from looking at the table later how many were written.
+ That's the delicate part.  A user of co_lnotab desiring to find the source
+ line number corresponding to a bytecode address A should do something like
+ this:
 
     lineno = addr = 0
     for addr_incr, line_incr in co_lnotab:
         addr += addr_incr
         if addr > A:
             return lineno
+        if line_incr >= 0x80:
+            line_incr -= 0x100
         lineno += line_incr
 
 (In C, this is implemented by PyCode_Addr2Line().)  In order for this to work,
 when the addr field increments by more than 255, the line # increment in each
 pair generated must be 0 until the remaining addr increment is < 256.  So, in
 the example above, assemble_lnotab in compile.c should not (as was actually done
-until 2.2) expand 300, 300 to
+until 2.2) expand 300, 200 to
     255, 255, 45, 45,
 but to
-    255, 0, 45, 255, 0, 45.
+    255, 0, 45, 128, 0, 72.
 
 The above is sufficient to reconstruct line numbers for tracebacks, but not for
 line tracing.  Tracing is handled by PyCode_CheckLineNumber() in codeobject.c
index 0f619c453563c9b9c6ecace32f5931eb1cdff52b..f362ac6bdab460d74789d5ceaeea4eff932bb91c 100644 (file)
@@ -4452,7 +4452,6 @@ assemble_lnotab(struct assembler *a, struct instr *i)
     d_lineno = i->i_lineno - a->a_lineno;
 
     assert(d_bytecode >= 0);
-    assert(d_lineno >= 0);
 
     if(d_bytecode == 0 && d_lineno == 0)
         return 1;
@@ -4482,9 +4481,21 @@ assemble_lnotab(struct assembler *a, struct instr *i)
         d_bytecode -= ncodes * 255;
         a->a_lnotab_off += ncodes * 2;
     }
-    assert(d_bytecode <= 255);
-    if (d_lineno > 255) {
-        int j, nbytes, ncodes = d_lineno / 255;
+    assert(0 <= d_bytecode && d_bytecode <= 255);
+
+    if (d_lineno < -128 || 127 < d_lineno) {
+        int j, nbytes, ncodes, k;
+        if (d_lineno < 0) {
+            k = -128;
+            /* use division on positive numbers */
+            ncodes = (-d_lineno) / 128;
+        }
+        else {
+            k = 127;
+            ncodes = d_lineno / 127;
+        }
+        d_lineno -= ncodes * k;
+        assert(ncodes >= 1);
         nbytes = a->a_lnotab_off + 2 * ncodes;
         len = PyBytes_GET_SIZE(a->a_lnotab);
         if (nbytes >= len) {
@@ -4502,15 +4513,15 @@ assemble_lnotab(struct assembler *a, struct instr *i)
         lnotab = (unsigned char *)
                    PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
         *lnotab++ = d_bytecode;
-        *lnotab++ = 255;
+        *lnotab++ = k;
         d_bytecode = 0;
         for (j = 1; j < ncodes; j++) {
             *lnotab++ = 0;
-            *lnotab++ = 255;
+            *lnotab++ = k;
         }
-        d_lineno -= ncodes * 255;
         a->a_lnotab_off += ncodes * 2;
     }
+    assert(-128 <= d_lineno && d_lineno <= 127);
 
     len = PyBytes_GET_SIZE(a->a_lnotab);
     if (a->a_lnotab_off + 2 >= len) {
index 5828cebb4b7884eda1a7416168371883adee2c71..97c4948bcb883b5dcb8bc2f183bb0d4fb2b156a7 100644 (file)
@@ -258,7 +258,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,5,0,0,0,218,13,95,119,114,105,116,101,95,97,116,
     111,109,105,99,99,0,0,0,115,26,0,0,0,0,5,24,
     1,9,1,33,1,3,3,21,1,20,1,20,1,13,1,3,
-    1,17,1,13,1,5,1,114,55,0,0,0,105,32,13,0,
+    1,17,1,13,1,5,1,114,55,0,0,0,105,33,13,0,
     0,233,2,0,0,0,114,13,0,0,0,115,2,0,0,0,
     13,10,90,11,95,95,112,121,99,97,99,104,101,95,95,122,
     4,111,112,116,45,122,3,46,112,121,122,4,46,112,121,99,
@@ -368,7 +368,7 @@ const unsigned char _Py_M__importlib_external[] = {
     103,90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,
     109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
     0,218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,
-    117,114,99,101,244,0,0,0,115,46,0,0,0,0,18,12,
+    117,114,99,101,245,0,0,0,115,46,0,0,0,0,18,12,
     1,9,1,7,1,12,1,6,1,12,1,18,1,18,1,24,
     1,12,1,12,1,12,1,36,1,12,1,18,1,9,2,12,
     1,12,1,12,1,12,1,21,1,21,1,114,79,0,0,0,
@@ -447,7 +447,7 @@ const unsigned char _Py_M__importlib_external[] = {
     101,118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,
     97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,
     0,0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,
-    99,97,99,104,101,32,1,0,0,115,44,0,0,0,0,9,
+    99,97,99,104,101,33,1,0,0,115,44,0,0,0,0,9,
     18,1,12,1,18,1,18,1,12,1,9,1,15,1,15,1,
     12,1,9,1,15,1,12,1,22,1,15,1,9,1,12,1,
     22,1,12,1,9,1,12,1,19,1,114,85,0,0,0,99,
@@ -484,7 +484,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,114,36,0,0,0,90,9,101,120,116,101,110,115,105,
     111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,15,
-    95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,65,
+    95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,66,
     1,0,0,115,20,0,0,0,0,7,18,1,4,1,24,1,
     35,1,4,1,3,1,16,1,19,1,21,1,114,91,0,0,
     0,99,1,0,0,0,0,0,0,0,1,0,0,0,11,0,
@@ -499,7 +499,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,114,79,0,0,0,114,66,0,0,0,114,74,0,0,
     0,41,1,218,8,102,105,108,101,110,97,109,101,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,11,95,103,
-    101,116,95,99,97,99,104,101,100,84,1,0,0,115,16,0,
+    101,116,95,99,97,99,104,101,100,85,1,0,0,115,16,0,
     0,0,0,1,21,1,3,1,14,1,13,1,8,1,21,1,
     4,2,114,95,0,0,0,99,1,0,0,0,0,0,0,0,
     2,0,0,0,11,0,0,0,67,0,0,0,115,60,0,0,
@@ -514,7 +514,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,39,0,0,0,114,41,0,0,0,114,40,0,0,0,41,
     2,114,35,0,0,0,114,42,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,10,95,99,97,108,
-    99,95,109,111,100,101,96,1,0,0,115,12,0,0,0,0,
+    99,95,109,111,100,101,97,1,0,0,115,12,0,0,0,0,
     2,3,1,19,1,13,1,11,3,10,1,114,97,0,0,0,
     99,1,0,0,0,0,0,0,0,3,0,0,0,11,0,0,
     0,3,0,0,0,115,84,0,0,0,100,1,0,135,0,0,
@@ -554,7 +554,7 @@ const unsigned char _Py_M__importlib_external[] = {
     103,115,90,6,107,119,97,114,103,115,41,1,218,6,109,101,
     116,104,111,100,114,4,0,0,0,114,5,0,0,0,218,19,
     95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,
-    112,101,114,116,1,0,0,115,12,0,0,0,0,1,12,1,
+    112,101,114,117,1,0,0,115,12,0,0,0,0,1,12,1,
     12,1,15,1,6,1,25,1,122,40,95,99,104,101,99,107,
     95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,
     99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,
@@ -573,7 +573,7 @@ const unsigned char _Py_M__importlib_external[] = {
     116,97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,
     6,117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,
     111,108,100,114,52,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,218,5,95,119,114,97,112,127,1,
+    0,0,114,5,0,0,0,218,5,95,119,114,97,112,128,1,
     0,0,115,8,0,0,0,0,1,25,1,15,1,29,1,122,
     26,95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,
     99,97,108,115,62,46,95,119,114,97,112,41,3,218,10,95,
@@ -581,7 +581,7 @@ const unsigned char _Py_M__importlib_external[] = {
     78,97,109,101,69,114,114,111,114,41,3,114,102,0,0,0,
     114,103,0,0,0,114,113,0,0,0,114,4,0,0,0,41,
     1,114,102,0,0,0,114,5,0,0,0,218,11,95,99,104,
-    101,99,107,95,110,97,109,101,108,1,0,0,115,14,0,0,
+    101,99,107,95,110,97,109,101,109,1,0,0,115,14,0,0,
     0,0,8,21,7,3,1,13,1,13,2,17,5,13,1,114,
     116,0,0,0,99,2,0,0,0,0,0,0,0,5,0,0,
     0,4,0,0,0,67,0,0,0,115,84,0,0,0,124,0,
@@ -611,7 +611,7 @@ const unsigned char _Py_M__importlib_external[] = {
     218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,17,
     95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,
-    109,136,1,0,0,115,10,0,0,0,0,10,21,1,24,1,
+    109,137,1,0,0,115,10,0,0,0,0,10,21,1,24,1,
     6,1,29,1,114,123,0,0,0,99,4,0,0,0,0,0,
     0,0,11,0,0,0,19,0,0,0,67,0,0,0,115,252,
     1,0,0,105,0,0,125,4,0,124,2,0,100,1,0,107,
@@ -698,7 +698,7 @@ const unsigned char _Py_M__importlib_external[] = {
     218,11,115,111,117,114,99,101,95,115,105,122,101,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,25,95,118,
     97,108,105,100,97,116,101,95,98,121,116,101,99,111,100,101,
-    95,104,101,97,100,101,114,153,1,0,0,115,76,0,0,0,
+    95,104,101,97,100,101,114,154,1,0,0,115,76,0,0,0,
     0,11,6,1,12,1,13,3,6,1,12,1,10,1,16,1,
     16,1,16,1,12,1,18,1,16,1,18,1,18,1,15,1,
     16,1,15,1,18,1,15,1,16,1,12,1,12,1,3,1,
@@ -729,7 +729,7 @@ const unsigned char _Py_M__importlib_external[] = {
     5,114,53,0,0,0,114,98,0,0,0,114,89,0,0,0,
     114,90,0,0,0,218,4,99,111,100,101,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,109,
-    112,105,108,101,95,98,121,116,101,99,111,100,101,208,1,0,
+    112,105,108,101,95,98,121,116,101,99,111,100,101,209,1,0,
     0,115,16,0,0,0,0,2,15,1,15,1,16,1,12,1,
     16,1,4,2,18,1,114,141,0,0,0,114,59,0,0,0,
     99,3,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
@@ -749,7 +749,7 @@ const unsigned char _Py_M__importlib_external[] = {
     100,117,109,112,115,41,4,114,140,0,0,0,114,126,0,0,
     0,114,134,0,0,0,114,53,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,100,
-    101,95,116,111,95,98,121,116,101,99,111,100,101,220,1,0,
+    101,95,116,111,95,98,121,116,101,99,111,100,101,221,1,0,
     0,115,10,0,0,0,0,3,12,1,19,1,19,1,22,1,
     114,144,0,0,0,99,1,0,0,0,0,0,0,0,5,0,
     0,0,4,0,0,0,67,0,0,0,115,89,0,0,0,100,
@@ -778,7 +778,7 @@ const unsigned char _Py_M__importlib_external[] = {
     218,8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,
     105,110,101,95,100,101,99,111,100,101,114,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,13,100,101,99,111,
-    100,101,95,115,111,117,114,99,101,230,1,0,0,115,10,0,
+    100,101,95,115,111,117,114,99,101,231,1,0,0,115,10,0,
     0,0,0,5,12,1,18,1,15,1,18,1,114,149,0,0,
     0,114,120,0,0,0,218,26,115,117,98,109,111,100,117,108,
     101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,
@@ -843,7 +843,7 @@ const unsigned char _Py_M__importlib_external[] = {
     102,105,120,101,115,114,153,0,0,0,90,7,100,105,114,110,
     97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,
     0,0,218,23,115,112,101,99,95,102,114,111,109,95,102,105,
-    108,101,95,108,111,99,97,116,105,111,110,247,1,0,0,115,
+    108,101,95,108,111,99,97,116,105,111,110,248,1,0,0,115,
     60,0,0,0,0,12,12,4,6,1,15,2,3,1,19,1,
     13,1,5,8,24,1,9,3,12,1,22,1,21,1,15,1,
     9,1,5,2,4,3,12,2,15,1,3,1,19,1,13,1,
@@ -883,7 +883,7 @@ const unsigned char _Py_M__importlib_external[] = {
     72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,
     78,69,41,2,218,3,99,108,115,218,3,107,101,121,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,218,14,95,
-    111,112,101,110,95,114,101,103,105,115,116,114,121,69,2,0,
+    111,112,101,110,95,114,101,103,105,115,116,114,121,70,2,0,
     0,115,8,0,0,0,0,2,3,1,23,1,13,1,122,36,
     87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,
     105,110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,
@@ -910,7 +910,7 @@ const unsigned char _Py_M__importlib_external[] = {
     121,95,107,101,121,114,165,0,0,0,90,4,104,107,101,121,
     218,8,102,105,108,101,112,97,116,104,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,16,95,115,101,97,114,
-    99,104,95,114,101,103,105,115,116,114,121,76,2,0,0,115,
+    99,104,95,114,101,103,105,115,116,114,121,77,2,0,0,115,
     22,0,0,0,0,2,9,1,12,2,9,1,15,1,22,1,
     3,1,18,1,29,1,13,1,9,1,122,38,87,105,110,100,
     111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
@@ -935,7 +935,7 @@ const unsigned char _Py_M__importlib_external[] = {
     103,101,116,114,171,0,0,0,114,120,0,0,0,114,160,0,
     0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,9,102,105,110,100,95,115,112,101,
-    99,91,2,0,0,115,26,0,0,0,0,2,15,1,12,1,
+    99,92,2,0,0,115,26,0,0,0,0,2,15,1,12,1,
     4,1,3,1,14,1,13,1,9,1,22,1,21,1,9,1,
     15,1,9,1,122,31,87,105,110,100,111,119,115,82,101,103,
     105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,
@@ -954,7 +954,7 @@ const unsigned char _Py_M__importlib_external[] = {
     175,0,0,0,114,120,0,0,0,41,4,114,164,0,0,0,
     114,119,0,0,0,114,35,0,0,0,114,158,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,11,
-    102,105,110,100,95,109,111,100,117,108,101,107,2,0,0,115,
+    102,105,110,100,95,109,111,100,117,108,101,108,2,0,0,115,
     8,0,0,0,0,7,18,1,12,1,7,2,122,33,87,105,
     110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,
     100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,41,
@@ -963,7 +963,7 @@ const unsigned char _Py_M__importlib_external[] = {
     167,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,
     100,114,166,0,0,0,114,172,0,0,0,114,175,0,0,0,
     114,176,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,162,0,0,0,57,2,
+    4,0,0,0,114,5,0,0,0,114,162,0,0,0,58,2,
     0,0,115,20,0,0,0,12,2,6,3,6,3,6,2,6,
     2,18,7,18,15,3,1,21,15,3,1,114,162,0,0,0,
     99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
@@ -1001,7 +1001,7 @@ const unsigned char _Py_M__importlib_external[] = {
     100,0,0,0,114,119,0,0,0,114,94,0,0,0,90,13,
     102,105,108,101,110,97,109,101,95,98,97,115,101,90,9,116,
     97,105,108,95,110,97,109,101,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,153,0,0,0,126,2,0,0,
+    0,0,114,5,0,0,0,114,153,0,0,0,127,2,0,0,
     115,8,0,0,0,0,3,25,1,22,1,19,1,122,24,95,
     76,111,97,100,101,114,66,97,115,105,99,115,46,105,115,95,
     112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,
@@ -1012,7 +1012,7 @@ const unsigned char _Py_M__importlib_external[] = {
     111,110,46,78,114,4,0,0,0,41,2,114,100,0,0,0,
     114,158,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
     5,0,0,0,218,13,99,114,101,97,116,101,95,109,111,100,
-    117,108,101,134,2,0,0,115,0,0,0,0,122,27,95,76,
+    117,108,101,135,2,0,0,115,0,0,0,0,122,27,95,76,
     111,97,100,101,114,66,97,115,105,99,115,46,99,114,101,97,
     116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,
     0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,80,
@@ -1033,7 +1033,7 @@ const unsigned char _Py_M__importlib_external[] = {
     101,99,114,111,0,0,0,41,3,114,100,0,0,0,218,6,
     109,111,100,117,108,101,114,140,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,11,101,120,101,99,
-    95,109,111,100,117,108,101,137,2,0,0,115,10,0,0,0,
+    95,109,111,100,117,108,101,138,2,0,0,115,10,0,0,0,
     0,2,18,1,12,1,9,1,15,1,122,25,95,76,111,97,
     100,101,114,66,97,115,105,99,115,46,101,120,101,99,95,109,
     111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0,
@@ -1044,14 +1044,14 @@ const unsigned char _Py_M__importlib_external[] = {
     114,0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,
     108,101,95,115,104,105,109,41,2,114,100,0,0,0,114,119,
     0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,
-    0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,145,
+    0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,146,
     2,0,0,115,2,0,0,0,0,2,122,25,95,76,111,97,
     100,101,114,66,97,115,105,99,115,46,108,111,97,100,95,109,
     111,100,117,108,101,78,41,8,114,105,0,0,0,114,104,0,
     0,0,114,106,0,0,0,114,107,0,0,0,114,153,0,0,
     0,114,180,0,0,0,114,185,0,0,0,114,187,0,0,0,
     114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,178,0,0,0,121,2,0,0,115,10,0,
+    5,0,0,0,114,178,0,0,0,122,2,0,0,115,10,0,
     0,0,12,3,6,2,12,8,12,3,12,8,114,178,0,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
     0,0,64,0,0,0,115,106,0,0,0,101,0,0,90,1,
@@ -1079,7 +1079,7 @@ const unsigned char _Py_M__importlib_external[] = {
     41,1,218,7,73,79,69,114,114,111,114,41,2,114,100,0,
     0,0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,10,112,97,116,104,95,109,116,105,
-    109,101,152,2,0,0,115,2,0,0,0,0,6,122,23,83,
+    109,101,153,2,0,0,115,2,0,0,0,0,6,122,23,83,
     111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,
     95,109,116,105,109,101,99,2,0,0,0,0,0,0,0,2,
     0,0,0,3,0,0,0,67,0,0,0,115,19,0,0,0,
@@ -1114,7 +1114,7 @@ const unsigned char _Py_M__importlib_external[] = {
     32,32,32,32,114,126,0,0,0,41,1,114,190,0,0,0,
     41,2,114,100,0,0,0,114,35,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,218,10,112,97,116,
-    104,95,115,116,97,116,115,160,2,0,0,115,2,0,0,0,
+    104,95,115,116,97,116,115,161,2,0,0,115,2,0,0,0,
     0,11,122,23,83,111,117,114,99,101,76,111,97,100,101,114,
     46,112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,
     0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,
@@ -1138,7 +1138,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,90,0,0,0,90,10,99,97,99,104,101,95,112,97,116,
     104,114,53,0,0,0,114,4,0,0,0,114,4,0,0,0,
     114,5,0,0,0,218,15,95,99,97,99,104,101,95,98,121,
-    116,101,99,111,100,101,173,2,0,0,115,2,0,0,0,0,
+    116,101,99,111,100,101,174,2,0,0,115,2,0,0,0,0,
     8,122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,
     95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,
     3,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,
@@ -1155,7 +1155,7 @@ const unsigned char _Py_M__importlib_external[] = {
     32,32,32,32,32,32,32,78,114,4,0,0,0,41,3,114,
     100,0,0,0,114,35,0,0,0,114,53,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,114,192,0,
-    0,0,183,2,0,0,115,0,0,0,0,122,21,83,111,117,
+    0,0,184,2,0,0,115,0,0,0,0,122,21,83,111,117,
     114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97,
     116,97,99,2,0,0,0,0,0,0,0,5,0,0,0,16,
     0,0,0,67,0,0,0,115,105,0,0,0,124,0,0,106,
@@ -1177,7 +1177,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,119,0,0,0,114,35,0,0,0,114,147,0,
     0,0,218,3,101,120,99,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,10,103,101,116,95,115,111,117,114,
-    99,101,190,2,0,0,115,14,0,0,0,0,2,15,1,3,
+    99,101,191,2,0,0,115,14,0,0,0,0,2,15,1,3,
     1,19,1,18,1,9,1,31,1,122,23,83,111,117,114,99,
     101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
     99,101,218,9,95,111,112,116,105,109,105,122,101,114,29,0,
@@ -1199,7 +1199,7 @@ const unsigned char _Py_M__importlib_external[] = {
     108,101,41,4,114,100,0,0,0,114,53,0,0,0,114,35,
     0,0,0,114,197,0,0,0,114,4,0,0,0,114,4,0,
     0,0,114,5,0,0,0,218,14,115,111,117,114,99,101,95,
-    116,111,95,99,111,100,101,200,2,0,0,115,4,0,0,0,
+    116,111,95,99,111,100,101,201,2,0,0,115,4,0,0,0,
     0,5,21,1,122,27,83,111,117,114,99,101,76,111,97,100,
     101,114,46,115,111,117,114,99,101,95,116,111,95,99,111,100,
     101,99,2,0,0,0,0,0,0,0,10,0,0,0,43,0,
@@ -1260,7 +1260,7 @@ const unsigned char _Py_M__importlib_external[] = {
     89,0,0,0,218,2,115,116,114,53,0,0,0,218,10,98,
     121,116,101,115,95,100,97,116,97,114,147,0,0,0,90,11,
     99,111,100,101,95,111,98,106,101,99,116,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,208,
+    114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,209,
     2,0,0,115,78,0,0,0,0,7,15,1,6,1,3,1,
     16,1,13,1,11,2,3,1,19,1,13,1,5,2,16,1,
     3,1,19,1,13,1,5,2,3,1,9,1,12,1,13,1,
@@ -1273,7 +1273,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,192,0,0,0,114,196,0,0,0,114,200,0,
     0,0,114,181,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,188,0,0,0,
-    150,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12,
+    151,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12,
     10,12,7,12,10,18,8,114,188,0,0,0,99,0,0,0,
     0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
     0,115,112,0,0,0,101,0,0,90,1,0,100,0,0,90,
@@ -1301,7 +1301,7 @@ const unsigned char _Py_M__importlib_external[] = {
     32,32,32,32,32,102,105,110,100,101,114,46,78,41,2,114,
     98,0,0,0,114,35,0,0,0,41,3,114,100,0,0,0,
     114,119,0,0,0,114,35,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,179,0,0,0,9,3,
+    4,0,0,0,114,5,0,0,0,114,179,0,0,0,10,3,
     0,0,115,4,0,0,0,0,3,9,1,122,19,70,105,108,
     101,76,111,97,100,101,114,46,95,95,105,110,105,116,95,95,
     99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
@@ -1311,7 +1311,7 @@ const unsigned char _Py_M__importlib_external[] = {
     2,218,9,95,95,99,108,97,115,115,95,95,114,111,0,0,
     0,41,2,114,100,0,0,0,218,5,111,116,104,101,114,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,6,
-    95,95,101,113,95,95,15,3,0,0,115,4,0,0,0,0,
+    95,95,101,113,95,95,16,3,0,0,115,4,0,0,0,0,
     1,18,1,122,17,70,105,108,101,76,111,97,100,101,114,46,
     95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,1,
     0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0,
@@ -1319,7 +1319,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,106,2,0,131,1,0,65,83,41,1,78,41,3,218,
     4,104,97,115,104,114,98,0,0,0,114,35,0,0,0,41,
     1,114,100,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,19,
+    114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,20,
     3,0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,
     76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,
     2,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
@@ -1334,7 +1334,7 @@ const unsigned char _Py_M__importlib_external[] = {
     32,32,32,32,32,32,32,41,3,218,5,115,117,112,101,114,
     114,204,0,0,0,114,187,0,0,0,41,2,114,100,0,0,
     0,114,119,0,0,0,41,1,114,205,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,187,0,0,0,22,3,0,0,
+    0,0,114,5,0,0,0,114,187,0,0,0,23,3,0,0,
     115,2,0,0,0,0,10,122,22,70,105,108,101,76,111,97,
     100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,
     2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,
@@ -1345,7 +1345,7 @@ const unsigned char _Py_M__importlib_external[] = {
     98,121,32,116,104,101,32,102,105,110,100,101,114,46,41,1,
     114,35,0,0,0,41,2,114,100,0,0,0,114,119,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,151,0,0,0,34,3,0,0,115,2,0,0,0,0,3,
+    114,151,0,0,0,35,3,0,0,115,2,0,0,0,0,3,
     122,23,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
     95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0,
     0,0,3,0,0,0,9,0,0,0,67,0,0,0,115,42,
@@ -1358,14 +1358,14 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,50,0,0,0,90,4,114,101,97,100,41,3,
     114,100,0,0,0,114,35,0,0,0,114,54,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,194,
-    0,0,0,39,3,0,0,115,4,0,0,0,0,2,21,1,
+    0,0,0,40,3,0,0,115,4,0,0,0,0,2,21,1,
     122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
     95,100,97,116,97,41,11,114,105,0,0,0,114,104,0,0,
     0,114,106,0,0,0,114,107,0,0,0,114,179,0,0,0,
     114,207,0,0,0,114,209,0,0,0,114,116,0,0,0,114,
     187,0,0,0,114,151,0,0,0,114,194,0,0,0,114,4,
     0,0,0,114,4,0,0,0,41,1,114,205,0,0,0,114,
-    5,0,0,0,114,204,0,0,0,4,3,0,0,115,14,0,
+    5,0,0,0,114,204,0,0,0,5,3,0,0,115,14,0,
     0,0,12,3,6,2,12,6,12,4,12,3,24,12,18,5,
     114,204,0,0,0,99,0,0,0,0,0,0,0,0,0,0,
     0,0,4,0,0,0,64,0,0,0,115,64,0,0,0,101,
@@ -1388,7 +1388,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,39,0,0,0,218,8,115,116,95,109,116,105,109,101,90,
     7,115,116,95,115,105,122,101,41,3,114,100,0,0,0,114,
     35,0,0,0,114,202,0,0,0,114,4,0,0,0,114,4,
-    0,0,0,114,5,0,0,0,114,191,0,0,0,49,3,0,
+    0,0,0,114,5,0,0,0,114,191,0,0,0,50,3,0,
     0,115,4,0,0,0,0,2,12,1,122,27,83,111,117,114,
     99,101,70,105,108,101,76,111,97,100,101,114,46,112,97,116,
     104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0,
@@ -1399,7 +1399,7 @@ const unsigned char _Py_M__importlib_external[] = {
     97,0,0,0,114,192,0,0,0,41,5,114,100,0,0,0,
     114,90,0,0,0,114,89,0,0,0,114,53,0,0,0,114,
     42,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,193,0,0,0,54,3,0,0,115,4,0,0,
+    0,0,0,114,193,0,0,0,55,3,0,0,115,4,0,0,
     0,0,2,12,1,122,32,83,111,117,114,99,101,70,105,108,
     101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98,
     121,116,101,99,111,100,101,114,214,0,0,0,105,182,1,0,
@@ -1438,7 +1438,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,214,0,0,0,218,6,112,97,114,101,110,116,114,94,
     0,0,0,114,27,0,0,0,114,23,0,0,0,114,195,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,192,0,0,0,59,3,0,0,115,42,0,0,0,0,
+    0,114,192,0,0,0,60,3,0,0,115,42,0,0,0,0,
     2,18,1,6,2,22,1,18,1,17,2,19,1,15,1,3,
     1,17,1,13,2,7,1,18,3,9,1,10,1,27,1,3,
     1,16,1,20,1,18,2,12,1,122,25,83,111,117,114,99,
@@ -1447,7 +1447,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,106,0,0,0,114,107,0,0,0,114,191,0,0,0,
     114,193,0,0,0,114,192,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,212,
-    0,0,0,45,3,0,0,115,8,0,0,0,12,2,6,2,
+    0,0,0,46,3,0,0,115,8,0,0,0,12,2,6,2,
     12,5,12,5,114,212,0,0,0,99,0,0,0,0,0,0,
     0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,46,
     0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100,
@@ -1469,7 +1469,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,141,0,0,0,41,5,114,100,0,0,0,114,119,0,
     0,0,114,35,0,0,0,114,53,0,0,0,114,203,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,181,0,0,0,94,3,0,0,115,8,0,0,0,0,1,
+    114,181,0,0,0,95,3,0,0,115,8,0,0,0,0,1,
     15,1,15,1,24,1,122,29,83,111,117,114,99,101,108,101,
     115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
     95,99,111,100,101,99,2,0,0,0,0,0,0,0,2,0,
@@ -1479,13 +1479,13 @@ const unsigned char _Py_M__importlib_external[] = {
     111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,
     4,0,0,0,41,2,114,100,0,0,0,114,119,0,0,0,
     114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,
-    196,0,0,0,100,3,0,0,115,2,0,0,0,0,2,122,
+    196,0,0,0,101,3,0,0,115,2,0,0,0,0,2,122,
     31,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,
     111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,
     78,41,6,114,105,0,0,0,114,104,0,0,0,114,106,0,
     0,0,114,107,0,0,0,114,181,0,0,0,114,196,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,114,217,0,0,0,90,3,0,0,115,6,
+    114,5,0,0,0,114,217,0,0,0,91,3,0,0,115,6,
     0,0,0,12,2,6,2,12,6,114,217,0,0,0,99,0,
     0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,
     0,0,0,115,136,0,0,0,101,0,0,90,1,0,100,0,
@@ -1510,7 +1510,7 @@ const unsigned char _Py_M__importlib_external[] = {
     1,0,100,0,0,83,41,1,78,41,2,114,98,0,0,0,
     114,35,0,0,0,41,3,114,100,0,0,0,114,98,0,0,
     0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,114,179,0,0,0,117,3,0,0,115,4,
+    114,5,0,0,0,114,179,0,0,0,118,3,0,0,115,4,
     0,0,0,0,1,9,1,122,28,69,120,116,101,110,115,105,
     111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,
     110,105,116,95,95,99,2,0,0,0,0,0,0,0,2,0,
@@ -1520,7 +1520,7 @@ const unsigned char _Py_M__importlib_external[] = {
     83,41,1,78,41,2,114,205,0,0,0,114,111,0,0,0,
     41,2,114,100,0,0,0,114,206,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,207,0,0,0,
-    121,3,0,0,115,4,0,0,0,0,1,18,1,122,26,69,
+    122,3,0,0,115,4,0,0,0,0,1,18,1,122,26,69,
     120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
     101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,
     0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,26,
@@ -1528,7 +1528,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,124,0,0,106,2,0,131,1,0,65,83,41,1,78,
     41,3,114,208,0,0,0,114,98,0,0,0,114,35,0,0,
     0,41,1,114,100,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,209,0,0,0,125,3,0,0,
+    0,0,114,5,0,0,0,114,209,0,0,0,126,3,0,0,
     115,2,0,0,0,0,1,122,28,69,120,116,101,110,115,105,
     111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,
     97,115,104,95,95,99,2,0,0,0,0,0,0,0,3,0,
@@ -1546,7 +1546,7 @@ const unsigned char _Py_M__importlib_external[] = {
     97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35,
     0,0,0,41,3,114,100,0,0,0,114,158,0,0,0,114,
     184,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,180,0,0,0,128,3,0,0,115,10,0,0,
+    0,0,0,114,180,0,0,0,129,3,0,0,115,10,0,0,
     0,0,2,6,1,15,1,9,1,16,1,122,33,69,120,116,
     101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
     46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,
@@ -1564,7 +1564,7 @@ const unsigned char _Py_M__importlib_external[] = {
     97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35,
     0,0,0,41,2,114,100,0,0,0,114,184,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,185,
-    0,0,0,136,3,0,0,115,6,0,0,0,0,2,19,1,
+    0,0,0,137,3,0,0,115,6,0,0,0,0,2,19,1,
     9,1,122,31,69,120,116,101,110,115,105,111,110,70,105,108,
     101,76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,
     117,108,101,99,2,0,0,0,0,0,0,0,2,0,0,0,
@@ -1582,7 +1582,7 @@ const unsigned char _Py_M__importlib_external[] = {
     41,2,114,179,0,0,0,78,114,4,0,0,0,41,2,114,
     22,0,0,0,218,6,115,117,102,102,105,120,41,1,218,9,
     102,105,108,101,95,110,97,109,101,114,4,0,0,0,114,5,
-    0,0,0,250,9,60,103,101,110,101,120,112,114,62,145,3,
+    0,0,0,250,9,60,103,101,110,101,120,112,114,62,146,3,
     0,0,115,2,0,0,0,6,1,122,49,69,120,116,101,110,
     115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
     115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108,
@@ -1591,7 +1591,7 @@ const unsigned char _Py_M__importlib_external[] = {
     88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69,
     83,41,2,114,100,0,0,0,114,119,0,0,0,114,4,0,
     0,0,41,1,114,220,0,0,0,114,5,0,0,0,114,153,
-    0,0,0,142,3,0,0,115,6,0,0,0,0,2,19,1,
+    0,0,0,143,3,0,0,115,6,0,0,0,0,2,19,1,
     18,1,122,30,69,120,116,101,110,115,105,111,110,70,105,108,
     101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,
     103,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1,
@@ -1602,7 +1602,7 @@ const unsigned char _Py_M__importlib_external[] = {
     101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101,
     99,116,46,78,114,4,0,0,0,41,2,114,100,0,0,0,
     114,119,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,181,0,0,0,148,3,0,0,115,2,0,
+    5,0,0,0,114,181,0,0,0,149,3,0,0,115,2,0,
     0,0,0,2,122,28,69,120,116,101,110,115,105,111,110,70,
     105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111,
     100,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1,
@@ -1612,7 +1612,7 @@ const unsigned char _Py_M__importlib_external[] = {
     117,108,101,115,32,104,97,118,101,32,110,111,32,115,111,117,
     114,99,101,32,99,111,100,101,46,78,114,4,0,0,0,41,
     2,114,100,0,0,0,114,119,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,152,
+    114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,153,
     3,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101,
     110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
     103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
@@ -1624,7 +1624,7 @@ const unsigned char _Py_M__importlib_external[] = {
     101,32,102,105,110,100,101,114,46,41,1,114,35,0,0,0,
     41,2,114,100,0,0,0,114,119,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,151,0,0,0,
-    156,3,0,0,115,2,0,0,0,0,3,122,32,69,120,116,
+    157,3,0,0,115,2,0,0,0,0,3,122,32,69,120,116,
     101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
     46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,
     114,105,0,0,0,114,104,0,0,0,114,106,0,0,0,114,
@@ -1632,7 +1632,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,180,0,0,0,114,185,0,0,0,114,153,0,
     0,0,114,181,0,0,0,114,196,0,0,0,114,116,0,0,
     0,114,151,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,109,
+    114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,110,
     3,0,0,115,20,0,0,0,12,6,6,2,12,4,12,4,
     12,3,12,8,12,6,12,6,12,4,12,4,114,218,0,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
@@ -1677,7 +1677,7 @@ const unsigned char _Py_M__importlib_external[] = {
     100,101,114,41,4,114,100,0,0,0,114,98,0,0,0,114,
     35,0,0,0,218,11,112,97,116,104,95,102,105,110,100,101,
     114,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,179,0,0,0,169,3,0,0,115,8,0,0,0,0,1,
+    114,179,0,0,0,170,3,0,0,115,8,0,0,0,0,1,
     9,1,9,1,21,1,122,23,95,78,97,109,101,115,112,97,
     99,101,80,97,116,104,46,95,95,105,110,105,116,95,95,99,
     1,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
@@ -1696,7 +1696,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,218,3,100,111,116,90,2,109,101,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,218,23,95,102,105,
     110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110,
-    97,109,101,115,175,3,0,0,115,8,0,0,0,0,2,27,
+    97,109,101,115,176,3,0,0,115,8,0,0,0,0,2,27,
     1,12,2,4,3,122,38,95,78,97,109,101,115,112,97,99,
     101,80,97,116,104,46,95,102,105,110,100,95,112,97,114,101,
     110,116,95,112,97,116,104,95,110,97,109,101,115,99,1,0,
@@ -1709,7 +1709,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,90,18,112,97,114,101,110,116,95,109,111,100,117,108,101,
     95,110,97,109,101,90,14,112,97,116,104,95,97,116,116,114,
     95,110,97,109,101,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,227,0,0,0,185,3,0,0,115,4,0,
+    5,0,0,0,114,227,0,0,0,186,3,0,0,115,4,0,
     0,0,0,1,18,1,122,31,95,78,97,109,101,115,112,97,
     99,101,80,97,116,104,46,95,103,101,116,95,112,97,114,101,
     110,116,95,112,97,116,104,99,1,0,0,0,0,0,0,0,
@@ -1727,7 +1727,7 @@ const unsigned char _Py_M__importlib_external[] = {
     226,0,0,0,41,3,114,100,0,0,0,90,11,112,97,114,
     101,110,116,95,112,97,116,104,114,158,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,12,95,114,
-    101,99,97,108,99,117,108,97,116,101,189,3,0,0,115,16,
+    101,99,97,108,99,117,108,97,116,101,190,3,0,0,115,16,
     0,0,0,0,2,18,1,15,1,21,3,27,1,9,1,12,
     1,9,1,122,27,95,78,97,109,101,115,112,97,99,101,80,
     97,116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,
@@ -1736,7 +1736,7 @@ const unsigned char _Py_M__importlib_external[] = {
     106,1,0,131,0,0,131,1,0,83,41,1,78,41,2,218,
     4,105,116,101,114,114,234,0,0,0,41,1,114,100,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    218,8,95,95,105,116,101,114,95,95,202,3,0,0,115,2,
+    218,8,95,95,105,116,101,114,95,95,203,3,0,0,115,2,
     0,0,0,0,1,122,23,95,78,97,109,101,115,112,97,99,
     101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,1,
     0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,
@@ -1744,7 +1744,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,131,0,0,131,1,0,83,41,1,78,41,2,114,31,0,
     0,0,114,234,0,0,0,41,1,114,100,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,218,7,95,
-    95,108,101,110,95,95,205,3,0,0,115,2,0,0,0,0,
+    95,108,101,110,95,95,206,3,0,0,115,2,0,0,0,0,
     1,122,22,95,78,97,109,101,115,112,97,99,101,80,97,116,
     104,46,95,95,108,101,110,95,95,99,1,0,0,0,0,0,
     0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,16,
@@ -1753,7 +1753,7 @@ const unsigned char _Py_M__importlib_external[] = {
     99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,47,
     0,0,0,114,226,0,0,0,41,1,114,100,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,8,
-    95,95,114,101,112,114,95,95,208,3,0,0,115,2,0,0,
+    95,95,114,101,112,114,95,95,209,3,0,0,115,2,0,0,
     0,0,1,122,23,95,78,97,109,101,115,112,97,99,101,80,
     97,116,104,46,95,95,114,101,112,114,95,95,99,2,0,0,
     0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,
@@ -1761,7 +1761,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,107,6,0,83,41,1,78,41,1,114,234,0,0,0,
     41,2,114,100,0,0,0,218,4,105,116,101,109,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,12,95,95,
-    99,111,110,116,97,105,110,115,95,95,211,3,0,0,115,2,
+    99,111,110,116,97,105,110,115,95,95,212,3,0,0,115,2,
     0,0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,
     101,80,97,116,104,46,95,95,99,111,110,116,97,105,110,115,
     95,95,99,2,0,0,0,0,0,0,0,2,0,0,0,2,
@@ -1769,7 +1769,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,106,1,0,124,1,0,131,1,0,1,100,0,0,83,
     41,1,78,41,2,114,226,0,0,0,114,157,0,0,0,41,
     2,114,100,0,0,0,114,239,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,157,0,0,0,214,
+    114,4,0,0,0,114,5,0,0,0,114,157,0,0,0,215,
     3,0,0,115,2,0,0,0,0,1,122,21,95,78,97,109,
     101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110,
     100,78,41,13,114,105,0,0,0,114,104,0,0,0,114,106,
@@ -1777,7 +1777,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,114,227,0,0,0,114,234,0,0,0,114,236,0,0,
     0,114,237,0,0,0,114,238,0,0,0,114,240,0,0,0,
     114,157,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,224,0,0,0,162,3,
+    4,0,0,0,114,5,0,0,0,114,224,0,0,0,163,3,
     0,0,115,20,0,0,0,12,5,6,2,12,6,12,10,12,
     4,12,13,12,3,12,3,12,3,12,3,114,224,0,0,0,
     99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
@@ -1797,7 +1797,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,226,0,0,0,41,4,114,100,0,0,0,114,98,0,
     0,0,114,35,0,0,0,114,230,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,179,0,0,0,
-    220,3,0,0,115,2,0,0,0,0,1,122,25,95,78,97,
+    221,3,0,0,115,2,0,0,0,0,1,122,25,95,78,97,
     109,101,115,112,97,99,101,76,111,97,100,101,114,46,95,95,
     105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,2,
     0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
@@ -1814,21 +1814,21 @@ const unsigned char _Py_M__importlib_external[] = {
     41,62,41,2,114,47,0,0,0,114,105,0,0,0,41,2,
     114,164,0,0,0,114,184,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,11,109,111,100,117,108,
-    101,95,114,101,112,114,223,3,0,0,115,2,0,0,0,0,
+    101,95,114,101,112,114,224,3,0,0,115,2,0,0,0,0,
     7,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,
     100,101,114,46,109,111,100,117,108,101,95,114,101,112,114,99,
     2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,
     67,0,0,0,115,4,0,0,0,100,1,0,83,41,2,78,
     84,114,4,0,0,0,41,2,114,100,0,0,0,114,119,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,153,0,0,0,232,3,0,0,115,2,0,0,0,0,
+    0,114,153,0,0,0,233,3,0,0,115,2,0,0,0,0,
     1,122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,
     100,101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,
     0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
     0,0,0,115,4,0,0,0,100,1,0,83,41,2,78,114,
     30,0,0,0,114,4,0,0,0,41,2,114,100,0,0,0,
     114,119,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,196,0,0,0,235,3,0,0,115,2,0,
+    5,0,0,0,114,196,0,0,0,236,3,0,0,115,2,0,
     0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101,
     76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,
     101,99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,
@@ -1838,7 +1838,7 @@ const unsigned char _Py_M__importlib_external[] = {
     110,103,62,114,183,0,0,0,114,198,0,0,0,84,41,1,
     114,199,0,0,0,41,2,114,100,0,0,0,114,119,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,181,0,0,0,238,3,0,0,115,2,0,0,0,0,1,
+    114,181,0,0,0,239,3,0,0,115,2,0,0,0,0,1,
     122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
     101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,
     0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,
@@ -1847,14 +1847,14 @@ const unsigned char _Py_M__importlib_external[] = {
     99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114,
     101,97,116,105,111,110,46,78,114,4,0,0,0,41,2,114,
     100,0,0,0,114,158,0,0,0,114,4,0,0,0,114,4,
-    0,0,0,114,5,0,0,0,114,180,0,0,0,241,3,0,
+    0,0,0,114,5,0,0,0,114,180,0,0,0,242,3,0,
     0,115,0,0,0,0,122,30,95,78,97,109,101,115,112,97,
     99,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,
     109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,
     0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
     100,0,0,83,41,1,78,114,4,0,0,0,41,2,114,100,
     0,0,0,114,184,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,185,0,0,0,244,3,0,0,
+    0,0,114,5,0,0,0,114,185,0,0,0,245,3,0,0,
     115,2,0,0,0,0,1,122,28,95,78,97,109,101,115,112,
     97,99,101,76,111,97,100,101,114,46,101,120,101,99,95,109,
     111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0,
@@ -1873,7 +1873,7 @@ const unsigned char _Py_M__importlib_external[] = {
     41,4,114,114,0,0,0,114,129,0,0,0,114,226,0,0,
     0,114,186,0,0,0,41,2,114,100,0,0,0,114,119,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,187,0,0,0,247,3,0,0,115,6,0,0,0,0,
+    0,114,187,0,0,0,248,3,0,0,115,6,0,0,0,0,
     7,9,1,10,1,122,28,95,78,97,109,101,115,112,97,99,
     101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,
     117,108,101,78,41,12,114,105,0,0,0,114,104,0,0,0,
@@ -1881,7 +1881,7 @@ const unsigned char _Py_M__importlib_external[] = {
     242,0,0,0,114,153,0,0,0,114,196,0,0,0,114,181,
     0,0,0,114,180,0,0,0,114,185,0,0,0,114,187,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,
-    0,114,5,0,0,0,114,241,0,0,0,219,3,0,0,115,
+    0,114,5,0,0,0,114,241,0,0,0,220,3,0,0,115,
     16,0,0,0,12,1,12,3,18,9,12,3,12,3,12,3,
     12,3,12,3,114,241,0,0,0,99,0,0,0,0,0,0,
     0,0,0,0,0,0,5,0,0,0,64,0,0,0,115,160,
@@ -1919,7 +1919,7 @@ const unsigned char _Py_M__importlib_external[] = {
     99,104,101,218,6,118,97,108,117,101,115,114,108,0,0,0,
     114,244,0,0,0,41,2,114,164,0,0,0,218,6,102,105,
     110,100,101,114,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,244,0,0,0,9,4,0,0,115,6,0,0,
+    0,0,0,114,244,0,0,0,10,4,0,0,115,6,0,0,
     0,0,4,22,1,15,1,122,28,80,97,116,104,70,105,110,
     100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,
     97,99,104,101,115,99,2,0,0,0,0,0,0,0,3,0,
@@ -1944,7 +1944,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,61,0,0,0,114,118,0,0,0,114,99,0,0,0,
     41,3,114,164,0,0,0,114,35,0,0,0,90,4,104,111,
     111,107,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,218,11,95,112,97,116,104,95,104,111,111,107,115,17,4,
+    0,218,11,95,112,97,116,104,95,104,111,111,107,115,18,4,
     0,0,115,16,0,0,0,0,7,25,1,16,1,16,1,3,
     1,14,1,13,1,12,2,122,22,80,97,116,104,70,105,110,
     100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,99,
@@ -1977,7 +1977,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,41,3,114,164,0,0,0,114,35,0,0,0,114,
     247,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
     0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114,
-    116,101,114,95,99,97,99,104,101,34,4,0,0,115,22,0,
+    116,101,114,95,99,97,99,104,101,35,4,0,0,115,22,0,
     0,0,0,8,12,1,3,1,16,1,13,3,9,1,3,1,
     17,1,13,1,15,1,18,1,122,31,80,97,116,104,70,105,
     110,100,101,114,46,95,112,97,116,104,95,105,109,112,111,114,
@@ -1997,7 +1997,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,247,0,0,0,114,120,0,0,0,114,121,0,
     0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,16,95,108,101,103,97,99,121,95,
-    103,101,116,95,115,112,101,99,56,4,0,0,115,18,0,0,
+    103,101,116,95,115,112,101,99,57,4,0,0,115,18,0,0,
     0,0,4,15,1,24,2,15,1,6,1,12,1,16,1,18,
     1,9,1,122,27,80,97,116,104,70,105,110,100,101,114,46,
     95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,
@@ -2033,7 +2033,7 @@ const unsigned char _Py_M__importlib_external[] = {
     99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,247,
     0,0,0,114,158,0,0,0,114,121,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,9,95,103,
-    101,116,95,115,112,101,99,71,4,0,0,115,40,0,0,0,
+    101,116,95,115,112,101,99,72,4,0,0,115,40,0,0,0,
     0,5,6,1,13,1,21,1,3,1,15,1,12,1,15,1,
     21,2,18,1,12,1,3,1,15,1,4,1,9,1,12,1,
     12,5,17,2,18,1,9,1,122,20,80,97,116,104,70,105,
@@ -2060,7 +2060,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,152,0,0,0,114,224,0,0,0,41,6,114,164,0,
     0,0,114,119,0,0,0,114,35,0,0,0,114,174,0,0,
     0,114,158,0,0,0,114,254,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,103,
+    114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,104,
     4,0,0,115,26,0,0,0,0,4,12,1,9,1,21,1,
     12,1,4,1,15,1,9,1,6,3,9,1,24,1,4,2,
     7,2,122,20,80,97,116,104,70,105,110,100,101,114,46,102,
@@ -2083,7 +2083,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,120,0,0,0,41,4,114,164,0,0,0,114,119,0,
     0,0,114,35,0,0,0,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,176,0,0,0,
-    125,4,0,0,115,8,0,0,0,0,8,18,1,12,1,4,
+    126,4,0,0,115,8,0,0,0,0,8,18,1,12,1,4,
     1,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,
     110,100,95,109,111,100,117,108,101,41,12,114,105,0,0,0,
     114,104,0,0,0,114,106,0,0,0,114,107,0,0,0,114,
@@ -2091,7 +2091,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,114,252,0,0,0,114,255,0,0,0,114,175,0,
     0,0,114,176,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,243,0,0,0,
-    5,4,0,0,115,22,0,0,0,12,2,6,2,18,8,18,
+    6,4,0,0,115,22,0,0,0,12,2,6,2,18,8,18,
     17,18,22,18,15,3,1,18,31,3,1,21,21,3,1,114,
     243,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
     0,3,0,0,0,64,0,0,0,115,133,0,0,0,101,0,
@@ -2140,7 +2140,7 @@ const unsigned char _Py_M__importlib_external[] = {
     3,0,100,0,0,83,41,1,78,114,4,0,0,0,41,2,
     114,22,0,0,0,114,219,0,0,0,41,1,114,120,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,221,0,0,0,
-    154,4,0,0,115,2,0,0,0,6,0,122,38,70,105,108,
+    155,4,0,0,115,2,0,0,0,6,0,122,38,70,105,108,
     101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,
     46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,
     112,114,62,114,58,0,0,0,114,29,0,0,0,78,114,87,
@@ -2152,7 +2152,7 @@ const unsigned char _Py_M__importlib_external[] = {
     100,0,0,0,114,35,0,0,0,218,14,108,111,97,100,101,
     114,95,100,101,116,97,105,108,115,90,7,108,111,97,100,101,
     114,115,114,160,0,0,0,114,4,0,0,0,41,1,114,120,
-    0,0,0,114,5,0,0,0,114,179,0,0,0,148,4,0,
+    0,0,0,114,5,0,0,0,114,179,0,0,0,149,4,0,
     0,115,16,0,0,0,0,4,6,1,19,1,36,1,9,2,
     15,1,9,1,12,1,122,19,70,105,108,101,70,105,110,100,
     101,114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,
@@ -2163,7 +2163,7 @@ const unsigned char _Py_M__importlib_external[] = {
     116,105,109,101,46,114,29,0,0,0,78,114,87,0,0,0,
     41,1,114,2,1,0,0,41,1,114,100,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,114,244,0,
-    0,0,162,4,0,0,115,2,0,0,0,0,2,122,28,70,
+    0,0,163,4,0,0,115,2,0,0,0,0,2,122,28,70,
     105,108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,
     100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,
     0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,
@@ -2187,7 +2187,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,114,120,0,0,0,114,150,0,0,0,41,3,114,100,0,
     0,0,114,119,0,0,0,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,117,0,0,0,
-    168,4,0,0,115,8,0,0,0,0,7,15,1,12,1,10,
+    169,4,0,0,115,8,0,0,0,0,7,15,1,12,1,10,
     1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,105,
     110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,0,
     0,0,7,0,0,0,7,0,0,0,67,0,0,0,115,40,
@@ -2198,7 +2198,7 @@ const unsigned char _Py_M__importlib_external[] = {
     7,114,100,0,0,0,114,159,0,0,0,114,119,0,0,0,
     114,35,0,0,0,90,4,115,109,115,108,114,174,0,0,0,
     114,120,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,255,0,0,0,180,4,0,0,115,6,0,
+    5,0,0,0,114,255,0,0,0,181,4,0,0,115,6,0,
     0,0,0,1,15,1,18,1,122,20,70,105,108,101,70,105,
     110,100,101,114,46,95,103,101,116,95,115,112,101,99,78,99,
     3,0,0,0,0,0,0,0,14,0,0,0,15,0,0,0,
@@ -2262,7 +2262,7 @@ const unsigned char _Py_M__importlib_external[] = {
     110,105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,
     108,108,95,112,97,116,104,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,
-    185,4,0,0,115,70,0,0,0,0,3,6,1,19,1,3,
+    186,4,0,0,115,70,0,0,0,0,3,6,1,19,1,3,
     1,34,1,13,1,11,1,15,1,10,1,9,2,9,1,9,
     1,15,2,9,1,6,2,12,1,18,1,22,1,10,1,15,
     1,12,1,32,4,12,2,22,1,22,1,22,1,16,1,12,
@@ -2298,7 +2298,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,146,2,0,113,6,0,83,114,4,0,0,0,41,1,
     114,88,0,0,0,41,2,114,22,0,0,0,90,2,102,110,
     114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,250,
-    9,60,115,101,116,99,111,109,112,62,4,5,0,0,115,2,
+    9,60,115,101,116,99,111,109,112,62,5,5,0,0,115,2,
     0,0,0,9,0,122,41,70,105,108,101,70,105,110,100,101,
     114,46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,
     111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,
@@ -2315,7 +2315,7 @@ const unsigned char _Py_M__importlib_external[] = {
     95,99,111,110,116,101,110,116,115,114,239,0,0,0,114,98,
     0,0,0,114,231,0,0,0,114,219,0,0,0,90,8,110,
     101,119,95,110,97,109,101,114,4,0,0,0,114,4,0,0,
-    0,114,5,0,0,0,114,7,1,0,0,231,4,0,0,115,
+    0,114,5,0,0,0,114,7,1,0,0,232,4,0,0,115,
     34,0,0,0,0,2,9,1,3,1,31,1,22,3,11,3,
     18,1,18,7,9,1,13,1,24,1,6,1,27,2,6,1,
     17,1,9,1,18,1,122,22,70,105,108,101,70,105,110,100,
@@ -2354,7 +2354,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,0,0,41,1,114,35,0,0,0,41,2,114,164,0,0,
     0,114,6,1,0,0,114,4,0,0,0,114,5,0,0,0,
     218,24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,
-    70,105,108,101,70,105,110,100,101,114,16,5,0,0,115,6,
+    70,105,108,101,70,105,110,100,101,114,17,5,0,0,115,6,
     0,0,0,0,2,12,1,18,1,122,54,70,105,108,101,70,
     105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,
     60,108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,
@@ -2362,7 +2362,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,114,4,0,0,0,41,3,114,164,0,0,0,114,6,1,
     0,0,114,12,1,0,0,114,4,0,0,0,41,2,114,164,
     0,0,0,114,6,1,0,0,114,5,0,0,0,218,9,112,
-    97,116,104,95,104,111,111,107,6,5,0,0,115,4,0,0,
+    97,116,104,95,104,111,111,107,7,5,0,0,115,4,0,0,
     0,0,10,21,6,122,20,70,105,108,101,70,105,110,100,101,
     114,46,112,97,116,104,95,104,111,111,107,99,1,0,0,0,
     0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,
@@ -2371,7 +2371,7 @@ const unsigned char _Py_M__importlib_external[] = {
     110,100,101,114,40,123,33,114,125,41,41,2,114,47,0,0,
     0,114,35,0,0,0,41,1,114,100,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,114,238,0,0,
-    0,24,5,0,0,115,2,0,0,0,0,1,122,19,70,105,
+    0,25,5,0,0,115,2,0,0,0,0,1,122,19,70,105,
     108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,
     95,41,15,114,105,0,0,0,114,104,0,0,0,114,106,0,
     0,0,114,107,0,0,0,114,179,0,0,0,114,244,0,0,
@@ -2379,7 +2379,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,255,0,0,0,114,175,0,0,0,114,7,1,0,0,114,
     177,0,0,0,114,13,1,0,0,114,238,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,
-    0,0,114,0,1,0,0,139,4,0,0,115,20,0,0,0,
+    0,0,114,0,1,0,0,140,4,0,0,115,20,0,0,0,
     12,7,6,2,12,14,12,4,6,2,12,12,12,5,15,46,
     12,31,18,18,114,0,1,0,0,99,4,0,0,0,0,0,
     0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,195,
@@ -2405,7 +2405,7 @@ const unsigned char _Py_M__importlib_external[] = {
     104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,101,
     114,120,0,0,0,114,158,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,14,95,102,105,120,95,
-    117,112,95,109,111,100,117,108,101,30,5,0,0,115,34,0,
+    117,112,95,109,111,100,117,108,101,31,5,0,0,115,34,0,
     0,0,0,2,15,1,15,1,6,1,6,1,12,1,12,1,
     18,2,15,1,6,1,21,1,3,1,10,1,10,1,10,1,
     14,1,13,2,114,18,1,0,0,99,0,0,0,0,0,0,
@@ -2426,7 +2426,7 @@ const unsigned char _Py_M__importlib_external[] = {
     0,41,3,90,10,101,120,116,101,110,115,105,111,110,115,90,
     6,115,111,117,114,99,101,90,8,98,121,116,101,99,111,100,
     101,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,155,0,0,0,53,5,0,0,115,8,0,0,0,0,5,
+    114,155,0,0,0,54,5,0,0,115,8,0,0,0,0,5,
     18,1,12,1,12,1,114,155,0,0,0,99,1,0,0,0,
     0,0,0,0,12,0,0,0,12,0,0,0,67,0,0,0,
     115,70,2,0,0,124,0,0,97,0,0,116,0,0,106,1,
@@ -2488,7 +2488,7 @@ const unsigned char _Py_M__importlib_external[] = {
     83,41,2,114,29,0,0,0,78,41,1,114,31,0,0,0,
     41,2,114,22,0,0,0,114,77,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,221,0,0,0,
-    89,5,0,0,115,2,0,0,0,6,0,122,25,95,115,101,
+    90,5,0,0,115,2,0,0,0,6,0,122,25,95,115,101,
     116,117,112,46,60,108,111,99,97,108,115,62,46,60,103,101,
     110,101,120,112,114,62,114,59,0,0,0,122,30,105,109,112,
     111,114,116,108,105,98,32,114,101,113,117,105,114,101,115,32,
@@ -2518,7 +2518,7 @@ const unsigned char _Py_M__importlib_external[] = {
     90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,101,
     90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,6,
-    95,115,101,116,117,112,64,5,0,0,115,82,0,0,0,0,
+    95,115,101,116,117,112,65,5,0,0,115,82,0,0,0,0,
     8,6,1,9,1,9,3,13,1,13,1,15,1,18,2,13,
     1,20,3,33,1,19,2,31,1,10,1,15,1,13,1,4,
     2,3,1,15,1,5,1,13,1,12,2,12,1,16,1,16,
@@ -2544,7 +2544,7 @@ const unsigned char _Py_M__importlib_external[] = {
     114,212,0,0,0,41,2,114,26,1,0,0,90,17,115,117,
     112,112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,8,
-    95,105,110,115,116,97,108,108,132,5,0,0,115,16,0,0,
+    95,105,110,115,116,97,108,108,133,5,0,0,115,16,0,0,
     0,0,2,10,1,9,1,28,1,15,1,16,1,16,4,9,
     1,114,29,1,0,0,41,3,122,3,119,105,110,114,1,0,
     0,0,114,2,0,0,0,41,56,114,107,0,0,0,114,10,
@@ -2571,11 +2571,12 @@ const unsigned char _Py_M__importlib_external[] = {
     114,18,1,0,0,114,155,0,0,0,114,27,1,0,0,114,
     29,1,0,0,114,4,0,0,0,114,4,0,0,0,114,4,
     0,0,0,114,5,0,0,0,218,8,60,109,111,100,117,108,
-    101,62,8,0,0,0,115,98,0,0,0,6,17,6,3,12,
+    101,62,8,0,0,0,115,102,0,0,0,6,17,6,3,12,
     12,12,5,12,5,12,6,12,12,12,10,12,9,12,5,12,
-    7,15,22,15,111,22,1,18,2,6,1,6,2,9,2,9,
+    7,15,22,15,112,22,1,18,2,6,1,6,2,9,2,9,
     2,10,2,21,44,12,33,12,19,12,12,12,12,12,28,12,
     17,21,55,21,12,18,10,12,14,9,3,12,1,15,65,19,
     64,19,29,22,110,19,41,25,45,25,16,6,3,25,53,19,
-    57,19,42,19,134,19,147,15,23,12,11,12,68,
+    57,19,42,19,127,0,7,19,127,0,20,15,23,12,11,12,
+    68,
 };
index 4bf786e3ea3994fdab6c0c6c98e4da4aab2760eb..c33bf1a7e1438d60ac0cc1d5ccced7e6f5c0d350 100644 (file)
@@ -346,19 +346,19 @@ markblocks(unsigned char *code, Py_ssize_t len)
    single basic block.  All transformations keep the code size the same or
    smaller.  For those that reduce size, the gaps are initially filled with
    NOPs.  Later those NOPs are removed and the jump addresses retargeted in
-   a single pass.  Line numbering is adjusted accordingly. */
+   a single pass.  Code offset is adjusted accordingly. */
 
 PyObject *
 PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
-                PyObject *lineno_obj)
+                PyObject *lnotab_obj)
 {
     Py_ssize_t i, j, codelen;
     int nops, h, adj;
     int tgt, tgttgt, opcode;
     unsigned char *codestr = NULL;
-    unsigned char *lineno;
+    unsigned char *lnotab;
     int *addrmap = NULL;
-    int new_line, cum_orig_line, last_line;
+    int cum_orig_offset, last_offset;
     Py_ssize_t tabsiz;
     PyObject **const_stack = NULL;
     Py_ssize_t *load_const_stack = NULL;
@@ -371,12 +371,17 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
     if (PyErr_Occurred())
         goto exitError;
 
-    /* Bypass optimization when the lineno table is too complex */
-    assert(PyBytes_Check(lineno_obj));
-    lineno = (unsigned char*)PyBytes_AS_STRING(lineno_obj);
-    tabsiz = PyBytes_GET_SIZE(lineno_obj);
-    if (memchr(lineno, 255, tabsiz) != NULL)
+    /* Bypass optimization when the lnotab table is too complex */
+    assert(PyBytes_Check(lnotab_obj));
+    lnotab = (unsigned char*)PyBytes_AS_STRING(lnotab_obj);
+    tabsiz = PyBytes_GET_SIZE(lnotab_obj);
+    assert(tabsiz == 0 || Py_REFCNT(lnotab_obj) == 1);
+    if (memchr(lnotab, 255, tabsiz) != NULL) {
+        /* 255 value are used for multibyte bytecode instructions */
         goto exitUnchanged;
+    }
+    /* Note: -128 and 127 special values for line number delta are ok,
+       the peephole optimizer doesn't modify line numbers. */
 
     /* Avoid situations where jump retargeting could overflow */
     assert(PyBytes_Check(code));
@@ -663,21 +668,24 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
         }
     }
 
-    /* Fixup linenotab */
+    /* Fixup lnotab */
     for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
         assert(i - nops <= INT_MAX);
+        /* original code offset => new code offset */
         addrmap[i] = (int)(i - nops);
         if (codestr[i] == NOP)
             nops++;
     }
-    cum_orig_line = 0;
-    last_line = 0;
+    cum_orig_offset = 0;
+    last_offset = 0;
     for (i=0 ; i < tabsiz ; i+=2) {
-        cum_orig_line += lineno[i];
-        new_line = addrmap[cum_orig_line];
-        assert (new_line - last_line < 255);
-        lineno[i] =((unsigned char)(new_line - last_line));
-        last_line = new_line;
+        int offset_delta, new_offset;
+        cum_orig_offset += lnotab[i];
+        new_offset = addrmap[cum_orig_offset];
+        offset_delta = new_offset - last_offset;
+        assert(0 <= offset_delta && offset_delta <= 255);
+        lnotab[i] = (unsigned char)offset_delta;
+        last_offset = new_offset;
     }
 
     /* Remove NOPs and fixup jump targets */
@@ -727,12 +735,9 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
 
  exitUnchanged:
     CONST_STACK_DELETE();
-    if (blocks != NULL)
-        PyMem_Free(blocks);
-    if (addrmap != NULL)
-        PyMem_Free(addrmap);
-    if (codestr != NULL)
-        PyMem_Free(codestr);
+    PyMem_Free(blocks);
+    PyMem_Free(addrmap);
+    PyMem_Free(codestr);
     Py_XINCREF(code);
     return code;
 }